??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩欧美自拍,97国产精品视频人人做人人爱,精品国产污污免费网站入口http://www.aygfsteel.com/produ/category/54581.html1GBzh-cnMon, 10 Nov 2014 16:17:33 GMTMon, 10 Nov 2014 16:17:33 GMT60温故知新:spring_10整合Strutshttp://www.aygfsteel.com/produ/articles/419814.html都较?/dc:creator>都较?/author>Sun, 09 Nov 2014 01:38:00 GMThttp://www.aygfsteel.com/produ/articles/419814.htmlhttp://www.aygfsteel.com/produ/comments/419814.htmlhttp://www.aygfsteel.com/produ/articles/419814.html#Feedback0http://www.aygfsteel.com/produ/comments/commentRss/419814.htmlhttp://www.aygfsteel.com/produ/services/trackbacks/419814.html
 1         <dependency>
 2             <groupId>org.apache.struts</groupId>
 3             <artifactId>struts2-spring-plugin</artifactId>
 4             <version>2.3.7</version>
 5         </dependency>
 6         
 7         <dependency>
 8             <groupId>org.apache.struts</groupId>
 9             <artifactId>struts2-core</artifactId>
10             <version>2.3.7</version>
11         </dependency>
除了在测试类中能取得工厂Q通过BeanId在工厂中获取实例的情况,其他时候一般是通过自动扫描q注入,因此Q在web.xml中,除了struts的过滤器Q还需要额外添加spring上下文的监听器,在项目部|的时候就actiond到工?br />
1     <listener>
2         <listener-class>
3             org.springframework.web.context.ContextLoaderListener
4         </listener-class>
5     </listener>
6     <context-param>
7         <param-name>contextConfigLocation</param-name>
8         <param-value>classpath*:beans.xml</param-value>
9     </context-param>
因ؓ需要action被springq行理Q还需要在struts.xml配置中设|以下内?/div>
1     <constant name="struts.objectFactory"
2         value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
3     <constant name="struts.devMode" value="true" />
4     
5     <package name="user" extends="struts-default" namespace="/">
6         <action name="*" class="userAction" method="{1}">
7             <result name="success">/user{1}.jsp</result>
8         </action>
9     </package>
通过springq行理之后Qaction的class配置无需再写详细的类目录Q直接写作注入类的BeanId
 1 package org.duyt.action;
 2 
 3 import java.util.List;
 4 
 5 import javax.annotation.Resource;
 6 
 7 import org.duyt.domain.User;
 8 import org.duyt.service.IuserService;
 9 import org.springframework.context.annotation.Scope;
10 import org.springframework.stereotype.Controller;
11 
12 import com.opensymphony.xwork2.ActionSupport;
13 import com.opensymphony.xwork2.ModelDriven;
14 
15 @Controller("userAction")
16 //对于actionQ需要额外指定Scope为prototypeQ默认是单例模式
17 @Scope("prototype")
18 public class UserAction extends ActionSupport implements ModelDriven<User>{
19 
20     private static final long serialVersionUID = 2698940294947436354L;
21     
22     private User user;
23     private List<User> userList;
24     
25     @Resource
26     private IuserService userService;
27     
28     
29     public String list() {
30         
31         userList = userService.listUser();
32         
33         return SUCCESS;
34     }
35     
36     public User getModel() {
37         if (user == null) {
38             user = new User();
39         }
40         return user;
41     }
42 
43     //get/setҎ?br />44 
45 }
46 

