美文网首页
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增强一些操作

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

  • 34 Spring自动代理创建者实例

    在上几篇介绍 Spring AOP的文章中, 必须手动创建一个代理bean(ProxyFactryBean),对每...

  • cglib简单使用

    net.sf.cglib.beans 中有些工具可以动态生成、操作Bean,对Bean进行一些增强操作 net.s...

  • java动态代理动态在哪里?

    最近在学习spring,其中大量使用了动态代理技术来增强Bean的功能。所以有必要捋一捋动态代理。 1、代理 代理...

  • Spring注解--AOP原理(五):代理对象目标方法的执行

    在前面的章节中,谈到代理对象的创建:参考Spring注解--AOP原理(四):业务bean与代理bean的创建, ...

  • 06-Spring 核心

    Spring做了两件事:1.管理Bean的生命周期 2. 创建Bean的代理对象 一、Spring容器 1.1 ...

  • 十四、spring aop之创建代理

    接上一节十三、spring aop之查找匹配的增强器,在获取所有对应bean的增强器后,便可以进行代理的创建。 初...

  • Spring_platform

    Spring的注解 ,长生命周期的bean依赖于短生命周期的bean时,对短生命周期的bean使用代理。

  • Spring Bean加载

    Spring Bean加载 Spring Bean加载的入口: 可以看到Spring Bean加载主要在doGet...

  • Spring 容器

    Spring 容器 创建Bean 管理Bean的生命周期 组装Bean 配置Bean Spring容器是Sprin...

网友评论

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

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