您的位置:首页 > 编程语言 > Java开发

Spring AOP的实现

2016-04-14 14:43 429 查看
          在这里只要记录一下AOP的注解@aspect和配置的写法:

         基于配置的applicationContext.xml的配置:
 

<bean id="one" class="com.ha.logAOP.LogAspect"/>

   

  <aop:config>

    <aop:aspect id="oneAop" ref="one">

      <aop:pointcut id="target" expression="execution(* com.ha.dao.*.*(..))"/>

      <aop:before method="doBeforeDAO" pointcut-ref="target"/>

      <aop:after method="doAfterDAO" pointcut-ref="target"/>

    </aop:aspect>

  </aop:config>

       简单解释一下:expression主要是切入点的配置:execution(* com.ha.dao.*.*(..))在com.ha.dao的任意方法。execution(* com.ha.dao. .*.*(..))在com.ha.dao的子包或者包下的任意方法。before method=“”表示前置方法。after method=“”表示后置方法。

    一个简单的例子:

public class LogAspect {

public void doBeforeDAO(JoinPoint joinPoint) {

 System.out.println("before");

}

public void doAfterDAO(JoinPoint joinpoint){
System.out.println("after");

}

}

第二种可以选择用注解:这里主要用的是@aspect标记:

@Component

@Aspect

public class LogAspect {

private final Logger log = LoggerFactory.getLogger(this.getClass());

@Before("execution(* com.ha.dao.*.*(..))")

public void doBeforeDAO(JoinPoint joinPoint) {

  System.out.println("before");

}

@After("execution(* com.ha.dao.*.*(..))")

public void doAfterDAO(JoinPoint joinpoint){
System.out.println("after");

}

}

这个需要在applicationContext.xml中加入:<aop:aspectj-autoproxy proxy-target-class="true"/>就搞定了。

注如果用配置出现:java.lang.ClassCastException: $Proxy7,在applicationContext.xml中加入<aop:aspectj-autoproxy proxy-target-class="true"/>。

  要想给某个切面中影响方法的结果,可以考虑用@around这个注解来实现。

    其实也可以使用@pointcut用某个方法(方法1上)来定义切面,然后用@before("方法1")或@after()或@around()来实现切面拦截。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: