??xml version="1.0" encoding="utf-8" standalone="yes"?>国产亚洲色婷婷久久99精品91,亚洲成在人天堂在线,亚洲人成影院午夜网站http://www.tkk7.com/ltc603/category/14099.html<font size="3">学无止境</font> <br> <script type="text/javascript" src="http://wujunlove.googlepages.com/bigstaticeyes.js"></script>zh-cnWed, 28 Feb 2007 06:23:25 GMTWed, 28 Feb 2007 06:23:25 GMT60使用 Spring 更好地处?Struts 动作http://www.tkk7.com/ltc603/archive/2006/09/12/69163.html阿成阿成Tue, 12 Sep 2006 07:11:00 GMThttp://www.tkk7.com/ltc603/archive/2006/09/12/69163.htmlhttp://www.tkk7.com/ltc603/comments/69163.htmlhttp://www.tkk7.com/ltc603/archive/2006/09/12/69163.html#Feedback0http://www.tkk7.com/ltc603/comments/commentRss/69163.htmlhttp://www.tkk7.com/ltc603/services/trackbacks/69163.html阅读全文

阿成 2006-09-12 15:11 发表评论
]]>
Spring的事件处理机?/title><link>http://www.tkk7.com/ltc603/archive/2006/09/04/67502.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Mon, 04 Sep 2006 01:10:00 GMT</pubDate><guid>http://www.tkk7.com/ltc603/archive/2006/09/04/67502.html</guid><wfw:comment>http://www.tkk7.com/ltc603/comments/67502.html</wfw:comment><comments>http://www.tkk7.com/ltc603/archive/2006/09/04/67502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ltc603/comments/commentRss/67502.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ltc603/services/trackbacks/67502.html</trackback:ping><description><![CDATA[ <div class="xvbflff" id="msgcns!367370EB9A9B2807!129"> <div>Spring本n有ApplicationEvent和ApplicationListenerQApplicationContext可以发布ApplicationEventQ然后ApplicationListener监听eventq做出相应动作。但是这里的ApplicationEvent有个陷阱Q它的传播范围和当前的ApplicationContext的别有养I<font color="#ff0000"><strong>q不是系l中所有的ApplicationListener都可以收到所有的Event</strong></font>?/div> <div> </div> <div>假设当前pȝZ个典型的Struts+Spring+HibernatepȝQ那么系l中臛_会有两个ApplicationContext存在Q一个时root ApplicationContextQ一个是Servlet的ApplicationContext。root ApplicationContext中包含你所有在webApplicationContext.xml中定义的beanQServlet的ApplicationContext则包含有所有在action-servlet.xml中定义的beanQ?font color="#ff0000"><strong>需要注意的是root context中的bean是无法看到servlet context中的bean?/strong></font>?strong><font color="#ff0000">而在servlet context中的ApplicationListener也无法收到root context发布的ApplicationEvent</font></strong>?br /><br /><a >http://sweetriver.spaces.live.com/blog/cns!367370EB9A9B2807!129.entry</a></div> </div> <img src ="http://www.tkk7.com/ltc603/aggbug/67502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ltc603/" target="_blank">阿成</a> 2006-09-04 09:10 <a href="http://www.tkk7.com/ltc603/archive/2006/09/04/67502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>化Springhttp://www.tkk7.com/ltc603/archive/2006/08/29/66344.html阿成阿成Tue, 29 Aug 2006 00:58:00 GMThttp://www.tkk7.com/ltc603/archive/2006/08/29/66344.htmlhttp://www.tkk7.com/ltc603/comments/66344.htmlhttp://www.tkk7.com/ltc603/archive/2006/08/29/66344.html#Feedback0http://www.tkk7.com/ltc603/comments/commentRss/66344.htmlhttp://www.tkk7.com/ltc603/services/trackbacks/66344.html 化Spring(1)--配置文g

化Spring(2)--Model?/font>

化Spring(3)--Controller?/font>

化Spring(4)--View?/font>

阿成 2006-08-29 08:58 发表评论
]]>
d配置文g的几U方?QZTQzhaijianhui的blogQ?/title><link>http://www.tkk7.com/ltc603/archive/2006/06/08/51260.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Thu, 08 Jun 2006 01:12:00 GMT</pubDate><guid>http://www.tkk7.com/ltc603/archive/2006/06/08/51260.html</guid><wfw:comment>http://www.tkk7.com/ltc603/comments/51260.html</wfw:comment><comments>http://www.tkk7.com/ltc603/archive/2006/06/08/51260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ltc603/comments/commentRss/51260.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ltc603/services/trackbacks/51260.html</trackback:ping><description><![CDATA[ <div id="bdrxdvp" class="postText">在读spring in aciton Ӟ他用的BeanFactory factory = new XmlBeanFactory(new FileInputStream("hello.xml"));<br />可是现在的用?.2.6版本的构造器(XmlBeanFactory)只能接收Resource接口了,所以调不出来是正常的事情,假设现在有一个文件hello.xml<br />dҎ<br /><br />1:ApplicationContext cx=new FileSystemXmlApplicationContext("hello.xml");//指定的\径去找文?br />2:ApplicationContext factory = new ClassPathXmlApplicationContext("hello.xml");//q会在classpathL<br />3:Resource fa = new FileSystemResource("hello.xml");<br />   BeanFactory factory=new XmlBeanFactory(fa);<br />4:q个要设制classpath了,ȝ<br />  Resource res = new ClassPathResource("com/springinaction/chapter01/hello/hello.xml");<br />  BeanFactory factory=new XmlBeanFactory(res);<br />好了Q用了上面那U方法都可以调用getBean("your bean name")了,<br />eg: BeanFactory factory=new XmlBeanFactory(fa);<br />      hello he=(hello)factory.getBean("hello");<br />              he.getHello(); </div> <img src ="http://www.tkk7.com/ltc603/aggbug/51260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ltc603/" target="_blank">阿成</a> 2006-06-08 09:12 <a href="http://www.tkk7.com/ltc603/archive/2006/06/08/51260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 入门实例http://www.tkk7.com/ltc603/archive/2006/04/18/41693.html阿成阿成Tue, 18 Apr 2006 09:28:00 GMThttp://www.tkk7.com/ltc603/archive/2006/04/18/41693.htmlhttp://www.tkk7.com/ltc603/comments/41693.htmlhttp://www.tkk7.com/ltc603/archive/2006/04/18/41693.html#Feedback1http://www.tkk7.com/ltc603/comments/commentRss/41693.htmlhttp://www.tkk7.com/ltc603/services/trackbacks/41693.htmlSpring是一个非怼U的轻量框架Q通过Spring的IoC容器Q我们的x点便攑ֈ了需要实现的业务逻辑上。对AOP的支持则能让我们动态增Z务方法。编写普通的业务逻辑Bean是非常容易而且易于试的,因ؓ它能qJ2EE容器Q如ServletQJSP环境Q单独进行单元测试。最后的一步便是在Spring框架中将q些业务Bean以XML配置文g的方式组lv来,它们按照我们预定的目标正常工作了!非常ҎQ?/p>

本文给Z个基本的Spring入门CZQƈ演示如何使用Spring的AOP复杂的业务逻辑分离到每个方面中?/p>

1Q开发环境配|?br />2Q编写Bean接口及其实现
3Q在Spring中配|Beanq获得Bean的实?br />4Q编写Advisor以增强ServiceBean
5Qȝ

1Q开发环境配|?/h3>

首先Q需要正配|Java环境。推荐安装JDK1.4.2Qƈ正确配置环境变量Q?/p>

JAVA_HOME=<JDK安装目录>
CLASSPATH=.
Path=%JAVA_HOME%\bin;…?/p>

我们用免费的Eclipse 3.1作ؓIDE。新Z个Java ProjectQ将Spring的发布包spring.jar以及commons-logging-1.0.4.jar复制到Project目录下,q在Project > Properties中配|好Java Build PathQ?/p>

2Q编写Bean接口及其实现

我们实现一个管理用L业务Bean。首先定义一个ServiceBean接口Q声明一些业务方法:

				/**
 * Copyright_2006, Liao Xuefeng
 * Created on 2006-3-9
 * For more information, please visit:
http://www.crackj2ee.com
 */
package com.crackj2ee.example.spring;
				/**
 * Interface of service facade.
 *
 * @author Xuefeng
 */
public interface ServiceBean {
    void addUser(String username, String password);
    void deleteUser(String username);
    boolean findUser(String username);
    String getPassword(String username);
}

然后在MyServiceBean中实现接口:

				/**
 * Copyright_2006, Liao Xuefeng
 * Created on 2006-3-9
 *
 * For more information, please visit:
http://www.crackj2ee.com
 */
package com.crackj2ee.example.spring;
				import java.util.*;
		
				public class MyServiceBean implements ServiceBean {
		
				    private String dir;
    private Map map = new HashMap();
				    public void setUserDir(String dir) {
        this.dir = dir;
        System.out.println("Set user dir to: " + dir);
    }
				    public void addUser(String username, String password) {
        if(!map.containsKey(username))
            map.put(username, password);
        else
            throw new RuntimeException("User already exist.");
    }
				    public void deleteUser(String username) {
        if(map.remove(username)==null)
            throw new RuntimeException("User not exist.");
    }
				    public boolean findUser(String username) {
        return map.containsKey(username);
    }
				    public String getPassword(String username) {
        return (String)map.get(username);
    }
}

