简介:
- AOP Aspect Oriented Programing 面向切面编程
- AOP采取==横向抽取==机制,取代了传统==纵向继承==体系重复性代码(性能监视、事务管理、安全检查、缓存)
- Spring中的Aop是纯Java来实现的,使用==动态代理==的方式增强代码
- AOP不是由Spring提出来的,是由AOP联盟定义的
专业术语:
- Joinpoint(连接点) :委托类中可以被增强的方法
- ==Pointcut(切入点) :切点 ,要被增强的方法==
- ==Advice(通知/增强) :增强的代码==
- Target(目标对象) :委托对象
- Weaving(织入) :把增强应用切点的过程
- Proxy(代理): 一个类被AOP织入增强后,就产生一个结果代理类
- ==Aspect(切面): 是切点和通知的结合==
Aspect的增强类型:
- @Before 前置通知
- @AfterReturning 后置通知
- @Around 环绕通知
- @AfterThrowing抛出通知
- @After 最终final通知
实现:
1.引入pom依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
2.配置自动代理和注解扫描器
<?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"
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-4.0.xsd">
<!--配置注解扫描器-->
<context:component-scan base-package="com.it.bigdata"/>
<!--开启aop自动代理-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
3.编写dao(委托类)
package com.it.bigdata;
import com.sun.xml.internal.bind.v2.model.core.ID;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
public void addUser(User user) {
System.out.println("添加用户.." + user);
}
public void deleteUser(Integer id) {
System.out.println("删除用户" + id);
}
public void findUser(Integer id) {
System.out.println("查询用户" + id);
}
public void updateUser(Integer id) {
System.out.println("修改用户" + id);
}
}
4.编写切面
package com.it.bigdata;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
/**
* 切面 = 切点(切点表达式) + 通知(要增强的代码,方法)
*/
@Aspect
@Component
public class MyAspect {
/**
* 通知
*/
@Before("execution( * com.it.bigdata.UserDao.delete*(..))")
public void advice1() {
System.out.println("通知1");
}
}
5.调用dao的方法
userDao.deleteUser(12);