基本概念
Aspect Oriented Programming,面向切面编程
作用:对某一些方法进行增强
与动态代理的区别:
- 动态代理:委托类中的全部方法
- AOP:容器中的组件里的指定的方法
底层使用的代理:JDK和cglib
编程术语
委托类(target):也叫目标类,被代理类,有方法需要被增强的类
代理类(proxy):方法已经增强的类
织入(weaver):通过委托类生成代理对象的动作
切入点(Pointcut):所有可能被增强的方法
连接点(JoinPoint):代理对象正在执行的增强的方法
通知(Advice):通知切入点范围的方法要做什么样的增强
入门案例
现在有委托类:
@Service
public class UserServiceImpl implements UserService{
@Override
public void sayHello(String name) {
System.out.println("hello " + name);
}
}
需求是在执行sayHello()方法的时候会在执行前输出“正道的光”,执行后输出“照在大地上”
- 先写通知类
@Component
public class CustomAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
//method.invoke(object,args);
// 执行的是委托类的代码
System.out.println("正道的光");
Object proceed = methodInvocation.proceed();// 执行的是委托类的代码
System.out.println("照在大地上");
return proceed;
}
}
- 配置文件中配置:
<bean id="userServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--委托类组件-->
<property name="target" ref="userServiceImpl"/>
<!--通知-->
<property name="interceptorNames" value="customAdvice"/>
</bean>