Z化逻辑Q我们用一个Map保存用户名和口o?/p>

现在Q我们已l有了一个业务Bean。要试它非常容易,因ؓ到目前ؓ止,我们q没有涉及到Spring容器Q也没有涉及CQ何Web容器Q假定这是一个Web应用E序关于用户理的业务BeanQ。完全可以直接进行Unit试Q或者,单地写个mainҎ试Q?/p>

				/**
 * Copyright_2006, Liao Xuefeng
 * Created on 2006-3-9
 * For more information, please visit:
http://www.crackj2ee.com
 */
package com.crackj2ee.example.spring;
				public class Main {
		
				    public static void main(String[] args) throws Exception {
        ServiceBean service = new MyServiceBean();
        service.addUser("bill", "hello");
        service.addUser("tom", "goodbye");
        service.addUser("tracy", "morning");
        System.out.println("tom's password is: " + service.getPassword("tom"));
        if(service.findUser("tom")) {
            service.deleteUser("tom");
        }
    }
}

执行l果Q?br />

3Q在Spring中配|Beanq获得Bean的实?/h3>

我们已经在一个mainҎ中实C业务Q不q,对象的生命周期交给容器理是更好的办法Q我们就不必为初始化对象和销毁对象进行硬~码Q从而获得更大的灉|性和可测试性?/p>

惌把ServiceBean交给Spring来管理,我们需要一个XML配置文g。新Z个beans.xmlQ放到src目录下,保在classpath中能扑ֈ此配|文Ӟ输入以下内容Q?/p>

				<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"
http://www.springframework.org/dtd/spring-beans.dtd ">
<beans>
    <bean id="service" class="com.crackj2ee.example.spring.MyServiceBean" />
</beans>

以上XML声明了一个id为service的BeanQ默认地QSpring为每个声明的Bean仅创Z个实例,q过id来引用这个Bean。下面,我们修改mainҎQ让Spring来管理业务BeanQ?/p>

				/**
 * Copyright_2006, Liao Xuefeng
 * Created on 2006-3-9
 * For more information, please visit:
http://www.crackj2ee.com
 */
package com.crackj2ee.example.spring;
				import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
				public class Main {
		
				    public static void main(String[] args) throws Exception {
        // init factory:
        XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
        // use service bean:
        ServiceBean service = (ServiceBean)factory.getBean("service");
        service.addUser("bill", "hello");
        service.addUser("tom", "goodbye");
        service.addUser("tracy", "morning");
        System.out.println("tom's password is \"" + service.getPassword("tom") + "\"");
        if(service.findUser("tom")) {
            service.deleteUser("tom");
        }
        // close factory:
        factory.destroySingletons();
    }
}

执行l果Q?br /> 

׃我们要通过mainҎ启动Spring环境Q因此,首先需要初始化一个BeanFactory。红色部分是初始化Spring的BeanFactory的典型代码,只需要保证beans.xml文g位于classpath中?/p>

然后Q在BeanFactory中通过id查找Q即可获得相应的Bean的实例,q将光当转型为合适的接口?/p>

接着Q实Cpd业务操作Q在应用E序l束前,让Spring销毁所有的Bean实例?/p>

Ҏ上一个版本的MainQ可以看出,最大的变化是不需要自q理Bean的生命周期。另一个好处是在不更改实现cȝ前提下,动态地为应用程序增加功能?/p>

4Q编写Advisor以增强ServiceBean

所谓AOPx分散在各个Ҏ处的公共代码提取C处,q过cM拦截器的机制实现代码的动态织入。可以简单地惌成,在某个方法的调用前、返回前、调用后和抛出异常时Q动态插入自q代码。在弄清楚Pointcut、Advice之类的术语前Q不如编写一个最单的AOP应用来体验一下?/p>

考虑一下通常的Web应用E序都会有日志记录,我们来编写一个LogAdvisorQ对每个业务Ҏ调用前都作一个记录:

				/**
 * Copyright_2006, Liao Xuefeng
 * Created on 2006-3-9
 * For more information, please visit:
http://www.crackj2ee.com
 */
package com.crackj2ee.example.spring;
				import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
				public class LogAdvisor implements MethodBeforeAdvice {
    public void before(Method m, Object[] args, Object target) throws Throwable {
        System.out.println("[Log] " + target.getClass().getName() + "." + m.getName() + "()");
    }
}

然后Q修改beans.xmlQ?/p>

				<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"
http://www.springframework.org/dtd/spring-beans.dtd ">
				<beans>
    <bean id="serviceTarget" class="com.crackj2ee.example.spring.MyServiceBean" />
				    <bean id="logAdvisor" class="com.crackj2ee.example.spring.LogAdvisor" />
		
				    <bean id="service" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="proxyInterfaces"><value>com.crackj2ee.example.spring.ServiceBean</value></property>
        <property name="target"><ref local="serviceTarget"/></property>
        <property name="interceptorNames">
            <list>
                <value>logAdvisor</value>
            </list>
        </property>
    </bean>
</beans>

注意观察修改后的配置文gQ我们用了一个ProxyFactoryBean作ؓservice来与客户端打交道Q而真正的业务Bean即MyServiceBean被声明ؓserviceTargetq作为参数对象传递给ProxyFactoryBeanQproxyInterfaces指定了返回的接口cd。对于客L而言Q将感觉不出M变化Q但却动态加入了LogAdvisorQ关pd下:
 

q行l果如下Q可以很Ҏ看到调用了哪些方法:
 

要截h定的某些Ҏ也是可以的。下面的例子修改getPassword()Ҏ的返回|

				/**
 * Copyright_2006, Liao Xuefeng
 * Created on 2006-3-9
 * For more information, please visit:
http://www.crackj2ee.com
 */
package com.crackj2ee.example.spring;
				import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
				public class PasswordAdvisor implements MethodInterceptor {
    public Object invoke(MethodInvocation invocation) throws Throwable {
        Object ret = invocation.proceed();
        if(ret==null)
            return null;
        String password = (String)ret;
        StringBuffer encrypt = new StringBuffer(password.length());
        for(int i=0; i<password.length(); i++)
            encrypt.append('*');
        return encrypt.toString();
    }
}

q个PasswordAdvisor截获ServiceBean的getPassword()Ҏ的返回|q将其改?***"。l修改beans.xmlQ?/p>

				<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"
http://www.springframework.org/dtd/spring-beans.dtd ">
<beans>
    <bean id="serviceTarget" class="com.crackj2ee.example.spring.MyServiceBean" />
				    <bean id="logAdvisor" class="com.crackj2ee.example.spring.LogAdvisor" />
		
				    <bean id="passwordAdvisorTarget" class="com.crackj2ee.example.spring.PasswordAdvisor" />
		
				    <bean id="passwordAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice">
            <ref local="passwordAdvisorTarget"/>
        </property>
        <property name="patterns">
            <list>
                <value>.*getPassword</value>
            </list>
        </property>
    </bean>
				    <bean id="service" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="proxyInterfaces"><value>com.crackj2ee.example.spring.ServiceBean</value></property>
        <property name="target"><ref local="serviceTarget"/></property>
        <property name="interceptorNames">
            <list>
                <value>logAdvisor</value>
                <value>passwordAdvisor</value>
            </list>
        </property>
    </bean>
</beans>

利用Spring提供的一个RegexMethodPointcutAdvisor可以非常Ҏ地指定要截获的方法。运行结果如下,可以看到q回l果变ؓ"******"Q?br /> 

q需要l增强ServiceBeanQ我们编写一个ExceptionAdvisorQ在业务Ҏ抛出异常时能做一些处理:

				/**
 * Copyright_2006, Liao Xuefeng
 * Created on 2006-3-9
 * For more information, please visit:
http://www.crackj2ee.com
 */
package com.crackj2ee.example.spring;
				import org.springframework.aop.ThrowsAdvice;
		
				public class ExceptionAdvisor implements ThrowsAdvice {
    public void afterThrowing(RuntimeException re) throws Throwable {
        System.out.println("[Exception] " + re.getMessage());
    }
}

此Adviced到beans.xml中,然后在业务Bean中删除一个不存在的用P故意抛出异常Q?/p>

				service.deleteUser("not-exist");
		

再次q行Q注意到ExceptionAdvisor记录下了异常Q?br /> 

5Qȝ

利用Spring非常强大的IoC容器和AOP功能Q我们能实现非常灉|的应用,让Spring容器理业务对象的生命周期,利用AOP增强功能Q却不媄响业务接口,从而避免更改客L代码?/p>

Z实现q一目标Q必dl牢讎ͼ面向接口~程。而Spring默认的AOP代理也是通过Java的代理接口实现的。虽然Spring也可以用CGLIB实现Ҏ通类的代理,但是Q业务对象只要没有接口,׃变得难以扩展、维护和试?/p>

可以从此处下载完整的Eclipse工程Q?br />http://www.crackj2ee.com/Article/UploadFiles/200604/SpringBasic.rar



