在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原始的实现类。
网友评论