AOP 的原理就是给目标对象创建代理对象,达到增强目标对象方法的目的
如果目标对象实现了接口就是用 JDK 动态代理,如果没实现接口就是用三方的 CGLIB 代理
如果不使用 AOP 想要增强一个 bean 可以这样做:
@Component
public class Test implements BeanPostProcessor, ApplicationContextAware {
private ApplicationContext applicationContext;
// ApplicationContextAware 感知回调回传 IOC 容器
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
// bean 工厂后置处理器,拦截所有的 bean
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 只增强 User bean
if (bean instanceof User) {
User user = (User) applicationContext.getBean("user");
return Proxy.newProxyInstance(
user.getClass().getClassLoader(),
user.getClass().getInterfaces(),
(Object proxy, Method method, Object[] args) -> {
// 如果不是 sayHello 方法不增强(只增强 sayHello 方法)
if (!method.getName().equals("sayHello")){
return method.invoke(user, args);
}
System.out.println("执行前.....");
Object invoke = method.invoke(user, args); // 执行 bean 本身的方法,这里就是 sayHello
System.out.println("执行后.....");
return invoke;
}
);
}
// 如果 bean 不是 User 直接返回原来的
return bean;
}
}
标签:applicationContext,JDK,Object,bean,user,AOP,method,User
From: https://www.cnblogs.com/cyrushuang/p/18486956