上述配置之后Q就完成了对struts的整合,但是整合之后Q可能会遇到以下的问题:
1Q关于声明式事务的切入点表达式。虽然执行对数据库操作的环节是DaoQ但是声明却不能在Daoq行事务处理Q毕竟一个DaoҎ据库的操作不一定能代表一个完整的事务。所以,切入点应该设|在service接口上,一个具体的业务处理应该包含一个完整的事务。拿最l典的银行{账的例子来说Q一个̎L金额转出操作和另一个̎L转入操作应该讑֮在一个service的方法里Q当事务对这个方法生效,那么不论转入或者{ZQ何一个操作出现异常,那么整个操作都会回滚。倘若事务讑֮在Dao上,那么转入和{出分别ؓ两个ҎQ其中一个出现异怹后(一般也是转出出现异常Q,会出现打钱收不到Q钱都不知道d儿了的情况,q是我们最不想看到的。可能你会说Q把转入和{定在Dao的一个方法中不就可以了,对,q样的话是可以解决问题,但是q样会导致层和层之间的分工不明确Q相互渗透的情况QDao只是Ҏ据库的访问,他不应该涉及q分的业务逻辑Q就像控制层应该把更多的_֊攑֜跌{或者参C递上Q而不应该和专门控制业务处理的service层抢zd。还有就是在Dao一个方法里q行业务逻辑操作可能会涉及Dao之间的嵌套调用,会出现问题?br />2Q在面上用查询时。可能会出现以下的异?br />
1     org.hibernate.LazyInitializationException: could not initialize proxy - no Session
2     at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:132)
3     at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:174)
4     at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
5     at org.duyt.domain.Address_$$_javassist_0.toString(Address_$$_javassist_0.java)
6     ...
q是׃hibernate的懒加蝲机制引v的,׃声明式事务将事务讑֮在service的接口,DserviceҎ执行完毕׃关闭sessionQ那么到了页面上需要取得懒加蝲才能取得的信息时Q会D出现没有session的状态,那么如何解决呢。可以通过一个过滤器Q用Threadlocal在请求之初就开启sessionQ这P整个程都可以取得sessionQ请求结束之时再关闭session。新增一个过滤器Q将spring工厂中的sessionfactory取得Q通过该工厂新建session
 1 package org.duyt.filter;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 
12 import org.hibernate.Session;
13 import org.hibernate.SessionFactory;
14 import org.springframework.web.context.WebApplicationContext;
15 import org.springframework.web.context.support.WebApplicationContextUtils;
16 
17 public class OpenSessionInViewFilter implements Filter{
18     
19     //spring工厂
20     private static WebApplicationContext wac;
21     //hibernateSessionFactory
22     private static SessionFactory sessionFactory;
23     //U程间共享的session
24     private static ThreadLocal<Session> sessionholder = new ThreadLocal<Session>();
25     
26     private static void setSession(Session session){
27         sessionholder.set(session);
28     }
29     
30     public static Session getSession(){
31         return sessionholder.get();
32     }
33     
34     private static void removeSession(){
35         sessionholder.remove();
36     }
37 
38     public void destroy() {
39         
40     }
41 
42     public void doFilter(ServletRequest req, ServletResponse resp,
43             FilterChain chain) throws IOException, ServletException {
44         try {
45             //执行操作之前先设定session
46             if (sessionFactory != null) {
47                 setSession(sessionFactory.openSession());
48             }
49             chain.doFilter(req, resp);
50         } finally{
51             //操作完毕之后在移除session
52             removeSession();
53         }
54     }
55 
56     public void init(FilterConfig cfg) throws ServletException {
57         //spring的工厂加载到属?br />58         //q里不要使用new classpathXml.. L建工厂,应该使用目启动时创建的工厂
59         //如下获取
60         wac = WebApplicationContextUtils.getWebApplicationContext(cfg.getServletContext());
61         sessionFactory = (SessionFactory) wac.getBean("sessionFactory");
62     }
63 
64 }
65 
之后Q在Dao中进行数据库操作时就需要用过滤器创徏的session
1      OpenSessionInViewFilter.getSession().XXX
spring本n也提供了一个叫OpenSessionInViewFilter的过滤器Q能帮助我们解决懒加载时没有session的问题,看下web.xml
 1     <!-- 实现openSessionInView -->
 2     <!-- 注意Q本qo器要攑֜strutsqo器的前面Q否则会失效 -->
 3     <filter>
 4         <filter-name>OpenSessionInViewFilter</filter-name>
 5         <!-- q是自定义的filter -->
 6         <!-- <filter-class>org.duyt.filter.OpenSessionInViewFilter</filter-class> -->
 7         
 8         <!-- q是spring提供?nbsp;OpenSessionInViewFilterQ用spring自带的就不用再DAO的实C使用filter获取session-->
 9         <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
10     </filter>
11     <filter-mapping>
12         <filter-name>OpenSessionInViewFilter</filter-name>
13         <url-pattern>/*</url-pattern>
14     </filter-mapping>


]]>温故知新:spring_09整合Hibernatehttp://www.aygfsteel.com/produ/articles/419805.html都较?/dc:creator>都较?/author>Sat, 08 Nov 2014 16:37:00 GMThttp://www.aygfsteel.com/produ/articles/419805.htmlhttp://www.aygfsteel.com/produ/comments/419805.htmlhttp://www.aygfsteel.com/produ/articles/419805.html#Feedback0http://www.aygfsteel.com/produ/comments/commentRss/419805.htmlhttp://www.aygfsteel.com/produ/services/trackbacks/419805.html阅读全文

]]>
温故知新:spring_08整合JDBChttp://www.aygfsteel.com/produ/articles/419683.html都较?/dc:creator>都较?/author>Fri, 07 Nov 2014 13:44:00 GMThttp://www.aygfsteel.com/produ/articles/419683.htmlhttp://www.aygfsteel.com/produ/comments/419683.htmlhttp://www.aygfsteel.com/produ/articles/419683.html#Feedback0http://www.aygfsteel.com/produ/comments/commentRss/419683.htmlhttp://www.aygfsteel.com/produ/services/trackbacks/419683.html阅读全文

]]>
温故知新:spring_07ZXML配置AOPhttp://www.aygfsteel.com/produ/articles/419555.html都较?/dc:creator>都较?/author>Wed, 05 Nov 2014 14:45:00 GMThttp://www.aygfsteel.com/produ/articles/419555.htmlhttp://www.aygfsteel.com/produ/comments/419555.htmlhttp://www.aygfsteel.com/produ/articles/419555.html#Feedback0http://www.aygfsteel.com/produ/comments/commentRss/419555.htmlhttp://www.aygfsteel.com/produ/services/trackbacks/419555.html
切面c,去除掉和AOP有关的注解,变得非常z?br />
 1 package org.duyt.autoProxy;
 2 
 3 import org.aspectj.lang.JoinPoint;
 4 import org.aspectj.lang.ProceedingJoinPoint;
 5 import org.duyt.util.Logger;
 6 import org.springframework.stereotype.Component;
 7 
 8 @Component("loggerAspect")
 9 public class LoggerAspect {
10     public void loggerBefore(JoinPoint jp) {
11         Logger.info("前置切入点:execute==>" + jp.getTarget() + "==>"
12                 + jp.getSignature().getName() + " method");
13     }
14     public void loggerAfter(JoinPoint jp) {
15         Logger.info("后置切入点:execute==>" + jp.getTarget() + "==>"
16                 + jp.getSignature().getName() + " method");
17     }
18     public void loggerAround(ProceedingJoinPoint pjp) throws Throwable {
19         Logger.info("环绕开始切入点Qexecute==>" + pjp.getTarget() + "==>"
20                 + pjp.getSignature().getName() + " method");
21         pjp.proceed();
22         Logger.info("环绕l束切入点:execute==>" + pjp.getTarget() + "==>"
23                 + pjp.getSignature().getName() + " method");
24     }
25 }
26 
beans.xml变更Z下的配置
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 4     xmlns:aop="http://www.springframework.org/schema/aop"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 6                         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 7                         http://www.springframework.org/schema/context
 8                         http://www.springframework.org/schema/context/spring-context-3.0.xsd
 9                         http://www.springframework.org/schema/aop
10                         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
11 
12     <!-- 开启注?nbsp;-->
13     <context:annotation-config />
14     <!-- 指定哪些需要加入扫?nbsp;-->
15     <context:component-scan base-package="org.duyt.*" />
16 
17     <!-- 开启AOP切面自动代理 -->
18     <!-- 无须再开?nbsp;-->
19     <!-- <aop:aspectj-autoproxy /> -->
20 
21     <!-- 使用xml配置AOP实现 -->
22     <aop:config>
23         <!-- 定义切面cdƈ引用 -->
24         <aop:aspect id="loggerAspect" ref="loggerAspect">
25             <!-- 定义切入?nbsp;-->
26             <aop:pointcut id="loggerPointcut"
27                 expression="execution (* org.duyt.dao.*.add*(..))||
28                             execution (* org.duyt.dao.*.delete*(..))||
29                             execution (* org.duyt.dao.*.update*(..))" />
30             <!-- 定义通知Q前|?nbsp;-->
31             <aop:before method="loggerBefore" pointcut-ref="loggerPointcut"/>
32             <!-- 后置 -->
33             <aop:after method="loggerAfter" pointcut-ref="loggerPointcut"/>
34             <!-- 环绕 -->
35             <aop:around method="loggerAround" pointcut-ref="loggerPointcut"/>
36         </aop:aspect>
37     </aop:config>
38 
39 </beans>
试c?br />
 1 package org.duyt.test;
 2 
 3 import org.duyt.action.UserAction;
 4 import org.junit.Test;
 5 import org.springframework.beans.factory.BeanFactory;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 public class IocTest {
 9 
10     private BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
11     
12     @Test
13     public void test(){
14         //ZXML的AOP
15         UserAction ua = (UserAction) factory.getBean("userAction");
16         ua.addUser();
17     }
18     
19 }
20 
l果和用annotation无异Q?br />
前置切入点:execute==>org.duyt.dao.impl.UserDao@af08a49==>add method
环绕开始切入点Qexecute==>org.duyt.dao.impl.UserDao@af08a49==>add method
用户增加Ҏ
后置切入点:execute==>org.duyt.dao.impl.UserDao@af08a49==>add method
环绕l束切入点:execute==>org.duyt.dao.impl.UserDao@af08a49==>add method


]]>
温故知新:spring_06Zannotation配置AOPhttp://www.aygfsteel.com/produ/articles/419519.html都较?/dc:creator>都较?/author>Wed, 05 Nov 2014 03:09:00 GMThttp://www.aygfsteel.com/produ/articles/419519.htmlhttp://www.aygfsteel.com/produ/comments/419519.htmlhttp://www.aygfsteel.com/produ/articles/419519.html#Feedback0http://www.aygfsteel.com/produ/comments/commentRss/419519.htmlhttp://www.aygfsteel.com/produ/services/trackbacks/419519.html
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 4     xmlns:aop="http://www.springframework.org/schema/aop"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 6                         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 7                         http://www.springframework.org/schema/context
 8                         http://www.springframework.org/schema/context/spring-context-3.0.xsd
 9                         http://www.springframework.org/schema/aop
10                         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
11 
12     <!-- 开启注?nbsp;-->
13     <context:annotation-config />
14     <!-- 指定哪些需要加入扫?nbsp;-->
15     <context:component-scan base-package="org.duyt.*" />
16     <!-- 开启AOP切面自动代理 -->
17     <aop:aspectj-autoproxy />
18 
19 </beans>
此时Q需要加入aop对应的命名空_虽然搜烦一下会有一大堆Q但是这U命名空间的声明会在spring-XXX相应的包下找刎ͼ要加入aop的声明,可在spring-aop-X.X.X.jar包,META-INF下的spring.schemasQspring.tooling配置文g中找到?br />在定义切面之前,q是先理清一些概?br />1Q切入点Qpoint-cutQ,核心是切入点表达式,可以定h程中的某一个点?br />2Q通知QadviceQ,可以理解为在切入点的某个位置Q常见如切入点之前,之后Q或者环l着切入点)d需要拓展的功能Q通知包含切入的具体位|和拓展的内宏V?br />3Q切面(aspectQ,一cd入点Q比如专门添加日志的切面Q或者专门记录异常的切面Q可以理解ؓl成了一个切面,切面包含了切入点和所需要的通知?br />下面定义一个切面:
 1 package org.duyt.autoProxy;
 2 
 3 import org.aspectj.lang.JoinPoint;
 4 import org.aspectj.lang.ProceedingJoinPoint;
 5 import org.aspectj.lang.annotation.After;
 6 import org.aspectj.lang.annotation.Around;
 7 import org.aspectj.lang.annotation.Aspect;
 8 import org.aspectj.lang.annotation.Before;
 9 import org.duyt.util.Logger;
10 import org.springframework.stereotype.Component;
11 
12 /**
13  * Spring使用了第三方AspectJ来实现AOP功能QAOP相关的注解需要添加AspectJ的饮?br />14  * @author Administrator
15  *
16  */
17 //注明q是一个切面类
18 @Aspect
19 //dspring的管?/span>
20 @Component("loggerAspect")
21 public class LoggerAspect {
22     //@Before标注的方法意为将该方法作用于切入点表辑ּ注明的方法之前执行,可以理解为创Z个通知Q?br />23     //关于切入点表辑ּQexecution(* org.duyt.dao.*.add*(..)
24     //W一?代表着Lcdq回值的Ҏ
25     //之后跟空|d一个包的\径,W二?表示该包路径下的所有类
26     //之后d“.”Q再跟需要切入的ҎQ此处指定了所有以add,delete,update开头的ҎQ?#8220;||”q列q接q些表达?br />27     //最后的“(..)”表示L个数的参数列?/span>
28     @Before("execution(* org.duyt.dao.*.add*(..))||"
29             + "execution(* org.duyt.dao.*.delete*(..))||"
30             + "execution(* org.duyt.dao.*.update*(..))")
31     public void loggerBefore(JoinPoint jp) {
32         // System.out.println(jp.getTarget());//org.duyt.dao.impl.UserDao@71eecfa7Q获取执行的对象
33         // System.out.println(jp.getSignature().getName());//addQ获取方法签?/span>
34         Logger.info("前置切入点:execute==>" + jp.getTarget() + "==>"
35                 + jp.getSignature().getName() + " method");
36     }
37     @After("execution(* org.duyt.dao.*.add*(..))||"
38             + "execution(* org.duyt.dao.*.delete*(..))||"
39             + "execution(* org.duyt.dao.*.update*(..))")
40     public void loggerAfter(JoinPoint jp) {
41         Logger.info("后置切入点:execute==>" + jp.getTarget() + "==>"
42                 + jp.getSignature().getName() + " method");
43     }
44     @Around("execution(* org.duyt.dao.*.add*(..))||"
45             + "execution(* org.duyt.dao.*.delete*(..))||"
46             + "execution(* org.duyt.dao.*.update*(..))")
47     public void loggerAround(ProceedingJoinPoint pjp) throws Throwable {
48         Logger.info("环绕开始切入点Qexecute==>" + pjp.getTarget() + "==>"
49                 + pjp.getSignature().getName() + " method");
50         pjp.proceed();//执行Ҏ
51         Logger.info("环绕l束切入点:execute==>" + pjp.getTarget() + "==>"
52                 + pjp.getSignature().getName() + " method");
53     }
54 }
55 
DAO和Service内容略,试cd?br />
 1 package org.duyt.test;
 2 
 3 import org.duyt.action.UserAction;
 4 import org.junit.Test;
 5 import org.springframework.beans.factory.BeanFactory;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 public class IocTest {
 9 
10     private BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
11     
12     @Test
13     public void test(){
14         //Zannotation的AOP
15         UserAction ua = (UserAction) factory.getBean("userAction");
16         ua.addUser();
17     }
18     
19 }
20 
l果Q?br />
前置切入点:execute==>org.duyt.dao.impl.UserDao@6fc8ddb5==>add method
环绕开始切入点Qexecute==>org.duyt.dao.impl.UserDao@6fc8ddb5==>add method
用户增加Ҏ
后置切入点:execute==>org.duyt.dao.impl.UserDao@6fc8ddb5==>add method
环绕l束切入点:execute==>org.duyt.dao.impl.UserDao@6fc8ddb5==>add method


]]>
温故知新:spring_05动态代理实现AOPhttp://www.aygfsteel.com/produ/articles/419509.html都较?/dc:creator>都较?/author>Tue, 04 Nov 2014 15:24:00 GMThttp://www.aygfsteel.com/produ/articles/419509.htmlhttp://www.aygfsteel.com/produ/comments/419509.htmlhttp://www.aygfsteel.com/produ/articles/419509.html#Feedback0http://www.aygfsteel.com/produ/comments/commentRss/419509.htmlhttp://www.aygfsteel.com/produ/services/trackbacks/419509.html
IUserDao 
1 package org.duyt.dao;
2 import org.duyt.annotation.LogMsg;
3 public interface IUserDao {
4     public void add();
5 }
UserDao
 1 package org.duyt.dao.impl;
 2 import org.duyt.dao.IUserDao;
 3 import org.springframework.context.annotation.Scope;
 4 import org.springframework.stereotype.Repository;
 5 @Repository("userDao")
 6 @Scope("singleton")
 7 public class UserDao implements IUserDao {
 8     public void add() {
 9         System.out.println("用户增加Ҏ");
10     }
11 }
创徏代理c,q个代理cȝ主要作用是Z入的被代理对象,dҎ执行前的记录日志功能
 1 package org.duyt.dao.proxy;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 import java.lang.reflect.Proxy;
 6 
 7 public class DaoLoggerProxy implements InvocationHandler {
 8     
 9     //使用属性保存,要代理的目标对象
10     private Object target;
11     
12     //U有I构?/span>
13     private DaoLoggerProxy(){
14     }
15     
16     //工厂Ҏ
17     public static Object getInstance(Object o){
18         DaoLoggerProxy proxy = new DaoLoggerProxy();
19         //保存要代理的对象
20         proxy.target = o;
21         //创徏传入对象的代理对?/span>
22         Object result = Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), proxy);
23         //q回创徏的代理对?/span>
24         return result;
25     }
26 
27     //被代理对象在调用MҎ的时候,都会先调用代理类的invokeҎQ那么在此,可以在被代理对象方法执行的L一个流E添加需要的功能
28     public Object invoke(Object proxy, Method method, Object[] args)
29             throws Throwable {
30         
31         /*if (method.isAnnotationPresent(XXX.class)) {
32             可以自定义注解给特定ҎQ规定这些方法执行哪些特D的操作
33         }*/
34         
35         /*if (method.getName().startsWith("add")) {
36             Ҏ些约定了Ҏ名的Ҏ拓展需要的功能
37         }*/
38         
39         /*try {
40             Object obj = method.invoke(target, args);
41         } catch (Exception e) {
42             记录异常的操作,或者回滚操?br />43         }*/
44         
45         //在被代理对象Ҏ执行之前q行某些操作
46         
47         System.out.println("---->模拟记录日志<----");
48         Object obj = method.invoke(target, args);
49         
50         //之后q行某些操作
51         
52         return obj;
53     }
54 
55 }
56 
beans.xml需要作出如下配|?br />
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 6                         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 7                         http://www.springframework.org/schema/context
 8                         http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 9 
