`
zjnbshifox
  • 浏览: 316154 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

AspectJ首次试用和Spring中的AOP

    博客分类:
  • Java
阅读更多
在spring中,本来就是有对aop编程的支持,需要把需要管理的内容都注册到Spring中,像这样
<beans><bean id="businesslogicbean"><bean id="beanTarget" class="BusinessLogic"><bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"><bean id="loggingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
xml 代码
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC  "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3.   
  4. <beans>  
  5. <bean id="businesslogicbean"  
  6.     class="org.springframework.aop.framework.ProxyFactoryBean">  
  7.         <property name="proxyInterfaces">  
  8.             <value>IBusinessLogic</value>  
  9.         </property>  
  10.         <property name="target">  
  11.             <ref local="beanTarget"/>  
  12.         </property>  
  13.         <property name="interceptorNames">  
  14.             <list>  
  15.                 <value>loggingAdvisor</value>  
  16.             </list>  
  17.         </property>  
  18.     </bean>  
  19.   
  20.     <bean id="beanTarget"     class="BusinessLogic"/>  
  21. <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">  
  22.   <property name = "proxyTargetClass" value = "true"/>  
  23. </bean>   
  24. <bean id="loggingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">  
  25.      <property name="patterns">  
  26.           <value>.*</value>  
  27.      </property>  
  28.      <property name="advice">  
  29.           <bean class="com.spring.aop.LoggingAdvice"/>  
  30.      </property>  
  31. </bean>  
  32. </beans>  

</bean>
简单描述一下:
xml 代码
 
  1. <property name="proxyInterfaces">  
  2.             <value>IBusinessLogic</value>  
  3.         </property>  
  4.         <property name="target">  
  5.             <ref local="beanTarget"/>  
  6.         </property>  

<property name="proxyInterfaces"></property> <property name="target"><ref local="beanTarget"></ref>
这段话表示beanTarget注册的类必须实现IBussinessLogic接口,当然,这个也不是必须的,如果beanTarget指向的类没有实现任何接口,可以把
xml 代码
 
  1. <property name="proxyInterfaces">  
  2.             <value>IBusinessLogic</value>  
  3.         </property>  

<property name="proxyInterfaces">
<value></value>
        </property>
这部分去掉,这里需要注意的是,如果有接口的话,匹配的是接口中的方法。
<property name="patterns">
      <value>
xml 代码
 
  1. <property name="patterns">  
  2.           <value>.*</value>  
  3.      </property>  
</value>
     </property>
表示的是正则表达式来匹配方法,这里表示所有的方法,
<property name="advice">
    
xml 代码
 
  1. <property name="advice">  
  2.           <bean class="com.spring.aop.LoggingAdvice"/>  
  3.      </property>  
<bean class="com.spring.aop.LoggingAdvice">
     </bean>
可以是一个list列表,这里只有一个,下面看看com.spring.aop.LoggingAdvice这个类
package com.spring.aop;

import java.lang.reflect.Method;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;

public class LoggingAdvice implements MethodBeforeAdvice, AfterReturningAdvice,
        ThrowsAdvice {
    Log logger = LogFactory.getLog(LoggingAdvice.class);
    public void before(Method method, Object[] args, Object target)//方法执行之前
            throws Throwable {
        if (logger.isInfoEnabled()) {
             logger.info("About to call method: " + target.getClass().getName() + "." + method.getName());
          }

    }
//方法返回之后执行
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
         if (logger.isInfoEnabled()) {
             logger.info("Successfully returned from method: " + target.getClass().getName() + "." + method.getName());
          }
    }
    //方法抛出异常的时候执行
    public void afterThrowing(Method method, Object[] args, Object target, Throwable throwable) {
          logger.error("Exception of type " + throwable.getClass().getName() + " thrown in method " + target.getClass().getName() + "." + method.getName() + ". Message: " + throwable.getMessage());
    }

}

这种情况下,每个类都需要去注册,似乎做起来有点复杂了。而且如果对象不是通过spring的context得到的话,也是不行的。
幸好有AspectJ,从eclipse.org下载AspectJ的插件AJDT,在原来系统上增加AspectJ的特性,新建一个AJ:
package com.aspect;

public aspect ExceptionHandler {
    org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(ExceptionHandler.class);
    private DefaultExceptionHandler exceptionHandler;

    public void setExceptionHandler(DefaultExceptionHandler exceptionHander) {
        this.exceptionHandler = exceptionHander;
    }
   
    pointcut afterException():call(* *(..) );
   
    after() throwing(Exception ex) : afterException() {
        log.info(thisJoinPoint.getTarget().getClass().getName());
        if (exceptionHandler != null) exceptionHandler.onException(ex);
      } 

}

这样在每次出现Exception的时候,都会去执行log了,当然这个也可以注册到spring中,让spring来管理:
<bean name="ExceptionHandlingAspect" class="com.aspect.ExceptionHandler" factory-method="aspectOf">
xml 代码
 
  1. <bean name="ExceptionHandlingAspect"   class="com.aspect.ExceptionHandler"    factory-method="aspectOf">  
  2.      <property name="exceptionHandler">  
  3.         <ref bean="MyExceptionHandler"/>  
  4.      </property>  
  5.    </bean>  
  6.   
  7.    <bean name="MyExceptionHandler"   
  8.          class="com.aspect.DefaultExceptionHandler">  
  9.    </bean>  
<bean name="MyExceptionHandler">
   </bean>
com.aspect.DefaultExceptionHandler的源代码:
package com.aspect;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;



public class DefaultExceptionHandler {
    Log log = LogFactory.getLog(DefaultExceptionHandler.class);
    private int handledCount = 0;
   
    public void onException(Exception ex) {
        this.handledCount++;
        log.error("Got an Exception",ex);
    }
   
    public int getHandledExceptionCount() {
        return this.handledCount;
    }
}
总结:
1、感觉Spring越来越强大,Spring已经集成了AspectJ5,不过我看到的只是皮毛
2、这种情况下,似乎只是静态加强,源代码似乎在被AspectJ的编译器重新编译过才有效,如果得到的是class文件,那会怎么样?应该怎么去做呢?有待于进一步了解…
</bean></property> </property> </bean></bean></bean></beans>
分享到:
评论

相关推荐

    Spring的AOP依赖包-AspectJ

    Spring的AOP(面向切面编程)是一种强大的编程模型,它允许程序员在不修改源代码的情况下,通过插入额外的...在Spring4.3.7版本中,AspectJ的集成进一步完善了Spring的AOP框架,为开发者提供了更丰富的工具和可能性。

    aspectj的jar spring使用aop需要的jar

    综上所述,为了在Spring中利用AspectJ的全部功能,你需要将对应的AspectJ JAR文件加入到项目类路径中,然后按照Spring文档或AspectJ文档的指导配置和使用AOP。这将使你的代码更加模块化,降低耦合,提高可维护性。

    spring-aop-jar

    总结起来,"spring-aop-jar"涉及了Spring框架中的面向切面编程模块,包括Spring AOP和AspectJ的集成。通过理解和熟练使用这些组件,开发者可以有效地解耦关注点,提高代码的可维护性和可扩展性。在实际项目中,结合...

    @AspectJ配置Spring AOP,demo

    通过以上内容,我们可以理解如何使用@AspectJ配置Spring AOP,包括创建切面类、定义切点表达式、编写不同类型的通知,以及在Spring配置中启用和装配切面。实际操作中,你可以参考提供的资源文件进行学习和实践。

    Spring使用AOP的三个jar包

    在Java世界中,Spring框架以其强大的功能和灵活性深受开发者喜爱,尤其在面向切面编程(AOP)方面,Spring提供了非常全面的支持。AOP是一种编程范式,它允许程序员定义“切面”,这些切面可以封装关注点,如日志、...

    spring对AOP的支持(使用AspectJ进行AOP演示)

    Spring 提供了两种主要的 AOP 实现方式:基于代理的和基于 AspectJ 的。基于代理的方式是 Spring 默认的实现,它通过 JdkDynamicProxy 或 CGLIB 创建代理对象来实现切面。而基于 AspectJ 的方式则更为强大,它允许...

    spring AOP 实例(@AspectJ)

    一个基于@AspectJ的spring2.0 AOP应用实例,很小很简单,没有任何额外信息,最适合AOP入门学习。使用log4j打印信息。把项目直接import进myeclipse就可以使用啦......

    spring-boot aop

    织入(Weaving)是将切面应用到目标对象以创建新的代理对象的过程,这在Spring中通常是自动完成的。 在Spring Boot项目中启用AOP,我们需要以下步骤: 1. **引入依赖**:在`pom.xml`或`build.gradle`文件中添加...

    Spring 使用AspectJ 实现 AOP

    在Spring中,我们可以使用AspectJ来实现AOP,AspectJ是一个强大的AOP框架,它可以与Spring无缝集成,提供更细粒度的控制。 首先,让我们了解一下AOP中的通知类型: 1. **前置通知**(Before Advice):在目标方法...

    AspectJ in Action: Enterprise AOP with Spring Applications

    综上所述,《AspectJ in Action: Enterprise AOP with Spring Applications》这本书不仅是一本关于面向切面编程的权威指南,还提供了大量实用案例和最佳实践建议,对于希望深入了解Spring-AspectJ集成的企业级开发者...

    spring和aspectj的aop实验

    标题"spring和aspectj的aop实验"表明我们将探讨如何在Spring中使用AspectJ进行AOP实践。这通常涉及到创建切面、定义通知、配置织入策略以及测试其效果。 1. **什么是AOP** AOP的核心概念是切面(Aspect),它封装...

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    在Spring中,Joinpoint主要指的是方法的调用。 2. Advice(通知):Advice是在特定Joinpoint上执行的代码片段。Spring AOP提供了五种不同类型的Advice:Before、Afterreturning、Afterthrowing、Around和...

    Spring的AOP实例(XML+@AspectJ双版本解析+源码+类库)

    在Spring中,使用XML配置AOP时,我们需要在配置文件中定义切入点(pointcut)和通知(advice)。切入点指定何时应用通知,而通知则定义了实际要执行的行为。例如,我们可以定义一个切入点表达式来匹配特定的方法...

    Spring AOP 概念理解及@AspectJ支持

    **Spring AOP 概念理解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它允许我们通过...理解和熟练运用Spring AOP及其@AspectJ注解是每个Spring开发者必备的技能之一。

    Spring AOP的AspectJ支持jar包

    Spring AOP的AspectJ支持jar包; 包括: com.springsource.net.sf.cglib-2.2.0.jar com.srpingsource.org.aopalliance-1.0.0.jar com.srpingsource.org.aspectj.weaver-1.68.RELEASE.jar

    Spring3.0AOP所需jar包

    描述中的“额外jar包”可能指的是如AspectJ的库,AspectJ是一个强大的静态和动态AOP框架,可以与Spring AOP集成。AspectJ的编译器(aspectjrt.jar和aspectjweaver.jar)用于在编译时或运行时织入切面,而...

    Spring中aop编程所需要的jar包

    为了在Spring中进行AOP编程,我们需要一些特定的JAR包。以下是对这些关键组件的详细说明: 1. **Spring核心包**: - `spring-core.jar`: 这是Spring框架的基础,包含了IoC(Inversion of Control,控制反转)容器...

    aspectj+aspectjrt+aspectjweaver+aopalliance.rar

    4. **AOP Alliance**:AOP Alliance是一个较小的库,提供了AOP框架之间的公共接口,比如Spring AOP和AspectJ。它定义了一些通用的切面接口,使得在不同AOP框架间切换变得更加容易,增强了兼容性和互操作性。 使用...

    Spring AOP 16道面试题及答案.docx

    Spring支持两种AOP的实现方式:Spring AspectJ注解风格和Spring XML配置风格。使用AspectJ注解风格是最常见的,它允许开发者直接在方法上使用注解来定义切面。 Spring AOP中有五种不同类型的的通知(Advice): 1....

    springboot+aspect实现springaop拦截指定方法.zip

    综上所述,SpringBoot结合AspectJ实现SpringAOP拦截指定方法,主要涉及到Spring AOP的原理、切点和通知的定义、自定义注解的使用,以及如何在SpringBoot项目中整合AspectJ进行更复杂的切面编程。通过这些知识点,...

Global site tag (gtag.js) - Google Analytics