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

2020-04-27  本文已影响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原始的实现类。

上一篇 下一篇

猜你喜欢

热点阅读