大家好,这次我来讲一讲Spring Aop的几个常见应用。

     首先,我们共同来理解一下Spring Aop,为什么要有它呢,它可以替代OOP吗,它在开发中能给我们带来什么呢,它又有哪些应用呢,我们带着这些疑问一起探讨Spring Aop的知识。

    第一,在使用前需要加入相应的Spring包以及Spring依赖包: 
     主包:org.springframework.aop-3.0.5.RELEASE.jar与org.springframework.aspects-3.0.5.RELEASE.jar 
     依赖包:com.springsource.org.aopalliance-1.0.0.jar与com.springsource.net.sf.cglib-2.2.0.jar
    这里需要说一下 com.springsource.net.sf.cglib-2.2.0.jar,使用cglib中的类库可以实现 拦截具体的类,不光是接口例如,可以是Controller类,大家都知道jdk 的反射机制把,cglib的功能与它类似,比它更强大。

    第二,异常处理实现: 

 



Java代码


1. public class MyException1 implements<SPAN style="COLOR: #ff6600"> HandlerExceptionResolver</SPAN>   
2.  {   
3. @Override
4. public
5. HttpServletResponse response, Object arg2, Exception ex) {   
6. "进入异常处理......");   
7. if (ex instanceof
8.           System.out.println(ex);   
9. "error", "发生了数组越界异常....");   
10. return new ModelAndView("/SpringAop/exception/error.jsp");   
11. else if (ex instanceof
12.                          System.out.println(ex);   
13. "error", "发生了运行时异常....");   
14. return new ModelAndView("/SpringAop/exception/error.jsp");   
15.             }   
16. return null;   
17. }   
18.   
19. }


public class MyException1 implements HandlerExceptionResolver
 {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object arg2, Exception ex) {
	System.out.println("进入异常处理......");
          if (ex instanceof ArrayIndexOutOfBoundsException) {
          System.out.println(ex);
          request.setAttribute("error", "发生了数组越界异常....");
          return new ModelAndView("/SpringAop/exception/error.jsp");
          } else if (ex instanceof RuntimeException) {
                         System.out.println(ex);
	           request.setAttribute("error", "发生了运行时异常....");
     return new ModelAndView("/SpringAop/exception/error.jsp");
            }
	return null;
}

}

    第三,基本拦截器实现:

 



Java代码



    1. public class MyInterceptor implements
    2. public void
    3.     HttpServletResponse arg1, Object arg2, Exception arg3)   
    4. throws
    5. "执行后....");   
    6.     }   
    7. public void
    8. HttpServletResponse arg1,Object arg2, ModelAndView arg3)    
    9. throws
    10. "执行了......");   
    11.     }   
    12.   
    13. public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2) throws
    14. "执行前....");   
    15. return false;   
    16. }


    public class MyInterceptor implements HandlerInterceptor {
    
    public void afterCompletion(HttpServletRequest arg0,
    	HttpServletResponse arg1, Object arg2, Exception arg3)
    			throws Exception {
    		System.out.println("执行后....");
    	}
    public void postHandle(HttpServletRequest arg0, 
    HttpServletResponse arg1,Object arg2, ModelAndView arg3) 
                                            throws Exception {
    		System.out.println("执行了......");
    	}
    
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2) throws Exception {
    		System.out.println("执行前....");
    		return false;
    }

        第四:以日志为例,实现使用注释实现AOP

     

        第一步: 在Spring 配置文件中加入注释

     



    Java代码


    <aop:aspectj-autoproxy />


    <aop:aspectj-autoproxy />

        第二步: 写一个日志代理

     



    Java代码



    @Before("pointCut()")



    1. public void
    2. // 获取目标类名 
    3. String className = jp.getTarget().getClass().toString();   
    4. className = className.substring(className.indexOf("com"));   
    5. // 获取目标方法签名 
    6. String signature = jp.getSignature().toString();   
    7. // 获取方法名 
    8. String methodName = signature.substring(signature.lastIndexOf(".") + 1,signature.indexOf("("));   
    9. // 获取方法参数名称 
    10. Object[] args = jp.getArgs();   
    11. if (args != null) {   
    12. for (int i = 0; i < args.length; i++) {   
    13. "args[" + i + "] ="
    14.       }   
    15. }   
    16. System.out.println("获取目标类名"
    17. System.out.println("获取目标方法签名"
    18. System.out.println("获取方法名称"
    19.   
    20. }



    @Before("pointCut()")
    public void before(JoinPoint jp) {
    // 获取目标类名
    String className = jp.getTarget().getClass().toString();
    className = className.substring(className.indexOf("com"));
    // 获取目标方法签名
    String signature = jp.getSignature().toString();
    // 获取方法名
    String methodName = signature.substring(signature.lastIndexOf(".") + 1,signature.indexOf("("));
    // 获取方法参数名称
    Object[] args = jp.getArgs();
    if (args != null) {
         for (int i = 0; i < args.length; i++) {
    	System.out.println("args[" + i + "] =" + args[i]);
          }
    }
    System.out.println("获取目标类名" + className);
    System.out.println("获取目标方法签名" + signature);
    System.out.println("获取方法名称" + methodName);
    
    }

     

        第五,事务管理

        第一步:修改Spring配置文件,加入以下代码

     



    Java代码


    "transactionManager"
     
      
    1. class="org.springframework.orm.hibernate3.HibernateTransactionManager">   
    2. "sessionFactory">   
    3. "sessionFactory"
    4.      </property>   
    5. </bean>


    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
        <ref bean="sessionFactory" />
         </property>
    </bean>

        主要是与数据库sessionFactory关联

     

        第二步:加入自动事务处理注解

     



    Java代码



    "transactionManager"



    <tx:annotation-driven transaction-manager="transactionManager" />

        下面就可以在Service层在需要进行Spring事务管理的类或方法上加入@Transaction注解,这样再进行数据库处理时,就会自动与数据库保持一致。

     

        ok,今天就写这些,另外,Spring Aop是还有好多应用,希望大家共同进步,有好的用法,共同进步。