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;
    }
}

注解式控制

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();
    }
}
@Component("tom")
// 当虚拟机中没有加载Dog类但加载了Mouse类时并且Bean的名称为jerry才加载对应的Cat
@ConditionalOnMissingClass("com.itheima.bean.Dog")
@ConditionalOnClass(name = "com.itheima.bean.Mouse")
@ConditionalOnBean(name="jerry")
public class Cat{
    
}

你可能感兴趣的:(Bean,spring,java,后端,Bean的控制加载)