Spring AOP(四)基于AspectJ的AOP开发

实现基于AspectJ的AOP开发方式:

  • 注解方式
  • XML方式
    AspectJ是一个基于Java语言的AOP框架;Spring2.0以后新增了对AspectJ切点表达式支持
    @AspectJ是AspectJ1.5新增功能,通过JDK1.5注解技术,可以直接在Bean类中定义切面

@AspectJ提供不同的通知类型

  • @Before 前置通知,相当于BeforeAdvice
  • @AfterReturning 后置通知,相当于AfterReturningAdvice
  • @Around 环绕通知,相当于MethodInterceptor
  • @After 最终final通知,不管是否异常,该通知都会执行
  • @AfterThrowing 异常抛出通知,相当于ThrowAdvice
  • @DeclareParents 引介通知,相当于IntroductionIntercepter

以注解方式实现上面的通知
在这里插入图片描述

<!---applicationContext3.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--开启AspectJ的注解开发,自动代理-->
    <aop:aspectj-autoproxy/>
    <!--目标类-->
    <bean id="productDao" class="com.imooc.aspectJ.demo3.ProductDao"/>
    <!--切面-->
    <bean class="com.imooc.aspectJ.demo3.MyAspectJAnnotation"/>
</beans>
//ProductDao 目标类
package com.imooc.aspectJ.demo3;

public class ProductDao {
    public void find(){
        System.out.println("find ....");
    }

    public void update(){
        System.out.println("update....");
        int i =1/0;//验证是否抛出异常
    }

    public void delete(){
        System.out.println("delete......");
    }

    public String save(){
        System.out.println("save .......");
        return "Hello Ally441";
    }

    public void findOne(){
        System.out.println("findOne .......");
        int i =1/0;//验证抛出异常最终方法是否执行
    }
}
package com.imooc.aspectJ.demo3;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

/**
 * 切面类
 */
@Aspect
public class MyAspectJAnnotation {
    @Before(value="pointcut1()")
    public void Before(JoinPoint joinPoint){
        System.out.println("前置通知....."+joinPoint);
    }

    @AfterReturning(value = "pointcut2()",returning = "result")
    public void AfterReturning(Object result){
        System.out.println("后置通知....."+result);
    }

    @Around(value = "pointcut3()")
    public Object Around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕通知前......");
        Object object = joinPoint.proceed();
        System.out.println("环绕通知后......");
        return object;
    }

    @AfterThrowing(value = "pointcut4()" ,throwing = "e")
    public void AfterThrowing(Throwable e){
        System.out.println("异常抛出通知....."+e.getMessage());
    }

    @After(value = "pointcut5()")
    public void After(){
        System.out.println("最终通知......");
    }
    //通过Pointcut定义切点,因为如果在每个通知里面定义切点,切点重复,会造成工作量大,不易维护
    @Pointcut(value = "execution(* com.imooc.aspectJ.demo3.ProductDao.find(..))")
    public void pointcut1(){}

    @Pointcut(value = "execution(* com.imooc.aspectJ.demo3.ProductDao.save(..))")
    public void pointcut2(){}

    @Pointcut(value = "execution(* com.imooc.aspectJ.demo3.ProductDao.delete(..))")
    public void pointcut3(){}

    @Pointcut(value = "execution(* com.imooc.aspectJ.demo3.ProductDao.update(..))")
    public void pointcut4(){}

    @Pointcut(value = "execution(* com.imooc.aspectJ.demo3.ProductDao.findOne(..))")
    public void pointcut5(){}
}
//实现类
package com.imooc.aspectJ.demo3;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext3.xml")
public class Springdemo3 {

    @Resource(name = "productDao")
    private ProductDao productDao;

    @Test
    public void demo1(){
        productDao.find();
        productDao.delete();
        productDao.save();
        productDao.findOne();
        productDao.update();
    }
}

运行结果:
在这里插入图片描述

以XML方式来实现上面的通知
在这里插入图片描述

<!--applicationContext4.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--XML的配置方式完成AOP的开发-->
    <!--配置目标类-->
    <bean id="customerDao" class="com.imooc.aspectJ.demo2.CustomerDaoImpl"/>

    <!--配置切面类-->
    <bean id="myAspectXml" class="com.imooc.aspectJ.demo2.MyAspectXml"/>

    <!--aop的配置-->
    <aop:config>
        <!--定义切入点:哪些类的哪些方法需要增强-->
        <aop:pointcut id="pointCut1" expression="execution(* com.imooc.aspectJ.demo2.CustomerDao.update(..))"/>
        <aop:pointcut id="pointCut2" expression="execution(* com.imooc.aspectJ.demo2.CustomerDao.delete(..))"/>
        <aop:pointcut id="pointCut3" expression="execution(* com.imooc.aspectJ.demo2.CustomerDao.save(..))"/>
        <aop:pointcut id="pointCut4" expression="execution(* com.imooc.aspectJ.demo2.CustomerDao.findOne(..))"/>
        <aop:pointcut id="pointCut5" expression="execution(* com.imooc.aspectJ.demo2.CustomerDao.findAll(..))"/>

        <!--配置切面-->
        <aop:aspect ref="myAspectXml">
            <aop:before method="before" pointcut-ref="pointCut1"/>
            <aop:after-returning method="afterReturning" pointcut-ref="pointCut2" returning="object"/>
            <aop:around method="around" pointcut-ref="pointCut3"/>
            <aop:after-throwing method="afterThrowing" pointcut-ref="pointCut4" throwing="e"/>
            <aop:after method="after" pointcut-ref="pointCut5"/>
        </aop:aspect>
    </aop:config>

</beans>
//目标类
package com.imooc.aspectJ.demo4;

public class ProductDao {
    public void find(){
        System.out.println("find ....");
    }

    public void update(){
        System.out.println("update....");
        int i =1/0;
    }

    public void delete(){
        System.out.println("delete......");
    }

    public String save(){
        System.out.println("save .......");
        return "Hello Ally441";
    }

    public void findOne(){
        System.out.println("findOne .......");
    }
}
//切面类
package com.imooc.aspectJ.demo4;


import org.aspectj.lang.ProceedingJoinPoint;

public class MyAspectJXml {
    public void before(){
        System.out.println("前置增强.......");
    }

    public void afterReturning(Object object){
        System.out.println("后置增强......."+object);
    }

    public Object Around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕增强前.......");
        Object object = joinPoint.proceed();
        System.out.println("环绕增强后.......");
        return object;
    }

    public void afterThrowing(Throwable e){
        System.out.println("异常抛出通知......."+e.getMessage());
    }

    public void after(){
        System.out.println("最终通知.......");
    }
}
//测试类
package com.imooc.aspectJ.demo4;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext4.xml")
public class Springdemo4 {
    @Autowired
    private ProductDao productDao;

    @Test
    public void demo1(){
        productDao.find();
        productDao.findOne();
        productDao.delete();
        productDao.save();
        productDao.update();
    }
}

运行结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Ally441/article/details/88644120