AOP - 自己写 JDK 动态代理增强 bean

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;
    }
}
posted @   CyrusHuang  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示