阿成 2006-04-18 17:28 发表评论
]]>
Spring学习W记(一)依赖注入http://www.tkk7.com/ltc603/archive/2006/03/23/37037.html阿成阿成Thu, 23 Mar 2006 05:46:00 GMThttp://www.tkk7.com/ltc603/archive/2006/03/23/37037.htmlhttp://www.tkk7.com/ltc603/comments/37037.htmlhttp://www.tkk7.com/ltc603/archive/2006/03/23/37037.html#Feedback0http://www.tkk7.com/ltc603/comments/commentRss/37037.htmlhttp://www.tkk7.com/ltc603/services/trackbacks/37037.htmlSpring学习W记(一)依赖注入
 
依赖注入——是Spring最灵魂的设计思想Q有Z叫做控制反{?/div>
1、不是依赖注入QDI:Dependency InjectionQ还是控制反转(IoC:Inversion of ControlQ它的思想是:控制权由应用代码中{C外部
容器Q即lg之间的依赖关pȝ容器在运行期军_QŞ象的来说Q即由容器动态的某U依赖关pL入到lg之中?/div>
2、依赖注入的目标qY件系l带来更多的功能Q而是Z提升lg重用的概率,带来灉|性?/div>
3、D个例子来说明q个问题?/div>
我曾看到夏昕的《Spring 开发指南》,上面明这个思想QD了电脑、USB盘和U盘的例子Q感觉还是不太脓切,今天想了个自认ؓ比较?/div>
理解的例子:
有两U变形金刚的玩具Q?br />一U是固定的,我把它比作原来那U控制权由应用代码写ȝE序
一U可以拆开重新装配的,我把它比作用了依赖注入设计思想的程?/div>
变Ş金刚的各个部件就象程序的各个lg?br />变Ş金刚的厂Ӟ相对它来说是内部的。就象程序的代码
变Ş金刚的玩Ӟ相对它来说是外部的。就象程序的容器
大家试想一下,固定变Ş金刚的控制权是不是厂家决定的Q外部无能ؓ?br />而可拆卸的变形金刚的控制权{Ud了外部的玩家Q玩家在玩之前可以重新决定各个组件的q接关系
而这U组件的q接图是不是也很像依赖注入思想里的配置文g?/div>
大家再从q个例子分析一下依赖注入的目标?/div>
1)功能变化有限Q你变Ş金刚设计的再好,可变换的东西也不q相似的几种?br />2)真正的目的是提升lg重用的概率,带来灉|性?br />引用地址 http://spaces.msn.com/pococoon/blog/cns!D25B6032F7AD1992!195.entry


阿成 2006-03-23 13:46 发表评论
]]>Spring学习W记(?Bean http://www.tkk7.com/ltc603/archive/2006/03/23/37035.html阿成阿成Thu, 23 Mar 2006 05:42:00 GMThttp://www.tkk7.com/ltc603/archive/2006/03/23/37035.htmlhttp://www.tkk7.com/ltc603/comments/37035.htmlhttp://www.tkk7.com/ltc603/archive/2006/03/23/37035.html#Feedback0http://www.tkk7.com/ltc603/comments/commentRss/37035.htmlhttp://www.tkk7.com/ltc603/services/trackbacks/37035.htmlSpring使用BeanFactory模式来管理Bean,但Spring中提到的Bean不是标准的意义上的JavaBean(仅包含一个默认的构造函敎ͼ在属性后面定义相对应的setter和getterҎ),而是M你想让它理的类Q比如连接池、甚至BeanFactory本n?

一)Bean的设计常用下面几U模?

1、标准Bean:

使用默认的构造函数和Zsetter、getterҎ的依赖注?

BeancM码:

java代码: 

public class ExampleBean {
    private BeanOne beanOne;
    private BeanTwo beanTwo;
    privateint count;
   
    publicvoid setBeanOne(BeanOne beanOne){
        this.beanOne = beanOne;
    }
   
    publicvoid setBeanTwo(BeanTwo beanTwo){
        this.beanTwo = beanTwo;
    }
   
    publicvoid setCount(int count){
        this.count = count;
    }   
}


在配|文件中定义Q?

java代码: 

<bean id="exampleBean" class="examples.ExampleBean">
    <property name="beanOne"><ref bean="bean1"/></property>
    <property name="beanTwo"><ref bean="bean2"/></property>
    <property name="count"><value>1</value></property>
</bean>

<bean id="bean1" class="examples.BeanOne"/>
<bean id="bean2" class="examples.BeanTwo"/>


2、构造函数模?

自定义的构造函敎ͼZ构造函数参数的依赖注射

BeancM码:

java代码: 

public class ExampleBean {
    private BeanOne beanOne;
    private BeanTwo beanTwo;
    privateint count;
   
    public ExampleBean(BeanOne beanOne, BeanTwo beanTwo, int count){
        this.beanOne = beanOne;
        this.beanTwo = beanTwo;
        this.count = count;
    }
}


在配|文件中定义Q?
java代码: 


<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg><ref bean="bean1"/></constructor-arg>
    <constructor-arg><ref bean="bean2"/></constructor-arg>
    <constructor-arg><value>1</value></constructor-arg>
</bean>

<bean id="bean1" class="examples.BeanOne"/>
<bean id="bean2" class="examples.BeanTwo"/>


3、静态工厂方法模?

静态工厂方法必Lstatic的,ZҎ参数的依赖注?

BeancM码:

java代码: 

public class ExampleBean {
    private BeanOne beanOne;
    private BeanTwo beanTwo;
    privateint count;
    //构造函数私?/span>
    private ExampleBean(BeanOne beanOne, BeanTwo beanTwo, int count){
        this.beanOne = beanOne;
        this.beanTwo = beanTwo;
        this.count = count;
    }
    //对外提供静态的Ҏ
    publicstatic ExampleBean createInstance(BeanOne beanOne, BeanTwo beanTwo, int count){
        ExampleBean eb = new ExampleBean(beanOne,beanTwo,count);
        return eb;
    }
}


在配|文件中定义Q?

java代码: 

<bean id="exampleBean" class="examples.ExampleBean" factory-method="createInstance">
    <constructor-arg><ref bean="bean1"/></constructor-arg>
    <constructor-arg><ref bean="bean2"/></constructor-arg>
    <constructor-arg><value>1</value></constructor-arg>
</bean>

<bean id="bean1" class="examples.BeanOne"/>
<bean id="bean2" class="examples.BeanTwo"/>



3、实例工厂方法模?

调用一个已存在的beanQ这个bean应该是工厂类型)的工厂方法来创徏新的beanQ基于方法参数的依赖注射

该模式没有Beanc;

在配|文件中定义Q?

java代码: 

<bean id="exampleBean"
      factory-bean="myFactoryBean"
      factory-method="createInstance"/>

<bean id="myFactoryBean" class="examples.ExampleBean" factory-method="createInstance">
    <constructor-arg><ref bean="bean1"/></constructor-arg>
    <constructor-arg><ref bean="bean2"/></constructor-arg>
    <constructor-arg><value>1</value></constructor-arg>
</bean>

<bean id="bean1" class="examples.BeanOne"/>
<bean id="bean2" class="examples.BeanTwo"/>


?Bean其它参数的配|?

一个常用Bean的配|参数和解释

<bean id="" ——标志符,用它引用唯一的Bean
class="" ——该Bean对应的类Q前面说到实例工厂方法模式创建的Bean没有c?
singleton="" ——gؓtrue或false,标识该Bean是否为单实例模式Q如果ؓfalse则对q个bean
的每ơ请求都会创Z个新的bean实例
init-method="" ——向应用层返回引用前执行的初始化Ҏ
destroy-method="" ——该Bean的销毁方?
depends-on=""> ——在Bean加蝲前,首先加蝲的指定资?
....
</bean>

?property(或constructor-arg元素)的配|?

1、用字符串Ş式指定常见类型的属性或参数的value|JavaBean的PropertyEditor负责cd转化如:

java代码: 

<property name="driverClassName">
    <value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
    <value>jdbc:mysql://localhost:3306/mydb</value>
</property>


2、注意null?"(IZ)的区别,如:
java代码: 


<property name="email"><value></value></property>
<property name="email"><null/></property>



3、list、set、map、以?props 元素用来定义和设|Java对应cdList、Set、Map、和 Properties Q如Q?

java代码: 


<property name="school">
   <props>
      <prop key="school01">The xi'an technology university</prop>
      <prop key="school02">The BeiJing university</prop>
   </props>
</property>

<property name="someList">
   <list>
      <value>a list element followed by a reference</value>
      <ref bean="myDataSource"/>
   </list>
</property>

<property name="someMap">
   <map>
      <entry key="001">
         <value>just some string</value>
      </entry>
      <entry key="yup a ref">
         <ref bean="myDataSource"/>
      </entry>
   </map>
</property>
       
<property name="someSet">
      <set>
         <value>just some string</value>
         <ref bean="myDataSource"/>
      </set>
</property>


4、内部Bean和ref元素引用容器理的其他bean

一个内部Bean的例子:
java代码: 


<bean id="dep" class="com.bean.Conpany">
    <property name="manager">
        <bean class="com.bean.Person">
            <property name="name"><value>Tony</value></property>
            <property name="age"><value>51</value></property>
        </bean>
    </property>
</bean>


ref元素引用的例子:
java代码: 


<bean id="person_manger" class="com.bean.Person">
    <property name="name"><value>Tony</value></property>
    <property name="age"><value>51</value></property>
</bean>

<bean id="dep" class="com.bean.Conpany">
    <property name="manager">
        <idref bean="person_manager"/>
    </property>