10     <!-- 开启注?nbsp;-->
11     <context:annotation-config/>
12     <!-- 指定哪些需要加入扫?nbsp;-->
13     <context:component-scan base-package="org.duyt.*"/>
14 
15     <!-- 限定了私有构造方法,所以不能直接创Z理类Q需要传入被代理对象Q用工厂方法返回代理对象,因此需要指定工厂方法,q且该方法在class属性指向的cM要ؓ静态方?nbsp;-->
16     <bean id="daoLoggerProxy" class="org.duyt.dao.proxy.DaoLoggerProxy" factory-method="getInstance">
17         <!-- 通过构造器参数来传入被代理的对?nbsp;-->
18         <constructor-arg ref="userDao"/>
19     </bean>
20     
21 </beans>
配置完毕之后Q用代理注入userDaoQ@Resource(name = "daoLoggerProxy")Q测?br />
 1 package org.duyt.test;
 2 
 3 import org.duyt.action.UserAction;
 4 import org.junit.Test;
 5 import org.springframework.beans.factory.BeanFactory;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 public class IocTest {
 9 
10     private BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
11     
12     @Test
13     public void test(){
14         //试代理cL展的功能
15         UserAction ua = (UserAction) factory.getBean("userAction");
16         ua.addUser();
17     }
18     
19 }
20 
l果Q?br />
---->模拟记录日志<----
用户增加Ҏ


]]>
温故知新:spring_04静态代理实现AOPhttp://www.aygfsteel.com/produ/articles/419488.html都较?/dc:creator>都较?/author>Tue, 04 Nov 2014 06:57:00 GMThttp://www.aygfsteel.com/produ/articles/419488.htmlhttp://www.aygfsteel.com/produ/comments/419488.htmlhttp://www.aygfsteel.com/produ/articles/419488.html#Feedback0http://www.aygfsteel.com/produ/comments/commentRss/419488.htmlhttp://www.aygfsteel.com/produ/services/trackbacks/419488.htmlAspect Oriented ProgrammingQ面向切面的~程Qspring的AOPҎ得对于用了该特性的目的可l护性,易拓展性和开发难易度{等都有了不同程度的改善。AOPҎ能够得项目中的某些操作,在执行到某一个指定环节的时候,可以额外的去执行开发者指定的操作Q这些操作往往都是h共通性,而且可能和操作本w所包含的业务逻辑没有直接的关p,比如Ҏ据库的访问,涉及变更数据库内容的操作需要精准的记录日志Q每当生异常或者错误信息的时候,也需要记录错误信息;Ҏ务器敏感资源q行讉K的时候需要对用户的权限进行校验等。在哪些环节d处理Q做怎样的处理,都可以由开发者自定义Q十分灵z,而且在开发业务逻辑和流E的时候大可不必去考虑q些共同性质的处理,让主要精力都投入在业务的实现上,q样一来,开发效率会大大提高?br />
先从一个静态代理的例子来感受一下这U切入式的编E?br />IUserDao
1 package org.duyt.dao;
2 public interface IUserDao {
3     public void add();
4 }
UserDao
 1 package org.duyt.dao.impl;
 2 
 3 import org.duyt.dao.IUserDao;
 4 import org.springframework.context.annotation.Scope;
 5 import org.springframework.stereotype.Repository;
 6 
 7 @Repository("userDao")
 8 @Scope("singleton")
 9 public class UserDao implements IUserDao {
10     public void add() {
11         System.out.println("用户增加Ҏ");
12     }
13 }
14 
一个很单纯的接口实现。倘若q就是一个成品了Q测试通过没有问题Q可以上U用。一D|间之后,需要加入日志的功能Q那么问题来了,挖掘机哪...噢不对,该如何添加呢Q?br />或许会马上想刎ͼ直接该啊。那么问题又来了Q挖...噢不Q直接修改的话,代码需要测试,而且万一需要修改的地方很多呢,岂不是很痛苦Q况且直接修Ҏ代码q违背了OCP原则Q绝对不推荐。这时候就可以考虑使用代理cLl源代码增加新功能?br />代理Q望文生义,白话是“你要做的事儿我不仅能l你做了Q而且除此之外我还能多做别?#8221;Q定义一个UserProxyDao
 1 package org.duyt.dao.impl;
 2 
 3 import javax.annotation.Resource;
 4 
 5 import org.duyt.dao.IUserDao;
 6 import org.duyt.util.Logger;
 7 import org.springframework.context.annotation.Scope;
 8 import org.springframework.stereotype.Repository;
 9 
