AOP
AOP就是通过BeanPostProcessor的postProcessorAfterInitialization方法(初始化后)实现的
AOP常见的时候方法有cglib与JDK动态代理,项目中采用JDK动态代理实现AOP。使用JDK动态代理要求bean实现接口,项目中定义了UserService这个接口
public interface UserService {
void test();
}
UserServiceImpl实现了UserService接口
public class UserServiceImpl implements UserService
在bean生命周期最后一步-初始化后,调用beanPostProcessor的postProcessorAfterInitialization方法,生成代理对象,将代理对象注入到spring容器中,原始对象target没有注入到spring容器中。
// postProcessorAfterInitialization 初始化后方法
for (BeanPostProcessor beanPostProcessor : beanPostProcessorList) {
// instance引用可能改变,可能返回代理对象的引用
instance = beanPostProcessor.postProcessAfterInitialization(instance, beanName);
}
postProcessorAfterInitialization方法具体实现
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("初始化后");
if ("userService".equals(beanName)) {
Object proxyInstance = Proxy.newProxyInstance(ZhouyuBeanPostProcessor.class.getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理逻辑"); // aop找切点pointCut:代理逻辑定义在哪些类上
return method.invoke(bean,args);
}
});
// 直接返回代理对象
return proxyInstance;
}
// 返回原始对象
return bean;
}