Spring之AOP的注解方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011301372/article/details/81506653

步骤一:创建Javaweb项目,引入具体的开发的jar包

  • 先引入Spring框架开发的基本开发包
  • 再引入Spring框架的AOP的开发包
    • Spring的传统AOP的开发的包
      • Spring-aop-4.2.4RELEASE.jar
      • com.springsource.org.aopalliance-1.0.0.jar
    • aspectJ的开发包
      • com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
      • spring-aspects-4.2.4.RELEASE.jar

步骤二:创建Spring的配置文件,引入具体的AOP的schema约束

<?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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd">


</beans>

步骤三:创建包结构,编写具体的接口和实现类

  • com.xd.demo1
    • CustomerDao——接口
    • CustomerDaoImpl——实现类

步骤四:将目标类配置到Spring中

<bean id = "cutomerDao" class="com.xd.demo1.CustomerDaoImpl"/>

步骤五:定义切面类

  • 添加切面和通知的注解
    • @Aspect—-定义切面类的注解
    • 通知类型(注解的参数是切入点的表达式)
      • @Before—-前置通知
      • @AfterReturning—-后置通知
      • @Around—-环绕通知
      • @After—-最终通知
      • @AfterThrowing—-异常抛出通知
@Aspect
public class MyAspectAnno {
    //通知类型:@Before前置通知(切入点的表达式)
    @Before(value="execution(public * cn.xd.demo1.CustomerDaoImpl.save())")
    public void log(){
        System.out.println("记录日志。。。");

    }

}

步骤六:在配置文件中定义切面类

<bean id="myAspectAnno" class="cn.xd.demo1.MyAspectAnno"/>

步骤七:在配置文件中开启自动代理

<aop:aspectj-autoproxy/>

步骤八:完成测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo1 {
    @Resource(name="customerDao")
    private CustomerDao customerDao;
    @Test
    public void run1(){
        customerDao.save();
        customerDao.update();


    }
}

通知类型

  • 通知类型
    • @Before—-前置通知
    • @AfterReturning—-后置通知
    • @Around—-环绕通知
    • @After—-最终通知
    • @AfterThrowing—-异常抛出通知
  • 配置通用的切入点
    • 使用@Ponitcut定义通用的切入点
@Aspect
public class MyAspectAnno{
    @Before(vlaue="MyAspectAnno.fn()")
    public void log(){
        System.out.println("记录日志。。。");
    }
    @Pointcut(value="execution(public void cn.xd.demo1.CustomerDaoImpl.save())")
    public void fn(){}

}
@Aspect
public class MyAspectAnno {
    //通知类型:@Before前置通知(切入点的表达式)
    @Before(value="MyAspectAnno.fn()")
    public void log(){
        System.out.println("记录日志。。。");

    } 
    //环绕通知
    @Around(value="MyAspectAnno.fn()")
    public void around(ProceedingJoinPoint jointPoint){
        System.out.println("环绕通知1。。。");
        try {
            jointPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("环绕通知2。。。");
    }

    //自定义切入点
    @Pointcut(value="public * cn.zst.demo1.CustomerDaoImpl.save())")
    public void fn(){}

}

猜你喜欢

转载自blog.csdn.net/u011301372/article/details/81506653