10 @Repository("userProxyDao")
11 @Scope("singleton")
12 public class UserProxyDao implements IUserDao {
13 
14     @Resource
15     private IUserDao userDao;
16     
17     public void add() {
18         Logger.info("使用代理Qؓ用户增加Ҏd日志");
19         userDao.add();
20 
21     }
22 
23 }
24 
在代理中Q将需要拓展功能的对象作ؓ代理的属性注入,然后在需要拓展的Ҏ前后q加需要的功能。在此之后,在给service的IuserDao对象注入实例的时候,要用代理的对象@Resource(name = "userProxyDao")Q测试一?br />
 1 package org.duyt.test;
 2 
 3 import org.duyt.action.UserAction;
 4 import org.junit.Test;
 5 import org.springframework.beans.factory.BeanFactory;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 public class IocTest {
 9 
10     private BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
11     
12     @Test
13     public void test(){
14         //试代理依赖注入
15         UserAction ua = (UserAction) factory.getBean("userAction");
16         ua.addUser();
17     }
18     
19 }
20 
l果Q?br />
使用代理Qؓ用户增加Ҏd日志
用户增加Ҏ

׃IOC和AOP的特性,你会发现你要做的更改十分的少Q仅仅只是新增了一个代理类Qƈ修改了注入的对象。虽焉态的代理可以实现我们的需求,但是毕竟不灵z,一旦修Ҏ及的Ҏ和类一多,那简直就是纯体力zMQ一个类的拓展就需要对应一个代理类Q一个代理类中还需要涵盖所有需要拓展的ҎQƈ且保证原有功能不受媄响,如此一来,功能拓展q一丑֊需要投入极大的成本Q入不敷出?img src ="http://www.aygfsteel.com/produ/aggbug/419488.html" width = "1" height = "1" />

]]>
温故知新:spring_03Zannotation配置IOChttp://www.aygfsteel.com/produ/articles/419477.html都较?/dc:creator>都较?/author>Tue, 04 Nov 2014 03:17:00 GMThttp://www.aygfsteel.com/produ/articles/419477.htmlhttp://www.aygfsteel.com/produ/comments/419477.htmlhttp://www.aygfsteel.com/produ/articles/419477.html#Feedback0http://www.aygfsteel.com/produ/comments/commentRss/419477.htmlhttp://www.aygfsteel.com/produ/services/trackbacks/419477.html
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 6                         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 7                         http://www.springframework.org/schema/context
 8                         http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 9 
10     <!-- 开启注?nbsp;-->
11     <context:annotation-config/>
12     <!-- 指定哪些需要加入扫?nbsp;-->
13     <context:component-scan base-package="org.duyt.*"/>
14 
15 </beans>
拿出一个Daolg的注入ؓ?br />
1 package org.duyt.dao;
2 public interface IUserDao {
3     public void add();
4     public void delete();
5     public void update();
6     public void load();
7 }
Dao的实?br />
 1 package org.duyt.dao.impl;
 2 
 3 import org.duyt.dao.IUserDao;
 4 import org.springframework.context.annotation.Scope;
 5 import org.springframework.stereotype.Repository;
 6 
 7 //使用Repository("userDao")标注UserDaocȝ当于在配|文件中写作
 8 //<bean id="userDao" class="org.duyt.dao.impl.UserDao"/>
 9 @Repository("userDao")
10 //相应的,Scope("singleton")标注q当于的配|scope="singleton"
11 @Scope("singleton")
12 public class UserDao implements IUserDao {
13     public void add() {
14         System.out.println("用户增加Ҏ");
15     }
16     public void delete() {
17         System.out.println("用户删除Ҏ");
18     }
19     public void update() {
20         System.out.println("用户更新Ҏ");
21     }
22     public void load() {
23         System.out.println("用户查询Ҏ");
24     }
25 }
26 
spring提供了三U注解来对应MVC的三层,数据层的注解对应RepositoryQ业务层对应serviceQ表C层对应controller。还有一个公qcomponentQ分开q么多是Z更好的标注当前这个待注入cȝ功能Q如果不按照q些分类好的注解L入也可以完成注入Q但是还是规范的d。关于对象中某个属性的注入看下面的action
 1 package org.duyt.action;
 2 
 3 import javax.annotation.Resource;
 4 
 5 import org.duyt.domain.User;
 6 import org.duyt.service.IUserService;
 7 import org.springframework.context.annotation.Scope;
 8 import org.springframework.stereotype.Controller;
 9 