</bean>



注:元素引用可以是下面三U权限:
1)<idref bean="person_manager"/>
引用的Bean可以在同一个BeanFactory/ApplicationContextQ无论是否在同一个XML文g中)中,也可以在父BeanFactory/ApplicationContext?
2)<idref local="person_manager"/>
引用的bean在同一个XML文g?
3)<idref parent="person_manager"/>
引用的bean必须在当前BeanFactoryQApplicationContextQ的父BeanFactoryQApplicationContextQ中.
有新文章旉: 2006-3-23 12:58:26    标题: Spring学习W记(?Bean引用回复这个帖子加入我的Blog

Spring使用BeanFactory模式来管理Bean,但Spring中提到的Bean不是标准的意义上的JavaBean(仅包含一个默认的构造函敎ͼ在属性后面定义相对应的setter和getterҎ),而是M你想让它理的类Q比如连接池、甚至BeanFactory本n?

一)Bean的设计常用下面几U模?

1、标准Bean:

使用默认的构造函数和Zsetter、getterҎ的依赖注?

BeancM码:

java代码: 

publicclass ExampleBean {
    private BeanOne beanOne;
    private BeanTwo beanTwo;
    privateint count;
   
    publicvoid setBeanOne(BeanOne beanOne){
        this.beanOne = beanOne;
    }
   
    publicvoid setBeanTwo(BeanTwo beanTwo){
        this.beanTwo = beanTwo;
    }
   
    publicvoid setCount(int count){
        this.count = count;
    }   
}


在配|文件中定义Q?

java代码: 

<bean id="exampleBean" class="examples.ExampleBean">
    <property name="beanOne"><ref bean="bean1"/></property>
    <property name="beanTwo"><ref bean="bean2"/></property>
    <property name="count"><value>1</value></property>
</bean>

<bean id="bean1" class="examples.BeanOne"/>
<bean id="bean2" class="examples.BeanTwo"/>


2、构造函数模?

自定义的构造函敎ͼZ构造函数参数的依赖注射

BeancM码:

java代码: 

publicclass ExampleBean {
    private BeanOne beanOne;
    private BeanTwo beanTwo;
    privateint count;
   
    public ExampleBean(BeanOne beanOne, BeanTwo beanTwo, int count){
        this.beanOne = beanOne;
        this.beanTwo = beanTwo;
        this.count = count;
    }
}


在配|文件中定义Q?
java代码: 


<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg><ref bean="bean1"/></constructor-arg>
    <constructor-arg><ref bean="bean2"/></constructor-arg>
    <constructor-arg><value>1</value></constructor-arg>
</bean>

<bean id="bean1" class="examples.BeanOne"/>
<bean id="bean2" class="examples.BeanTwo"/>


3、静态工厂方法模?

静态工厂方法必Lstatic的,ZҎ参数的依赖注?

BeancM码:

java代码: 

publicclass ExampleBean {
    private BeanOne beanOne;
    private BeanTwo beanTwo;
    privateint count;
    //构造函数私?/span>
    private ExampleBean(BeanOne beanOne, BeanTwo beanTwo, int count){
        this.beanOne = beanOne;
        this.beanTwo = beanTwo;
        this.count = count;
    }
    //对外提供静态的Ҏ
    publicstatic ExampleBean createInstance(BeanOne beanOne, BeanTwo beanTwo, int count){
        ExampleBean eb = new ExampleBean(beanOne,beanTwo,count);
        return eb;
    }
}


在配|文件中定义Q?

java代码: 

<bean id="exampleBean" class="examples.ExampleBean" factory-method="createInstance">
    <constructor-arg><ref bean="bean1"/></constructor-arg>
    <constructor-arg><ref bean="bean2"/></constructor-arg>
    <constructor-arg><value>1</value></constructor-arg>
</bean>

<bean id="bean1" class="examples.BeanOne"/>
<bean id="bean2" class="examples.BeanTwo"/>



3、实例工厂方法模?

调用一个已存在的beanQ这个bean应该是工厂类型)的工厂方法来创徏新的beanQ基于方法参数的依赖注射

该模式没有Beanc;

在配|文件中定义Q?

java代码: 

<bean id="exampleBean"
      factory-bean="myFactoryBean"
      factory-method="createInstance"/>

<bean id="myFactoryBean" class="examples.ExampleBean" factory-method="createInstance">
    <constructor-arg><ref bean="bean1"/></constructor-arg>
    <constructor-arg><ref bean="bean2"/></constructor-arg>
    <constructor-arg><value>1</value></constructor-arg>
</bean>

<bean id="bean1" class="examples.BeanOne"/>
<bean id="bean2" class="examples.BeanTwo"/>


?Bean其它参数的配|?

一个常用Bean的配|参数和解释

<bean id="" ——标志符,用它引用唯一的Bean
class="" ——该Bean对应的类Q前面说到实例工厂方法模式创建的Bean没有c?
singleton="" ——gؓtrue或false,标识该Bean是否为单实例模式Q如果ؓfalse则对q个bean
的每ơ请求都会创Z个新的bean实例
init-method="" ——向应用层返回引用前执行的初始化Ҏ
destroy-method="" ——该Bean的销毁方?
depends-on=""> ——在Bean加蝲前,首先加蝲的指定资?
....
</bean>

?property(或constructor-arg元素)的配|?

1、用字符串Ş式指定常见类型的属性或参数的value|JavaBean的PropertyEditor负责cd转化如:

java代码: 

<property name="driverClassName">
    <value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
    <value>jdbc:mysql://localhost:3306/mydb</value>
</property>


2、注意null?"(IZ)的区别,如:
java代码: 


<property name="email"><value></value></property>
<property name="email"><null/></property>



3、list、set、map、以?props 元素用来定义和设|Java对应cdList、Set、Map、和 Properties Q如Q?

java代码: 


<property name="school">
   <props>
      <prop key="school01">The xi'an technology university</prop>
      <prop key="school02">The BeiJing university</prop>
   </props>
</property>

<property name="someList">
   <list>
      <value>a list element followed by a reference</value>
      <ref bean="myDataSource"/>
   </list>
</property>

<property name="someMap">
   <map>
      <entry key="001">
         <value>just some string</value>
      </entry>
      <entry key="yup a ref">
         <ref bean="myDataSource"/>
      </entry>
   </map>
</property>
       
<property name="someSet">
      <set>
         <value>just some string</value>
         <ref bean="myDataSource"/>
      </set>
</property>


4、内部Bean和ref元素引用容器理的其他bean

一个内部Bean的例子:
java代码: 


<bean id="dep" class="com.bean.Conpany">
    <property name="manager">
        <bean class="com.bean.Person">
            <property name="name"><value>Tony</value></property>
            <property name="age"><value>51</value></property>
        </bean>
    </property>
</bean>


ref元素引用的例子:
java代码: 


<bean id="person_manger" class="com.bean.Person">
    <property name="name"><value>Tony</value></property>
    <property name="age"><value>51</value></property>
</bean>

<bean id="dep" class="com.bean.Conpany">
    <property name="manager">
        <idref bean="person_manager"/>
    </property>
</bean>



注:元素引用可以是下面三U权限:
1)<idref bean="person_manager"/>
引用的Bean可以在同一个BeanFactory/ApplicationContextQ无论是否在同一个XML文g中)中,也可以在父BeanFactory/ApplicationContext?
2)<idref local="person_manager"/>
引用的bean在同一个XML文g?
3)<idref parent="person_manager"/>
引用的bean必须在当前BeanFactoryQApplicationContextQ的父BeanFactoryQApplicationContextQ中

引用注明出处Q?a class="postlink" target="_blank">http://spaces.msn.com/pococoon/blog/cns!D25B6032F7AD1992!193.entry




阿成 2006-03-23 13:42 发表评论
]]>
Spring AOP中文教程http://www.tkk7.com/ltc603/archive/2006/03/09/34552.html阿成阿成Thu, 09 Mar 2006 13:32:00 GMThttp://www.tkk7.com/ltc603/archive/2006/03/09/34552.htmlhttp://www.tkk7.com/ltc603/comments/34552.htmlhttp://www.tkk7.com/ltc603/archive/2006/03/09/34552.html#Feedback0http://www.tkk7.com/ltc603/comments/commentRss/34552.htmlhttp://www.tkk7.com/ltc603/services/trackbacks/34552.html q是在网上发现的一关于Spring AOP~程的教E,dq篇文章后,Spring AOP不再难以理解Q因此我把它译成中文Q推荐给Spring AOP的初学者。这是译文的 链接 ?

