12-spring代理

准备bean

@Component
public class Bean200 {
}


@Slf4j
@Component
public class Bean100 {

    protected Bean200 bean2;
    protected boolean initialized;

    @Autowired
    public void setBean2(Bean200 bean2) {
        log.warn("Bean1#setBean2({})", bean2);
        this.bean2 = bean2;
    }

    public Bean200 getBean2() {
        log.warn("Bean2#getBean2()");
        return bean2;
    }

    @PostConstruct
    public void init() {
        log.warn("Bean1#init()");
        this.initialized = true;
    }

    public boolean isInitialized() {
        return initialized;
    }


    // 成员方法会被增强
    public void m1() {
        System.out.println("Bean100.m1");
    }

    // final  static private方法均不会增强
    public final void m2() {
        System.out.println("Bean100.m2");
    }

    public static void m3() {
        System.out.println("Bean100.m3");
    }

    private void m4() {
        System.out.println("Bean100.m4");
    }

}

准备aspect

@Component
@Aspect
public class Bean1Aspect {


    // 故意对Bean1中所有方法进行增强
    @Before("execution(* com.you.meet.nice.test.web.spring.aop.spring.springaop.Bean100.*(..))")
    public void before() {
        System.out.println("Bean1Aspect.before...");
    }

}

测试

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class, MapperAutoConfiguration.class})
public class TestSpringAOP {

    @SneakyThrows
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(TestSpringAOP.class, args);
        Bean100 proxy = applicationContext.getBean(Bean100.class);

        showProxyAndTarget(proxy);

        // 调用目标方法   方法会被增强  final  static private除外
        System.out.println("proxy.getBean2() = " + proxy.getBean2());
        System.out.println("proxy.isInitialized() = " + proxy.isInitialized());

        proxy.m1();
        proxy.m2();
        proxy.m3();
        Method m4 = Bean100.class.getDeclaredMethod("m4");
        m4.setAccessible(true);
        m4.invoke(proxy);


        applicationContext.close();

    }

    @SneakyThrows
    private static void showProxyAndTarget(Bean100 proxy) {
        System.out.println("====>代理类" + proxy + "中的成员变量");
        // 全局变量的默认值
        System.out.println("proxy.initialized = " + proxy.initialized);
        System.out.println("proxy.bean2 = " + proxy.bean2);

        if (proxy instanceof Advised) {
            Bean100 bean1 = (Bean100) ((Advised) proxy).getTargetSource().getTarget();
            System.out.println("====>目标类" + bean1 + "中的成员变量");
            System.out.println("bean1.initialized = " + bean1.initialized);
            System.out.println("bean1.bean2 = " + bean1.bean2);
        }

    }


}

小结

  1. 依赖注入和初始化影响的原始对象�
  2. 代理与目标是两个对象,两者成员变量并不共用�
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
dynamic-datasource-spring-boot-starter 是一个基于 Spring Boot 的动态数据源库。它提供了在运行时动态切换数据源、动态创建数据源以及多租户的支持。 对于 dynamic-datasource-spring-boot-starter 的源码分析,可以从以下几个方面进行思考: 1. 数据源的自动装配:源码中可能会使用 Spring Boot 的自动配置功能,通过扫描配置类或者注解的方式,自动将数据源相关的类和 bean 注入到应用程序中。 2. 动态切换数据源的实现:动态切换数据源是 dynamic-datasource-spring-boot-starter 的核心功能之一。源码中可能会涉及到 AOP、动态代理等技术,通过拦截器或者代理的方式,在运行时根据特定条件切换数据源。 3. 动态创建数据源的实现:动态-datasource-spring-boot-starter 提供了在运行时动态创建数据源的功能。源码中可能会包含一些工厂类或者构建者模式的实现,根据配置信息动态创建数据源实例。 4. 多租户支持的实现:多租户是指一个系统可以同时服务于多个不同的客户或租户。dynamic-datasource-spring-boot-starter 也提供了对多租户的支持。源码中可能会包含一些多租户相关的类和逻辑,如解析请求或者从配置文件中获取租户信息等。 总结来说,dynamic-datasource-spring-boot-starter 源码分析涉及到数据源的自动装配、动态切换数据源的实现、动态创建数据源和多租户支持等方面的内容。可以通过阅读源码来深入了解其实现原理和技术细节,从而更好地使用和定制该库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

层巅余落日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值