美文网首页
spring 手动代理bean,给bean增强一些操作

spring 手动代理bean,给bean增强一些操作

作者: 蒹葭残辉 | 来源:发表于2020-04-27 23:04 被阅读0次

    在spring项目中,我们可能会经常想在一些bean在执行某些方法之前或是之后增强一些操作。

    但这些bean可能又不一定受我们控制,或是考虑到扩展性等各方面的考虑,我们通常会通过aop去实现对应的功能。

    当然,aop不是本文讲解的重点,这里给大家介绍另行的一种方式,我们在bean创建完成以后,将这个bean通过动态代理技术,将其代理一层,然后去增加一些我们自己想要执行的一些操作。

    在spring中,spring为我们提供了一个接口BeanPostProcessor,在bean初始化之前和初始化之后均会调用这里面的两个方法,他们的返回值就是bean你要返回的对象。故我们如果将这个Bean使用动态代理技术去代理一层,也可以轻松的实现代理了。

    比如,我们代理DataSource对象,代码如下:

    @RequiredArgsConstructor
    public class DatasourceProcessor implements BeanPostProcessor {
    
        private final SqlTranslateManager sqlTranslateManager;
    
        @Override
        public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
            if(o instanceof DataSource){
                Enhancer enhancer = new Enhancer();
                enhancer.setSuperclass(o.getClass());
                enhancer.setCallback(new DataSourceProxy((DataSource) o,sqlTranslateManager));
    //            Object dataSourceProxy = Proxy.newProxyInstance(o.getClass().getClassLoader(), new Class[]{DataSource.class},
    //                    new DataSourceProxy((DataSource) o,sqlTranslateManager));
                return enhancer.create();
            }
            return o;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
            return o;
        }
    }
    
    

    这次通过cgLib技术,动态生成了一个dataSource子类,并将这个子类替换了DataSource原始的实现类。

    相关文章

      网友评论

          本文标题:spring 手动代理bean,给bean增强一些操作

          本文链接:https://www.haomeiwen.com/subject/rabpwhtx.html