AOP正在成ؓ软g开发的下一个圣杯。用AOPQ你可以处理aspect的代码注入主E序Q通常ȝ序的主要目的q不在于处理q些aspect。AOP可以防止代码混ؕ?
Z理解AOP如何做到q点Q考虑一下记日志的工作。日志本w不太可能是你开发的ȝ序的主要d。如果能“不可见的”、通用的日志代码注入主E序中,那该多好啊。AOP可以帮助你做到?
Spring framework是很有前途的AOP技术。作ZU非늕性的Q轻型的AOP frameworkQ你无需使用预编译器或其他的元标{,便可以在JavaE序中用它。这意味着开发团队里只需一对付AOP frameworkQ其他hq是象往怸LE?
AOP是很多直觉难以理解的术语的根源。幸q的是,你只要理解三个概念,可以编写AOP模块。这三个概念是:adviceQpointcut和advisor。advice是你惛_别的E序内部不同的地Ҏ入的代码。pointcut定义了需要注入advice的位|,通常是某个特定的cȝ一个publicҎ。advisor是pointcut和advice的装配器Q是advice注入ȝ序中预定义位|的代码?

既然我们知道了需要用advisor向主要代码中注入“不可见的”adviceQ让我们实现一个Spring AOP的例子。在q个例子中,我们实C个before adviceQ这意味着advice的代码在被调用的publicҎ开始前被执行。以下是q个before advice的实C码:

代码:
package com.company.springaop.test;

import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;

public class TestBeforeAdvice implements MethodBeforeAdvice {

  public void before(Method m, Object[] args, Object target)
  throws Throwable {
    System.out.println("Hello world! (by "
        + this.getClass().getName()
        + ")");
  }
}
 


接口MethodBeforeAdvice只有一个方法before需要实玎ͼ它定义了advice的实现。beforeҎq三个参数Q它们提供了相当丰富的信息。参数Method m是advice开始后执行的方法。方法名U可以用作判断是否执行代码的条g。Object[] args是传l被调用的publicҎ的参数数l。当需要记日志Ӟ参数args和被执行Ҏ的名Uͼ都是非常有用的信息。你也可以改变传lm的参敎ͼ但要心使用q个功能Q编写最初主E序的程序员q不知道ȝ序可能会和传入参数的发生冲突。Object target是执行方法m对象的引用?

在下面的BeanImplcMQ每个publicҎ调用前,都会执行adviceQ?

代码:
package com.company.springaop.test;

public class BeanImpl implements Bean {

  public void theMethod() {
    System.out.println(this.getClass().getName()
        + "." + new Exception().getStackTrace()[0].getMethodName()
        + "()"
        + " says HELLO!");
  }
}


cBeanImpl实现了下面的接口BeanQ?

代码:
package com.company.springaop.test;

public interface Bean {
  public void theMethod();
}



虽然不是必须使用接口Q但面向接口而不是面向实现编E是良好的编E实践,Spring也鼓p样做?

pointcut和advice通过配置文g来实玎ͼ因此Q接下来你只需~写L法的Java代码Q?
代码:


package com.company.springaop.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Main {

  public static void main(String[] args) {
    //Read the configuration file
    ApplicationContext ctx
        = new FileSystemXmlApplicationContext("springconfig.xml");

    //Instantiate an object
    Bean x = (Bean) ctx.getBean("bean");

    //Execute the public method of the bean (the test)
    x.theMethod();
  }
}



我们从读入和处理配置文g开始,接下来马上要创徏它。这个配|文件将作ؓ_合E序不同部分的“胶水”。读入和处理配置文g后,我们会得C个创建工厂ctx。Q何一个Spring理的对象都必须通过q个工厂来创建。对象通过工厂创徏后便可正怋用?

仅仅用配|文件便可把E序的每一部分l装h?
代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC  "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
  <!--CONFIG-->
  <bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>com.company.springaop.test.Bean</value>
    </property>
    <property name="target">
      <ref local="beanTarget"/>
    </property>
    <property name="interceptorNames">
      <list>
        <value>theAdvisor</value>
      </list>
    </property>
  </bean>

  <!--CLASS-->
  <bean id="beanTarget" class="com.company.springaop.test.BeanImpl"/>

  <!--ADVISOR-->
  <!--Note: An advisor assembles pointcut and advice-->
  <bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice">
      <ref local="theBeforeAdvice"/>
    </property>
    <property name="pattern">
      <value>com\.company\.springaop\.test\.Bean\.theMethod</value>
    </property>
  </bean>

  <!--ADVICE-->
  <bean id="theBeforeAdvice" class="com.company.springaop.test.TestBeforeAdvice"/>
</beans>
 


四个bean定义的次序ƈ不重要。我们现在有了一个adviceQ一个包含了正则表达式pointcut的advisorQ一个主E序cd一个配|好的接口,通过工厂ctxQ这个接口返回自己本w实现的一个引用?

BeanImpl和TestBeforeAdvice都是直接配置。我们用一个唯一的ID创徏一个bean元素Qƈ指定了一个实现类。这是全部的工作?

advisor通过Spring framework提供的一个RegexMethodPointcutAdvisorcL实现。我们用advisor的一个属性来指定它所需的advice-bean。第二个属性则用正则表辑ּ定义了pointcutQ确保良好的性能和易L?

最后配|的是beanQ它可以通过一个工厂来创徏。bean的定义看h比实际上要复杂。bean是ProxyFactoryBean的一个实玎ͼ它是Spring framework的一部分。这个bean的行为通过一下的三个属性来定义Q?


  • 属性proxyInterface定义了接口类?
  • 属性target指向本地配置的一个beanQ这个beanq回一个接口的实现?
  • 属性interceptorNames是唯一允许定义一个值列表的属性。这个列表包含所有需要在beanTarget上执行的advisor。注意,advisor列表的次序是非常重要的?


Spring工具

虽然你可以手工修改Ant构徏脚本Q但使用SpringUIQ译注:SpringUI现在是Spring framework的一部分Qƈ改名为spring-ideQ,使用Spring AOP变得很简单,只要点点鼠标卛_。你可以把SpringUI安装成Eclipse的一个plug-in。然后,你只需在你的project上右击鼠标,q择“add Spring Project Nature”。在project属性中Q你可以在“Spring Project”下dSpring配置文g。在~译前把下面的类库加入projectQaopalliance.jarQcommons-logging.jarQjakarta-oro-2.0.7.jar和spring.jar。运行程序时你会看到下面的信息:

... (logging information)
Hello world! (by com.company.springaop.test.TestBeforeAdvice)
com.company.springaop.test.BeanImpl.theMethod() says HELLO!


优点和缺?/span>

Spring比v其他的framework更有优势Q因为除了AOP以外Q它提供了更多别的功能。作Z个轻型frameworkQ它在J2EE不同的部分都可以发挥作用。因此,即不想使用Spring AOPQ你可能q是想用Spring。另一个优ҎQSpringq不要求开发团队所有的人员都会用它。学习Spring应该从Spring reference的第一开始。读了本文后Q你应该可以更好地理解Spring reference了。Spring唯一的缺Ҏ~Z更多的文档,但它的mailing list是个很好的补充,而且会不断地出现更多的文档?/span>


阿成 2006-03-09 21:32 发表评论
]]>
关于OpenSessionInViewFilter http://www.tkk7.com/ltc603/archive/2006/03/09/34405.html阿成阿成Thu, 09 Mar 2006 00:52:00 GMThttp://www.tkk7.com/ltc603/archive/2006/03/09/34405.htmlhttp://www.tkk7.com/ltc603/comments/34405.htmlhttp://www.tkk7.com/ltc603/archive/2006/03/09/34405.html#Feedback0http://www.tkk7.com/ltc603/comments/commentRss/34405.htmlhttp://www.tkk7.com/ltc603/services/trackbacks/34405.html

转自QPotain 的BLOG

OpenSessionInView

Created by potian. Last edited by admin 61 days ago. Viewed 181 times.
[edit] [attach]
Hibernate的Lazy初始?:n关系Ӟ你必M证是在同一个Session内部使用q个关系集合Q不然Hiernate抛Z外?

另外Q你不愿意你的DAO试代码每次都打开关系SessionQ因此,我们一般会采用OpenSessionInView模式?

OpenSessionInViewFilter解决Web应用E序的问?

如果E序是在正常的WebE序中运行,那么Spring?b style="color: black; background-color: rgb(255, 255, 102);">OpenSessionInViewFilter能够解决问题Q它Q?

protected void doFilterInternal(HttpServletRequest request, 
             HttpServletResponse response,
           FilterChain filterChain) throws ServletException, IOException {
      SessionFactory sessionFactory = lookupSessionFactory();
      logger.debug("Opening Hibernate Session in OpenSessionInViewFilter");
      Session session = getSession(sessionFactory);
      TransactionSynchronizationManager.bindResource(sessionFactory, 
             new SessionHolder(session));
      try {
            filterChain.doFilter(request, response);
      }
      finally {
            TransactionSynchronizationManager.unbindResource(sessionFactory);
            logger.debug("Closing Hibernate Session in OpenSessionInViewFilter");
            closeSession(session, sessionFactory);
      }
}
可以看到Q这个Filter在request开始之前,把sessionFactoryl定到TransactionSynchronizationManagerQ和q个SessionHolder相关。这个意味着所有request执行q程中将使用q个session。而在hl束后,和q个sessionFactory对应的session解绑Qƈ且关闭Session?

Z么绑定以后,可以防止每ơ不会新开一个Session呢?看看HibernateDaoSupport的情况:

publicfinal void setSessionFactory(SessionFactory sessionFactory) {
    this.hibernateTemplate = new HibernateTemplate(sessionFactory);
  }
 protectedfinal HibernateTemplate getHibernateTemplate() {
  return hibernateTemplate;
 }

我们的DAO用这个templateq行操作Q?

