• 03-Spring中Bean的加载控制方式


    Bean的加载控制

    Spring还开放出了若干种可编程控制的bean的初始化方式,通过分支语句由固定的加载bean转成了可以选择bean是否加载或者选择加载哪一种bean

    编程式控制

    企业级开发中不可能在Spring容器中进行bean的饱和式加载(不管用不用全部加载),而是采取必要性加载(用什么加载什么即用什么技术就加载对应的Bean)

    • 如在Spring的IoC容器中通过判定是否加载了某个类来决定是否向容器中注册其他Bean(可以通过类的全路径名判断是否加载了某个类)
    public class MyImportSelector implements ImportSelector {
        @Override
        public String[] selectImports(AnnotationMetadata importingClassMetadata) {
            try {
                Class clazz = Class.forName("com.itheima.bean.Mouse");
                if(clazz != null) {
                    return new String[]{"com.itheima.bean.Cat"};
                }
            } catch (ClassNotFoundException e) {
                // e.printStackTrace();
                return new String[0];
            }
            return null;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    注解式控制

    spring-boot-starter定义了若干种控制Bean加载的条件注解,这些条件注解还可以做并且的逻辑关系,写多个就是多个条件都成立

    • 这些条件注解即可以放在使用了@Bean标识的方法上面也可以使用类上面
    条件注解描述
    @ConditionalOnClass注解的name属性指定类的全类名,这个类可能不存在当虚拟机中加载了某个类时才加载对应的Bean
    @ConditionalOnMissingClass注解的value属性指定类的全类名,这个类可能不存在当虚拟机中没有加载指定的类时才加载对应的Bean
    @ConditionalOnBean注解的name属性指定容器中的bean名称当容器中加载了指定名称的Bean时才加载对应的Bean
    @ConditionalOnWebApplication注解当容器环境是web环境时才加载对应的Bean
    @ConditionalOnNotWebApplication注解当容器环境不是web环境时才加载对应阿Bean
    public class SpringConfig {
        @Bean
        // 当容器中加载了mysql驱动时才加载dataSource对象
        @ConditionalOnClass(name="com.mysql.jdbc.Driver")
        public DruidDataSource dataSource(){
            return new DruidDataSource();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    @Component("tom")
    // 当虚拟机中没有加载Dog类但加载了Mouse类时并且Bean的名称为jerry才加载对应的Cat
    @ConditionalOnMissingClass("com.itheima.bean.Dog")
    @ConditionalOnClass(name = "com.itheima.bean.Mouse")
    @ConditionalOnBean(name="jerry")
    public class Cat{
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    如何安装虚拟机
    Kubernetes中使用PersistentVolume挂载云盘
    RSA攻击:模数分解
    《独行月球》
    “2022锦江行”,维也纳国际酒店、丽柏酒店惊艳同台,中高端酒店再出标杆示范
    强大、优秀的文件管理软件评测:图片管理、书籍管理、文献管理
    分布式(一致性协议)之领导人选举( DotNext.Net.Cluster 实现Raft 选举 )
    Java、泛型冒泡排序
    STM32框架之按键扫描新思路
    SpringBoot运维实用篇
  • 原文地址:https://blog.csdn.net/qq_57005976/article/details/134367181