AOP
Aspect(切面)
* 通常是一个类;
* 用来定义切点和通知;
JointPoint(连接点)
* 被增强的具体方法;
Advice(通知)
* 执行的增强处理;
* before、after、afterReturning、afterThrowing、around
Pointcut(切点):
* 如果把连接点比喻成数据记录, 那么切点就是查询条件;
* 一个切点可以匹配多个连接点;
* 理解:
* 可以把切点理解为连接点的容器;
* 定义一个切点(连接点容器)
* 容器所有连接点都会被增强
* AOP切面使用了动态代理技术
* AOP初始化容器时, 会判断bean是否有切面;
* 如果有切面, 则使用JDK/CGLIB动态生成代理类字节码文件;
* 创建的bean对象为代理对象;
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)
modifiers-pattern:方法的操作权限
ret-type-pattern:返回值【必填】
declaring-type-pattern:方法所在的包
name-pattern:方法名 【必填】
parm-pattern:参数名
throws-pattern:异常
CODE
* spring中AOP有两种实现: xml和注解;
* 下面的demo是注解形式的实现;
* IUser: 接口;
* UserImpl: 实现;
* MyAspect: 切面;
<!-- aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
<!-- 启动对@AspectJ注解的支持 -->
<aop:aspectj-autoproxy/>
<!-- 配置bean -->
<bean id="user" class="spring.aop.IUserImpl"/>
<!-- 切面也必须配置成bean -->
<bean id="myAspect" class="spring.aop.MyAspect"/>
public interface IUser {
public void say(String say);
}
public class IUserImpl implements IUser {
@Override
public void say(String say) {
System.out.println(say);
}
}
//声明这是一个组件
@Component
//声明这是一个切面 Bean
@Aspect
public class MyAspect {
//配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
@Pointcut("execution(* spring.aop.*User*.say(..))")
public void aspect(){ }
//方法执行前通知
@Before("aspect()")
public void before(JoinPoint joinPoint){
Object [] args = joinPoint.getArgs(); //获取参数, 这里就一个参赛;
System.out.println("参数: " + args[0]);
System.out.println("before");
}
@After("aspect()")
public void after(JoinPoint joinPoint){
System.out.println("after");
}
@Around("aspect()")
public void around(JoinPoint joinPoint) throws Throwable{
System.out.println("around before");
((ProceedingJoinPoint) joinPoint).proceed();
System.out.println("around after");
}
//返回通知
@AfterReturning("aspect()")
public void afterReturn(JoinPoint joinPoint){
System.out.println("return");
}
//配置抛出异常后通知
@AfterThrowing(pointcut="aspect()", throwing="ex")
public void afterThrow(JoinPoint joinPoint, Exception ex){
System.out.println("exception");
}
}
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("config/applicationContext.xml");
IUser user = (IUser) factory.getBean("user");
user.say("aa");
}