Fork me on GitHub

Spring 框架的AOP之注解的方式

1. 环境搭建

1.1 导入 jar 包

  • Spring 框架的基本开发包(6个);
  • Spring 的传统AOP的开发包
    • spring-aop-4.3.10.RELEASE
    • org.aopalliance-1.10.0 (在 Spring 依赖包中)
  • aspectJ 的开发包
    • org.aspectj.weave-1.6.8.RELEASE.jar (在 Spring 依赖包中)
    • spring-aspects-4.3.10.RELEASE.jar

1.2 编写 applicationContext.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: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">

    <!-- 开启自动代理 -->
    <aop:aspectj-autoproxy/>

    <!-- 配置目标对象 customerDao -->
    <bean id="customerDao" class="com.itheima.demo.CustomerDaoImpl"/>

    <!-- 配置切面类 -->
    <bean id="myAspectAnno" class="com.itheima.demo.MyAspectAnno"/>

</beans>

1.3 创建包结构,编写具体的接口和实现类

  • com.itheima.demo
    • CustomerDao: 接口;
    • CustomerDaoImpl: 实现类;
  • 在 applicationContext.xml 中配置
// CustomerDao.java
    public interface CustomerDao{
        public void save();
    }

// CustomerDaoImpl.java
    public class CustomerDaoImpl{
        public void save(){
            System.out.println("保存客户...");
        }
    }

// 编写测试方法
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class Demo{
        @Resource(name="customerDao")
        private CustomerDao customerDao;

        @Test
        public void fun(){
            customerDao.save();
        }
}

// 编写切面类
    @Aspect
    public class MyAspectAnno{
        // 通知(增前方法)
        // @Before(切入点表达式)
        @Before(value="execution(public void com.itheima.demo.CustomerDaoImpl.save())")
        public void log(){
            System.out.println("记录日志...");
        }
    }

1.4 在 applicationContext.xml 中开启自动代理

<aop:aspectj-autoproxy/>

1.5 通知类型

  • @Before: 前置通知;
  • @AfterReturning: 后置通知;
  • @Around: 环绕通知;
  • @After: 最终通知;
  • @AfterThrowing: 异常抛出通知;

1.6 配置通用的切入点

  • 使用 @Pointcut 配置通用的切入点
// 示例
@Aspect
public class MyAspectAnno{
    @Before(value="MyAspectAnno.fn()")
    public void log(){
        System.out.println("记录日志...");
    }

    @After(value="MyAspectAnno.fn()")
    public void after(){
        System.out.println("最终通知...");
    }

    // 自定义切入点
    @Pointcut(value="execution(public void com.itheima.demo.CustomerDaoImpl.save())")
    public void fn(){}
}

参考资料

posted @ 2017-10-24 09:09  小a的软件思考  阅读(168)  评论(0编辑  收藏  举报