publicabstract class BaseHibernateObjectDao
      extends HibernateDaoSupport
      implements BaseObjectDao {
            

      protected BaseEntityObject getByClassId(finallong id) {             BaseEntityObject obj =                   (BaseEntityObject) getHibernateTemplate()                         .execute(new HibernateCallback() {

                  publicObject doInHibernate(Session session)                         throws HibernateException {                         return session.get(getPersistentClass(), newLong(id));                   }

            });             return obj;       }

      public void save(BaseEntityObject entity) {             getHibernateTemplate().saveOrUpdate(entity);       }

      public void remove(BaseEntityObject entity) {             try {

                  getHibernateTemplate().delete(entity);             } catch (Exception e) {                   thrownew FlexEnterpriseDataAccessException(e);             }       }

      public void refresh(final BaseEntityObject entity) {             getHibernateTemplate().execute(new HibernateCallback() {

                  publicObject doInHibernate(Session session)                         throws HibernateException {                         session.refresh(entity);                         returnnull;                   }

            });       }

      public void replicate(finalObject entity) {             getHibernateTemplate().execute(new HibernateCallback() {

                  publicObject doInHibernate(Session session)                         throws HibernateException {                         session.replicate(entity, ReplicationMode.OVERWRITE);                         returnnull;                   }

            });       }

而HibernateTemplate试图每次在execute之前去获得SessionQ执行完力争关闭Session
publicObject execute(HibernateCallback action) throws DataAccessException {
      Session session = (!this.allowCreate ?
            SessionFactoryUtils.getSession(getSessionFactory(), 
                  false) :
            SessionFactoryUtils.getSession(getSessionFactory(),
                  getEntityInterceptor(),
                  getJdbcExceptionTranslator()));
      boolean existingTransaction =  
          TransactionSynchronizationManager.hasResource(getSessionFactory());
      if (!existingTransaction && getFlushMode() == FLUSH_NEVER) {
            session.setFlushMode(FlushMode.NEVER);
      }
      try {
            Object result = action.doInHibernate(session);
            flushIfNecessary(session, existingTransaction);
            return result;
      }
      catch (HibernateException ex) {
            throw convertHibernateAccessException(ex);
      }
      catch (SQLException ex) {
            throw convertJdbcAccessException(ex);
      }
      catch (RuntimeException ex) {
            // callback code threw application exception
            throw ex;
      }
      finally {
            SessionFactoryUtils.closeSessionIfNecessary(
                    session, getSessionFactory());
      }
}
而这个SessionFactoryUtils能否得到当前的session以及closeSessionIfNecessary是否真正关闭sessionQ端取决于这个session是否用sessionHolder和这个sessionFactory在我们最开始提到的TransactionSynchronizationManagerl定?
publicstatic void closeSessionIfNecessary(Session session, 
    SessionFactory sessionFactory)   
    throws CleanupFailureDataAccessException {
      if (session == null || 
         TransactionSynchronizationManager.hasResource(sessionFactory)) {
            return;
      }
      logger.debug("Closing Hibernate session");
      try {
            session.close();
      }
      catch (JDBCException ex) {
            // SQLException underneath
            thrownew CleanupFailureDataAccessException(
            "Cannot close Hibernate session", ex.getSQLException());
      }
      catch (HibernateException ex) {
            thrownew CleanupFailureDataAccessException(
            "Cannot close Hibernate session", ex);
      }
}

HibernateInterceptor和OpenSessionInViewInterceptor的问?

使用同样的方法,q两个Interceptor可以用来解决问题。但是关键的不同之处在于Q它们的力度只能定义在DAO或业务方法上Q而不是在我们的TestҎ上,除非我们把它们应用到TestCase的方法上Q但你不大可能ؓTestCased义一个接口,然后把Interceptor应用到这个接口的某些Ҏ上。直接用HibernateTransactionManager也是一L。因此,如果我们有这L试Q?

Category parentCategory  = new Category ();
      parentCategory.setName("parent");
      dao.save(parentCategory);
            

      Category childCategory = new Category(); childCategory.setName("child");

      parentCategory.addChild(childCategory);       dao.save(childCategory);

      Category savedParent = dao.getCategory("parent");       Category savedChild = (Category ) savedParent.getChildren().get(0);       assertEquals(savedChild, childCategory);

意味着两g事情Q?
  • 每次DAO执行都会启动一个session和关闭一个session
  • 如果我们定义了一个lazy的关p,那么最后的Category savedChild = (Category ) savedParent.getChildren().get(0);会让hibernate报错?

解决Ҏ

一U方法是对TestCase应用Interceptor或者TransactionManagerQ但q个恐怕会造成很多ȝ。除非是使用增强方式的AOP.我前期采用这U方?Aspectwerkz)Q在Eclipse里面也跑得含好?

另一U方法是在TestCase的setup和teardown里面实现和Filter完全一L处理Q其他的TestCase都从q个TestCasel承Q这U方法是我目前所使用的?


转自QKarl Baum's Weblog

Karl Baum's Weblog

All | General | Java


Thursday July 08, 2004
Lazy Initialization and the DAO pattern with Hibernate and Spring

Hibernate and Lazy Initialization

Hibernate object relational mapping offers both lazy and non-lazy modes of object initialization. Non-lazy initialization retrieves an object and all of its related objects at load time. This can result in hundreds if not thousands of select statements when retrieving one entity. The problem is compounded when bi-directional relationships are used, often causing entire databases to be loaded during the initial request. Of course one could tediously examine each object relationship and manually remove those most costly, but in the end, we may be losing the ease of use benefit sought in using the ORM tool.

The obvious solution is to employ the lazy loading mechanism provided by hibernate. This initialization strategy only loads an object's one-to-many and many-to-many relationships when these fields are accessed. The scenario is practically transparent to the developer and a minimum amount of database requests are made, resulting in major performance gains. One drawback to this technique is that lazy loading requires the Hibernate session to remain open while the data object is in use. This causes a major problem when trying to abstract the persistence layer via the Data Access Object pattern. In order to fully abstract the persistence mechanism, all database logic, including opening and closing sessions, must not be performed in the application layer. Most often, this logic is concealed behind the DAO implementation classes which implement interface stubs. The quick and dirty solution is to forget the DAO pattern and include database connection logic in the application layer. This works for small applications but in large systems this can prove to be a major design flaw, hindering application extensibility.

Being Lazy in the Web Layer

Fortunately for us, the Spring Framework has developed an out of box web solution for using the DAO pattern in combination with Hibernate lazy loading. For anyone not familiar with using the Spring Framework in combination with Hibernate, I will not go into the details here, but I encourage you to read Hibernate Data Access with the Spring Framework. In the case of a web application, Spring comes with both the OpenSessionInViewFilter and the OpenSessionInViewInterceptor. One can use either one interchangeably as both serve the same function. The only difference between the two is the interceptor runs within the Spring container and is configured within the web application context while the Filter runs in front of Spring and is configured within the web.xml. Regardless of which one is used, they both open the hibernate session during the request binding this session to the current thread. Once bound to the thread, the open hibernate session can transparently be used within the DAO implementation classes. The session will remain open for the view allowing lazy access the database value objects. Once the view logic is complete, the hibernate session is closed either in the Filter doFilter method or the Interceptor postHandle method. Below is an example of the configuration of each component:

Interceptor Configuration

<beans>
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="openSessionInViewInterceptor"/>
</list>
</property>
<property name="mappings">
...
</bean>
...
<bean name="openSessionInViewInterceptor"
class="org.springframework.orm.hibernate.support.OpenSessionInViewInterceptor">
<property name="sessionFactory"><ref bean="sessionFactory"/></property>
</bean>
</beans>
Filter Configuration

<web-app>
...
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate.support.OpenSessionInViewFilter
</filter-class>
</filter>
...
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.spring</url-pattern>
</filter-mapping>
...
</web-app>
Implementing the Hibernate DAO's to use the open session is simple. In fact, if you are already using the Spring Framework to implement your Hibernate DAO's, most likely you will not have to change a thing. The DAO's must access Hibernate through the convenient HibernateTemplate utility, which makes database access a piece of cake. Below is an example DAO.

Example DAO

public class HibernateProductDAO extends HibernateDaoSupport implements ProductDAO {

public Product getProduct(Integer productId) {
return (Product)getHibernateTemplate().load(Product.class, productId);
}

public Integer saveProduct(Product product) {
return (Integer) getHibernateTemplate().save(product);
}

public void updateProduct(Product product) {
getHibernateTemplate().update(product);
}
}
Being Lazy in the Business Layer

Even outside the view, the Spring Framework makes it easy to use lazy load initialization, through the AOP interceptor HibernateInterceptor. The hibernate interceptor transparently intercepts calls to any business object configured in the Spring application context, opening a hibernate session before the call, and closing the session afterward. Let's run through a quick example. Suppose we have an interface BusinessObject:

public interface BusinessObject {
public void doSomethingThatInvolvesDaos();
}
The class BusinessObjectImpl implements BusinessObject:


public class BusinessObjectImpl implements BusinessObject {
public void doSomethingThatInvolvesDaos() {
// lots of logic that calls
// DAO classes Which access
// data objects lazily
}
}
Through some configurations in the Spring application context, we can instruct the HibernateInterceptor to intercept calls to the BusinessObjectImpl allowing it's methods to lazily access data objects. Take a look at the fragment below:

<beans>
<bean id="hibernateInterceptor" class="org.springframework.orm.hibernate.HibernateInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="businessObjectTarget" class="com.acompany.BusinessObjectImpl">
<property name="someDAO"><ref bean="someDAO"/></property>
</bean>
<bean id="businessObject" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target"><ref bean="businessObjectTarget"/></property>
<property name="proxyInterfaces">
<value>com.acompany.BusinessObject</value>
</property>
<property name="interceptorNames">
<list>
<value>hibernateInterceptor</value>
</list>
</property>
</bean>
</beans>

When the businessObject bean is referenced, the HibernateInterceptor opens a hibernate session and passes the call onto the BusinessObjectImpl. When the BusinessObjectImpl has finished executing, the HibernateInterceptor transparently closes the session. The application code has no knowledge of any persistence logic, yet it is still able to lazily access data objects.

Being Lazy in your Unit Tests

Last but not least, we'll need the ability to test our lazy application from J-Unit. This is easily done by overriding the setUp and tearDown methods of the TestCase class. I prefer to keep this code in a convenient abstract TestCase class for all of my tests to extend.

public abstract class MyLazyTestCase extends TestCase {

private SessionFactory sessionFactory;
private Session session;

public void setUp() throws Exception {
super.setUp();
SessionFactory sessionFactory = (SessionFactory) getBean("sessionFactory");
session = SessionFactoryUtils.getSession(sessionFactory, true);
Session s = sessionFactory.openSession();
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(s));

}

protected Object getBean(String beanName) {
//Code to get objects from Spring application context
}

public void tearDown() throws Exception {
super.tearDown();
SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);
Session s = holder.getSession();
s.flush();
TransactionSynchronizationManager.unbindResource(sessionFactory);
SessionFactoryUtils.closeSessionIfNecessary(s, sessionFactory);
}
}

( Jul 08 2004, 09:39:55 AM EDT ) Permalink Comments [2]

Trackback URL: http://jroller.com/trackback/kbaum/Weblog/orm_lazy_initialization_with_dao
Comments:


A few things to keep in the back of your mind if you take this approach; 1. If any errors occur while attempting to lazy load relationships in the view (JSP) it would be hard to present a nice error to the user. 2. This would result in at least 2 hibernate sessions (db connections being open for any one request), so you might want to up the number of connections available. Cheers, Dan
Posted by Dan Washusen on July 08, 2004 at 09:02 PM EDT #

I am a little confused on why it would be difficult to show a nice error jsp. Couldn't we just use the provided servlet container error page mechanisms? In regards to the 2 hibernate sessions being opened. Are you saying that the OpenSessionInViewInterceptor would be run twice if an exception was thrown? Thanks for your feedback!



阿成 2006-03-09 08:52 发表评论
]]>Spring ~程入门十大问题解答http://www.tkk7.com/ltc603/archive/2006/02/10/30103.html阿成阿成Fri, 10 Feb 2006 02:46:00 GMThttp://www.tkk7.com/ltc603/archive/2006/02/10/30103.htmlhttp://www.tkk7.com/ltc603/comments/30103.htmlhttp://www.tkk7.com/ltc603/archive/2006/02/10/30103.html#Feedback0http://www.tkk7.com/ltc603/comments/commentRss/30103.htmlhttp://www.tkk7.com/ltc603/services/trackbacks/30103.html

spring下蝲包中doc目录下的MVC-step-by-step和sample目录下的例子都是比较好的spring开发的例子.

 1、如何学习SpringQ?br />
  你可以通过下列途径学习springQ?br />
  (1) spring下蝲包中doc目录下的MVC-step-by-step和sample目录下的例子都是比较好的spring开发的例子?

  (2) AppFuse集成了目前最行的几个开源轻量框架或者工?Ant,XDoclet,Spring,Hibernate(iBATIS),JUnit,Cactus,StrutsTestCase,Canoo's WebTest,Struts Menu,Display Tag Library,OSCache,JSTL,Struts ?br />
  你可以通过AppFuse源代码来学习spring?br />
AppFuse|站Q?a target="_blank">http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse

  (3)Spring 开发指?夏昕)Q?a target="_blank">http://www.xiaxin.net/Spring_Dev_Guide.rarQ?/font>

  一本spring的入门书c?里面介绍了反转控制和依赖注射的概念,以及spring的bean理Qspring的MVCQspring和hibernteQiBatis的结合?br />
  (4) spring学习的中文论?br />
  SpringFramework中文论坛(http://spring.jactiongroup.net)

  Java视线论坛(http://forum.javaeye.com)的spring栏目

  2、利用Spring框架~程Qconsole打印出log4j:WARN Please initialize the log4j system properlyQ?br />
  说明你的log4j.properties没有配置。请把log4j.properties攑ֈ工程的classpath中,eclipse的classpath为bin目录Q由于编译后src目录下的文g会拷贝到bin目录下,所以你可以把log4j.properties攑ֈsrc目录下?br />
  q里l出一个log4j.properties的例子:

log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n

  3、出?java.lang.NoClassDefFoundError?

  一般情况下是由于你没有把必要的jar包放到lib中?br />
  比如你要采用spring和hibernateQ带事务支持的话Q,你除了spring.jar外还需要hibernat.jar、aopalliance.jar、cglig.jar、jakarta-commons下的几个jar包?br />
http://www.springframework.org/download.html下蝲spring开发包Q提供两Uzip?br />spring-framework-1.1.3-with-dependencies.zip和spring-framework-1.1.3.zipQ我你下载spring-framework-1.1.3-with-dependencies.zip。这个zip解压~后比后者多一个lib目录Q其中有hibernate、j2ee、dom4j、aopalliance、jakarta-commons{常用包?br />
  4、java.io.FileNotFoundException: Could not open class path resource [....hbm.xml],提示找不到xml文gQ?br />
  原因一般有两个Q?br />
  (1)该xml文g没有在classpath中?

  (2)applicationContext-hibernate.xml中的xml名字没有带包名。比如:


Qbean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"Q?br />Qproperty name="dataSource"Q<ref bean="dataSource"/Q</propertyQ?br />Qproperty name="mappingResources"Q?br /> QlistQ?br />  QvalueQUser.hbm.xmlQ?valueQ?br />  错,改ؓQ?
  QvalueQcom/yz/spring/domain/User.hbm.xmlQ?valueQ?br /> Q?listQ?br />Q?propertyQ?br />Qproperty name="hibernateProperties"Q?br />QpropsQ?
 Qprop key="hibernate.dialect"Q?net.sf.hibernate.dialect.MySQLDialect Q?propQ?
 Qprop key="hibernate.show_sql"QtrueQ?propQ?
Q?propsQ?
Q?propertyQ?br />Q?beanQ?/td>

  5、org.springframework.beans.NotWritablePropertyException: Invalid property 'postDao' of bean classQ?br />
  出现异常的原因是在application-xxx.xml中property name的错误?br />
  Qproperty name="...."Q?中name的名字是与bean的setҎ相关的,而且要注意大写?br />
  比如


public class PostManageImpl extends BaseManage implements PostManage {
 private PostDAO dao = null;
 public void setPostDAO(PostDAO postDAO){
  this.dao = postDAO;
 }
}

  那么xml的定义应该是Q?br />

Qbean id="postManage" parent="txProxyTemplate"Q?br />Qproperty name="target"Q?br /> Qbean class="com.yz.spring.service.implement.PostManageImpl"Q?br />  Qproperty name="postDAO"Q<ref bean="postDAO"/Q</propertyQ??br />  Qproperty name="dao"Q<ref bean="postDAO"/Q</propertyQ??br /> Q?beanQ?br />Q?propertyQ?br />Q?beanQ?/td>

  6、Spring中如何实C务管理?

  首先Q如果用mysqlQ确定mysql为InnoDBcd?br />
  事务理的控制应该放到商业逻辑层。你可以写个处理商业逻辑的JavaBeanQ在该JavaBean中调用DAOQ然后把该Bean的方法纳入spring的事务管理?br />
  比如Qxml文g定义如下Q?br />

Qbean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"Q?br />Qproperty name="transactionManager"Q<ref bean="transactionManager"/Q</propertyQ?br />Qproperty name="transactionAttributes"Q?br />QpropsQ?br />Qprop key="save*"QPROPAGATION_REQUIREDQ?propQ?br />Qprop key="remove*"QPROPAGATION_REQUIREDQ?propQ?br />Qprop key="*"QPROPAGATION_REQUIREDQ?propQ?br />Q?propsQ?br />Q?propertyQ?br />Q?beanQ?br />
Qbean id="userManage" parent="txProxyTemplate"Q?br /> Qproperty name="target"Q?br />  Qbean class="com.yz.spring.service.implement.UserManageImpl"Q?br />   Qproperty name="userDAO"Q<ref bean="userDAO"/Q</propertyQ?br />  Q?beanQ?br /> Q?propertyQ?br />Q?beanQ?/td>

  com.yz.spring.service.implement.UserManageImpl是我们的实现商业逻辑的JavaBean。我们通过parent元素声明其事务支持?br />
  7、如何管理Spring框架下更多的JavaBeanQ?br />
  JavaBean多Qspring配置文gp大,q样不易l护。ؓ了配置清晰Q我们可以将JavaBean分类理Q放在不同的配置文g中?应用启动时将所有的xml同时加蝲?br />
  比如Q?br />
  DAO层的JavaBean攑ֈapplicationContext-hibernate.xml中,商业逻辑层的JavaBean攑ֈapplicationContext-service.xml中。然后启动类中调用以下代码蝲入所有的ApplicationContext?br />

String[] paths = {"com/yz/spring/dao/hibernate/applicationContext-hibernate.xml",
"com/yz/spring/service/applicationContext-service.xml"};
ctx = new ClassPathXmlApplicationContext(paths);

  8、web应用中如何加载ApplicationContextQ?br />
  可以通过定义web.xmlQ由web容器自动加蝲?br />

QservletQ?br />Qservlet-nameQcontextQ?servlet-nameQ?br />Qservlet-classQorg.springframework.web.context.ContextLoaderServletQ?servlet-classQ?br />Qload-on-startupQ?Q?load-on-startupQ?br />Q?servletQ?br />
Qcontext-paramQ?br />Qparam-nameQcontextConfigLocationQ?param-nameQ?br />Qparam-valueQ?WEB-INF/applicationContext-hibernate.xmlQ?param-valueQ?br />Qparam-valueQ?WEB-INF/applicationContext-service.xmlQ?param-valueQ?br />Q?context-paramQ?/td>

  9、在spring中如何配|的log4j?

  在web.xml中加入以下代码即可?br />

Qcontext-paramQ?br />Qparam-nameQlog4jConfigLocationQ?param-nameQ?br />Qparam-valueQ?WEB-INF/log4j.propertiesQ?param-valueQ?br />Q?context-paramQ?/td>

  10、Spring框架入门的编E问题解决了Q我该如何更深地领会Spring框架呢?

  q两本书你该ȝ看。这两本书是由Spring的作者Rod Johnson~写的?br />

Expert One on one J2EE Design and Development
Expert One on one J2EE Development Without EJB

  你也该看看martinfowler的Inversion of Control Containers and the Dependency Injection pattern?br />

http://www.martinfowler.com/articles/injection.html
 
  再好好研M下spring的文档?br />

http://www.jactiongroup.net/reference/html/index.htmlQ中文版Q未全部译Q?/td>

  q有是多实践吧?img src ="http://www.tkk7.com/ltc603/aggbug/30103.html" width = "1" height = "1" />

阿成 2006-02-10 10:46 发表评论
]]>
使用Spring邮g抽象层发送简单邮?http://www.tkk7.com/ltc603/archive/2006/01/12/27760.html阿成阿成Thu, 12 Jan 2006 07:14:00 GMThttp://www.tkk7.com/ltc603/archive/2006/01/12/27760.htmlhttp://www.tkk7.com/ltc603/comments/27760.htmlhttp://www.tkk7.com/ltc603/archive/2006/01/12/27760.html#Feedback1http://www.tkk7.com/ltc603/comments/commentRss/27760.htmlhttp://www.tkk7.com/ltc603/services/trackbacks/27760.html
  1、我们定义一个发送邮件的接口:OrderManager.java

