bean的编程式和注解式加载控制与自动配置

目录

bean的加载控制

 bean的编程式加载控制

 bean的注解式加载控制

 自动配置原理

自定义自动配置


bean的加载控制

 bean的编程式加载控制

在程序中使用控制即可

public class MyImportSelector implements ImportSelector {
    public String[] selectImports(AnnotationMetadata annotationMetadata) {//AnnotationMetadata 注解的源数据
        //  做判定条件,是否有这个注解

        boolean flag = annotationMetadata.hasAnnotation("org.springframework.context.annotation.Configuration");
        if (flag){
            return new String[]{"com.service.Dog"};
        }

        return new String[]{"com.service.Cat"};
    }
}

 bean的注解式加载控制

使用@ConditionalOnXXX注解为bean的加载设置条件

package com.beanLoad.config;

import com.beanLoad.service.Cat;
import com.beanLoad.service.Dog;
import com.beanLoad.service.Mouse;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWebApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;

//@ComponentScan("com.beanLoad")
@Import({Mouse.class, Dog.class})
public class springConfig {

    @Bean
    @ConditionalOnBean(name="com.beanLoad.service.Mouse")//当有这个bean时加载
    @ConditionalOnMissingBean(name = "com.beanLoad.service.Dog")//当没有这个bean时就加载
    @ConditionalOnNotWebApplication//不是一个web项目时就加载
    //这些注解的条件同时满足才会加载
    public Cat tom(){
        return new Cat();
    }

}

主类下

package com.beanLoad.app;

import com.beanLoad.config.springConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class BeanLoadApp {
    public static void main(String[] args) {
        ApplicationContext app=new AnnotationConfigApplicationContext(springConfig.class);
        String[] names = app.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }

}

运行结果

 自动配置原理

1、收集Spring开发者的编程习惯,整理开发过程使用的常用的技术列表->(技术集A)

2、收集常用技术(技术集A)的使用参数,整理开发过程中每个技术的蝉蛹设置列表->(设置集B)

3、初始化SpringBoot基础环境,加载用户自定义的ena和到UR的其他坐标,形成初始化环境

4、将技术集A包含的所有技术都定义出来,在Spring/SpringBoot启动时默认全部加载

5、将技术集A中具有使用条件的技术约定出来,设置称按条件加载,有开发者决定是否使用该技术(与初始环境比对)

6、将设置集B作为默认加载(约定大于配置),减少开发者配置工作量

7、开放设置集B的配置覆盖接口,有开发者根据自身需要决定时候覆盖默认配置

自定义自动配置

自定义自动配置的核心是,先在resource资源下新建一个META-INF,在下面的spring.factories

#要自动配置的类写在这
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.beanLoad.service.Cat

被自动配置的类有有特殊的标志 

在一个配置类中


//当有这个类时,加载下面这个类
@ConditionalOnClass(name="com.beanLoad.service.Cat")
public class AutoSpringConfig {

}

测试的主类下 

public class App1 {
    public static void main(String[] args) {
        ApplicationContext app=new AnnotationConfigApplicationContext(AutoSpringConfig.class);
        String[] names = app.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
}
}

运行结果 

 这说明自动配置成功

猜你喜欢

转载自blog.csdn.net/weixin_60719453/article/details/127533674
今日推荐