10 @Controller("userAction")
11 @Scope("prototype")
12 public class UserAction {
13     @Resource
14     private IUserService userService;
15     public String testString;
16     public User user;
17     
18     public UserAction() {
19     }
20     
21     public UserAction(String testString) {
22         super();
23         this.testString = testString;
24     }
25 
26     public void addUser(){
27         userService.add();
28     }
29     //get/set?/span>
30 }
31 
对于某个要注入的属性,Spring自带的注解是@AutoWireQ但是这U是按照cd注入的,Z避免接口多实现可能出现的问题Q推荐可以用javax.annotation提供的@resourceQ这U是按照属性的名称q行注入Q可以直接在属性名之上d注解Q这L话连属性的get/set都可以省?..或者是d对应的get/setQ在setҎ上添加注解。但是要注意的是Q按照属性名字进行注入,属性的名称需要和注解定义lg时的id一致。Action中的Iuserservice的实例名为userServiceQ会L有@service("userService")的注解进行注入,否则会注入失败?br />试如下
 1 package org.duyt.test;
 2 import org.duyt.action.UserAction;
 3 import org.junit.Test;
 4 import org.springframework.beans.factory.BeanFactory;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6 public class IocTest {
 7     private BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
 8     @Test
 9     public void test(){
10         
11         //试依赖注入
12         UserAction ua = (UserAction) factory.getBean("userAction");
13         UserAction ua2 = (UserAction) factory.getBean("userAction");
14         System.out.println(ua == ua2);
15         ua.addUser();
16     }
17 }
18 
l果为:
false
用户增加Ҏ


]]>
温故知新:spring_02ZXML配置IOChttp://www.aygfsteel.com/produ/articles/419462.html都较?/dc:creator>都较?/author>Mon, 03 Nov 2014 14:46:00 GMThttp://www.aygfsteel.com/produ/articles/419462.htmlhttp://www.aygfsteel.com/produ/comments/419462.htmlhttp://www.aygfsteel.com/produ/articles/419462.html#Feedback0http://www.aygfsteel.com/produ/comments/commentRss/419462.htmlhttp://www.aygfsteel.com/produ/services/trackbacks/419462.htmlW一个案例已l是ZXML配置spring的工厂了Q那么现在,正了八景的配|一下?br />
MVC 的三层式l构已经深入人心了,但是在此不得不稍微吐槽一下,虽然层次清晰Q但是还是有不少开发者,甚至一些站点,这些层ơ؜淆,在本来单单是界面层的?面中Q或者是控制器中嵌入了大量的业务代码Q而业务层和数据层却干q净净Q就是定义了单纯接口加对应实现。更有甚者在DAO中取request...你要q么写还分毛U层?..U层?..层啊Q咳?..a归正传,定义好演C用的数据层和业务层的接口和实现c?/div>
DaoInterface
1 package org.duyt.dao;
2 public interface IUserDao {
3     public void add();
4 }
DaoImpl
1 package org.duyt.dao.impl;
2 import org.duyt.dao.IUserDao;
3 public class UserDao implements IUserDao {
4     public void add() {
5         System.out.println("用户增加Ҏ");
6     }
7 }
ServiceInterface
1 package org.duyt.service;
2 public interface IUserService {
3     public void add();
4 }
5 
ServiceImpl
 1 package org.duyt.service.impl;
 2 import org.duyt.dao.IUserDao;
 3 import org.duyt.service.IUserService;
 4 public class UserService implements IUserService {
 5     private IUserDao userDao;
 6     public void add() {
 7         userDao.add();
 8     }
 9     public IUserDao getUserDao() {
10         return userDao;
11     }
12     public void setUserDao(IUserDao userDao) {
13         this.userDao = userDao;
14     }
15 }
实体c?br />
 1 package org.duyt.domain;
 2 import java.util.List;
 3 import java.util.Map;
 4 public class User {
 5     private int id;
 6     private String name;
 7     private Map<Object, Object> mapTest;
 8     private List<Object> listTest;
 9     public User() {
10     }
11     public User(int id, String name) {
12         this.id = id;
13         this.name = name;
14     }
15     //get/set?/span>
15 }
16 
Action
 1 package org.duyt.action;
 2 import org.duyt.domain.User;
 3 import org.duyt.service.IUserService;
 4 public class UserAction {
 5     private IUserService userService;
 6     private String testStringA;
 7     private String testStringB;
 8     private User user;
 9     public UserAction(String testStringA,String testStringB) {
10         this.testStringA = testStringA;
11         this.testStringB = testStringB;
12     }
13     public UserAction() {
14     }
15     //get/set?/span>
16 }
17 

 1 package org.duyt.action;
 2 import org.duyt.service.IUserService;
 3 public class AutowiredAction {
 4     private IUserService userService;
 5     public void add(){
 6         userService.add();
 7     }
 8     //get/set?/span>
 9 }
10 
重点是beans.xml的配|?br />
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 5                         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" >
 6                         <!-- default-autowire="byName" 此处可以讄全局的自动注入,开启之后所有bean内的属性都会自动按名称注入-->
 7 
 8     <!-- scope表示一个对象的有效范围Qsingleton表示单例Qprototype表示原型Q也是多例Q每ơ都会获取一个新的实例?nbsp;
 9     单例和原型是最常用的方式,springq提供了以request和sessionZ用范围的控制Q是否用见仁见智?/span>-->
10     
11     <!-- 有效范围的选择需要根据bean的用途来军_Q比如Action实例需要选择prototypeQ如果用单例去获取Action实例
12     那么Action的属性可能会影响前后的请求,对象实例的状态会影响其本w的功能Q那么就需要用原型去获取对象的实例;而service
13     和Dao的实例就无须担心Q直接用单例获取实例即可,不会因ؓ自n的属性状态而媄响功能的实现Q因Z们本w不存在状态。默认情况下
14     会用单例进行对象实例的创徏?nbsp;-->
15     <bean id="userAction" class="org.duyt.action.UserAction" scope="prototype">
16         <!-- property是指定要注入的属性,通过属性的setҎq行注入Qref则是对bean的引?/span>-->
17         <property name="userService" ref="userService"/>
18         <property name="user" ref="user"/>
19         
20         <!-- 通过构造方法进行属性的注入Q前提是要有只含有下qC个参数的构造方法,q要有空构?nbsp;-->
21         <constructor-arg name="testStringA" value="试用字W串AAA"/>
22         <constructor-arg name="testStringB" value="试用字W串BBB"/>
23     </bean>
24     
25     <!-- 一般属性的注入和集合对象属性的注入-->
26     <bean id="user" class="org.duyt.domain.User" scope="prototype">
27         <property name="id" value="1"/>
28         <property name="name" value="duyt"/>
29         <!-- 注入map -->
30         <property name="mapTest">
31             <map>
32                 <entry key="1" value="nihao"/>
33                 <entry key="2" value="hello"/>
34             </map>
35         </property>
36         <!-- 注入list -->
37         <property name="listTest">
38             <list>
39                 <value>1</value>
40                 <value>2</value>
41                 <value>3</value>
42             </list>
43         </property>
44     </bean>
45     
46     <!-- 此处讄了autowire = byName属性,会根据成员变量的名称自动搜烦对应的beanq注?q是推荐的方式,因ؓbean的名字是不应该重复的Q?br />47     只要属性的名称能够匚w到bean的idQƈ且属性含有get/setQ那么就会成功注入。还有一U方式是按照cd注入byTypeQ按照类型注入可能会存在一个接?br />48     有多个实现类的情况,比如action的XXXservice接口有多个实现类Q那么注入的时候会产生异常 -->
49     <bean id="autowiredAction" class="org.duyt.action.AutowiredAction" scope="prototype" autowire="byName"/>
50     
51     <bean id="userDao" class="org.duyt.dao.impl.UserDao" scope="singleton"/>
52     <bean id="userService" class="org.duyt.service.impl.UserService" scope="singleton">
53         <property name="userDao" ref="userDao"/>
54     </bean>
55 
56 </beans>
最后用测试类来验证注入的情况
 1 package org.duyt.test;
 2 
 3 import org.duyt.action.AutowiredAction;
 4 import org.duyt.action.UserAction;
 5 import org.junit.Test;
 6 import org.springframework.beans.factory.BeanFactory;
 7 import org.springframework.context.support.ClassPathXmlApplicationContext;
 8 
 9 public class IocTest {
10 
11     private BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
12     
13     @Test
14     public void test(){
15         UserAction ua = (UserAction) factory.getBean("userAction");
16         //试使用构造方法进行注?/span>
17         System.out.println(ua.getTestStringA());
18         System.out.println(ua.getTestStringB());
19         //属性注?/span>
20         System.out.println(ua.getUser().getId());
21         System.out.println(ua.getUser().getName());
22         //集合注入
23         System.out.println(ua.getUser().getListTest().size());
24         System.out.println(ua.getUser().getMapTest().get("1"));
25         //Ҏ属性名自动注入
26         AutowiredAction aa = (AutowiredAction) factory.getBean("autowiredAction");
27         aa.add();
28     }
29     
30 }
31 
  


]]>温故知新:spring_01IOC整体感受http://www.aygfsteel.com/produ/articles/419452.html都较?/dc:creator>都较?/author>Mon, 03 Nov 2014 09:19:00 GMThttp://www.aygfsteel.com/produ/articles/419452.htmlhttp://www.aygfsteel.com/produ/comments/419452.htmlhttp://www.aygfsteel.com/produ/articles/419452.html#Feedback0http://www.aygfsteel.com/produ/comments/commentRss/419452.htmlhttp://www.aygfsteel.com/produ/services/trackbacks/419452.html记录一下^时在使用spring时的一些技巧和心得Q先说明一下测试环境?br />
环境如下
pȝQ?/strong>64位win7