1 public interface OrderManager extends BaseManager{
2  /**
3  *email,要发送的邮g地址;
4  *Code:Ȁzȝ
5  */
6  public void placeOrder(String email);
7 }

  2、我们需要对该接口进行实现的Ҏ:OrderManagerImpl.java

1 import javax.mail.Message;
2 import javax.mail.MessagingException;
3 import javax.mail.internet.InternetAddress;
4 import javax.mail.internet.MimeMessage;
5 import org.springframework.mail.MailException;
6 import org.springframework.mail.javamail.JavaMailSender;
7 import org.springframework.mail.javamail.MimeMessagePreparator;
8 import service.OrderManager;
9
11 public class OrderManagerImpl extends BaseManagerImpl implements OrderManager {
12
13  private JavaMailSender mailsender;
14  private MyMailMessage message;
15
16
17  public void setMessage(CityMailMessage message)
18  {
19   this.message = message;
20  }
21  public void setMailsender(JavaMailSender mailsender) {
22   this.mailsender = mailsender;
23  }
24  public void placeOrder(final String email) {
25
26
27   MimeMessagePreparator preparator = new MimeMessagePreparator() {
28   public void prepare(MimeMessage mimeMessage) throws MessagingException {
29    mimeMessage.setRecipient(Message.RecipientType.TO,
30    new InternetAddress(email));
31    mimeMessage.setFrom(new InternetAddress(message.getFrom()));
32    /**转换~码为GBK*/
33    mimeMessage.setSubject(message.getSubject(),"GBK");
36    mimeMessage.setText(email+"QbrQ?+message.getSubject()+message.getText(),"GBK");
37
38   }
39  };
40  try{
41   mailsender.send(preparator);
42  }
43  catch(MailException ex) {
44   //log it and go on
45   System.err.println(ex.getMessage());
46  }
47 }
48 }

  3、spring配置发送email的applicationContext-email.xml

1 Q?xml version="1.0" encoding="UTF-8"?Q?br />2 Q?DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
3 "http://www.springframework.org/dtd/spring-beans.dtd"Q?br />4
5 QbeansQ?br />6  Qbean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"Q?br />7  Qproperty name="host"Q?br />8   QvalueQsmtp.163.comQ?valueQ?br />9  Q?propertyQ?br />10 Qproperty name="username"Q?br />11  QvalueQusernameQ?valueQ?br />12 Q?propertyQ?br />13 Qproperty name="password"Q?br />14  QvalueQpasswordQ?valueQ?br />15 Q?propertyQ?br />16 Qproperty name="javaMailProperties"Q?br />17  QpropsQ?br />18   Qprop key="mail.smtp.auth"QtrueQ?propQ?br />19   Qprop key="mail.smtp.timeout"Q?5000Q?propQ?br />20  Q?propsQ?br />21 Q?propertyQ?br />22 Q?beanQ?br />23
24 Qbean id="mailMessage" class="org.springframework.mail.SimpleMailMessage"Q?br />25  Qproperty name="from"Q?br />26   QvalueQEmailQ?valueQ?br />27  Q?propertyQ?br />28  Qproperty name="subject"Q?br />29   QvalueQ标题</valueQ?br />30  Q?propertyQ?br />31  Qproperty name="text"Q?br />32   QvalueQ内容</valueQ?br />33  Q?propertyQ?br />46 Q?beanQ?br />47
48 Qbean id="orderManager" class="cn.cityyouth.service.impl.OrderManagerImpl"Q?br />49  Qproperty name="mailsender"Q?br />50   Qref bean="mailSender" /Q?br />51  Q?propertyQ?br />52  Qproperty name="message"Q?br />53   Qref bean="mailMessage" /Q?br />54  Q?propertyQ?br />55 Q?beanQ?br />56
57 Q?beansQ?/td>

  4、最后配|自qjsp面以及action

1 package cn.cityyouth.web.action;
2
3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletResponse;
5 import org.apache.struts.action.ActionForm;
6 import org.apache.struts.action.ActionForward;
7 import org.apache.struts.action.ActionMapping;
8 import org.apache.struts.action.ActionMessage;
9 import org.apache.struts.action.ActionMessages;
10 import com.test.service.OrderManager;
11
12 public class SendMailAction extends BaseAction {
13
14  /**
15  * Method execute
16  *
17  * @param mapping
18  * @param form
19  * @param request
20  * @param response
21  * @return ActionForward
22  */
23 public ActionForward execute(ActionMapping mapping, ActionForm form,
24 HttpServletRequest request, HttpServletResponse response) {
25  OrderManager omi=(OrderManager)this.getBean("orderManager");
26  String useremail="123@163.com";
27  omi.placeOrder(useremail);
28 }
29 }

  到此所有的开发以l束?br />
  Sring邮g抽象层的主要包是Qorg.springframework.mail 包。它包含叫MailSender为发送邮件的核心接口和包含简单邮件属性例如from,to,cc,subject,text叫SimpleMailMessage的值对? q个包也包含一个检查异常的层次Q它支持一个更高别的抽象过低别的邮gpȝ异常伴随根异常存在MailException. 请参考JavaDocs为更多的信息杂邮件异常层ơ?br />
  Spring也支持一个MailSender的专用于JavaMail特征例如MIME消息子接口,命名为org.springframework.javamail.JavaMailerSener。它也支持一个ؓJavaMail MIME信息的准备回调接口,命名为org.springframework.mail.JavaMail.MimeMessagePreparator.

阿成 2006-01-12 15:14 发表评论
]]>
վ֩ģ壺 ҹƵ| þֻƷ99| AVH߹ۿ| ߹ۿʮ| ޳AVƬ߹ۿww| 97ȫѹۿ| ˾ҹƵѹ| AVĻɫ| Բٸ| 99ƷƵ߹ۿ| ۺϽ| ˳ɹƷ| ɫվ| һƵ| AV߹ۿ | 2020ΪĻѹۿȫ| ɫʹۺ߹ۿ| պƷһ| Ƶ69| й߹ۿѵwww| Ļ| ˳߲վ| ƵƬaaëƬ| þùһ| ۺa| ޶Ƶ߹ۿ| avַ| ɫɫWWW| ھƷþþþӰԺ| һ߲| ѾƵ߹ۿ| ޹徫Ʒ߾þ| һ߹ۿѸ߹ۿ | ձѵӰһ| 8xƵ| 9ȾƷѹۿƵ| ޱ龫Ʒһ| Ůһ| ۺɫɫ| www.޾Ʒ.com| aƵɫ|