试环境Q?/strong>


先从一个helloworld的简单案例开始吧
新徏一个maven目Q选择


其实不论使用哪个框架技术,都无非三步走QimportQconfigQrunQ首先,我们import
因ؓ使用maven来管理项目,所以直接添加spring的依赖到pom.xml
 1         <dependency>
 2             <groupId>org.springframework</groupId>
 3             <artifactId>spring-core</artifactId>
 4             <version>3.0.5.RELEASE</version>
 5         </dependency>
 6 
 7         <dependency>
 8             <groupId>org.springframework</groupId>
 9             <artifactId>spring-context</artifactId>
10             <version>3.0.5.RELEASE</version>
11         </dependency>
之后Q我们开始configQ作Z个基本IOC演示Q只需要定义工厂的配置。定义一个beans.xml文gQ置于src下。其中bean标签是定义beanId和待注入对象实例之间的映?br />是“用这个id取对象实例,你会取到class的对象实?#8221;
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4     xsi:schemaLocation="http://www.springframework.org/schema/beans 
5                         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
6 
7     <bean id="helloSpring" class="demo.model.Demo"/>
8 
9 </beans>
演示c?br />
 1 package demo.model;
 2 
 3 public class Demo {
 4     
 5     public Demo() {
 6     }
 7 
 8     public void hello(){
 9         System.out.println("hello");
10     }
11 }
12 
试c?br />
 1 package org.duyt.test;
 2 
 3 import org.duyt.model.Demo;
 4 import org.junit.Test;
 5 import org.springframework.beans.factory.BeanFactory;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 public class SpringDemo {
 9 
10     //d指定的工厂配|文件到spring的容器,文g名可自定?/span>
11     private BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
12     
13     @Test
14     public void test(){
15         //Ҏbean的key获取对象的实?/span>
16         Demo d = (Demo) factory.getBean("helloSpring");
17         //或者直接用重载的getBeanҎQ设定好需要返回的cd
18         //Demo dd =  factory.getBean("helloSpring", Demo.class);
19         d.hello();
20         //dd.hello();
21     }
22     
23 }
24 
以上Q就是spingIOC最易的使用?/div>

]]> վ֩ģ壺 ˮ| | | | ̨| | ƽ̶| | | Ұ| ˫| Դ| | ܿ| | ɳ| Ӧñر| Զ| | Ҧ| | ޼| ֥| ̨ǰ| | μ| ƽ| | Թ| ԭ| | | | | | | | ̩˳| ͡| ̩| ̺|