Springboot02_自动配置原理

①. 容器功能

1. 组件添加

①. @Configuration

1. @Configuration代表一个配置类,本身也是组件,配置类里面使用@Bean标注在方法上给容器注册组件,默认是单例的。

2. proxyBeanMethods:代理的方法
使用场景: 配置类组件无依赖,推荐使用List模式加速容器启动过程,减少判断;配置类组件有依赖,方法会被调用得到之前单实例组件,用Full模式。

Full(proxyBeanMethods = true) 单例
Lite(proxyBeanMethods = false) 多列,方法每次被调用会创建一个新的对象

 /**
  * 表示是一个配置类,proxyBeanMethods = false表示每次调用方法就会创建
  * 不同的实例。
  */     
@Configuration(proxyBeanMethods = false)
public class MyConfig {

    /**
     * @Bean表示给容器注册组件
     */
    @Bean
    public User user01() {
        User user = new User("zhangsan", 18);
        // user组件依赖了Pet组件
        user.setPet(new Pet("宠物狗"));
        return user;
    }

    @Bean("tom")
    public Pet tomcatPet() {
        return new Pet("tomcat");
    }
}


@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        // 1、返回我们IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

        // 2、查看容器里面的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }

        // 3、从容器中获取组件
        User user01 = run.getBean("user01", User.class);
        System.out.println("user01 = " + user01);
        Pet tom01 = run.getBean("tom", Pet.class);
        Pet tom02 = run.getBean("tom", Pet.class);
        System.out.println("组件:" + (tom01 == tom02));
        
		// 4、com.wjw.config.MyConfig$$EnhancerBySpringCGLIB$$87197767@4ac22169
        MyConfig bean = run.getBean(MyConfig.class);
        System.out.println(bean);

        // 如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。
        // 保持组件单实例
        User user = bean.user01();
        User user1 = bean.user01();
        System.out.println(user == user1);
    }
}

②. @Bean、@Component、@Controller、@Service、@Repository

这几个都是添加组件。

  • ③. @ComponentScan、@Import

@ComponentScan 扫描包路径
@Import({User.class, DBHelper.class}) 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名

③. @Conditional

条件装配:满足Conditional指定的条件,则进行组件注
在这里插入图片描述
在这里插入图片描述

2. 原生配置文件引入

①. @ImportResource

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user04" class="cn.wjw.entity.User">
        <property name="age" value="12"></property>
        <property name="name" value="weng"></property>
    </bean>

</beans>
@ImportResource("classpath:bean.xml")
@Configuration
public class ProtogenesisMyConfig {
}
@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        // 测试import导入组件
        System.out.println("==============");
        String[] beanNamesForType = run.getBeanNamesForType(User.class);
        Arrays.stream(beanNamesForType).forEach(System.out::println);
    }
}

3. 配置绑定

①. @Component+@ConfigurationProperties

ymal

acme:
  enabled: true
  remote-address: 191.11.11.1
  security:
    roles: [明心,过去]
    password: 123
    username: 我的
  firstName: 第一个名字
@Data
@Component
@ConfigurationProperties(prefix = "acme")
public class AcmeProperties {

    private boolean enabled;

    private InetAddress remoteAddress;

    private Security security;

    @Data
    public static class Security {

        private String username;

        private String password;

        private List<String> roles = new ArrayList<>(Collections.singleton("USER"));

    }

}

@RestController
public class ModelController {

    @Autowired
    private AcmeProperties acmeProperties;

    @RequestMapping("test1")
    public AcmeProperties test() {
        return this.acmeProperties;
    }

}

②. @EnableConfigurationProperties +@ConfigurationProperties

在这里插入图片描述

  1. @ConfigurationProperties功能: 和yaml配置绑定
  2. @EnableConfigurationProperties: ①. 和带有@ConfigurationProperties注解的类配置绑定。②. 将带有@ConfigurationProperties注解的类注入到容器中

②. 自动配置原理

1.引导加载自动配置类

在这里插入图片描述

  • ①. @SpringBootConfiguration: 代表当前是个配置类
  • ②. @EnableAutoConfiguration: 指定包下导入组件
  • ③. @ComponentScan: 指定扫描那些Spring注解
  • ④. @AutoConfigurationPackage: 给容器导入自定义组件
    在这里插入图片描述
    进入AutoConfigurationPackages.Registrar.class

在这里插入图片描述

  • ⑤. @Import(AutoConfigurationImportSelector.class): 给容器导入Springboot自带场景组件
    在这里插入图片描述

总结:
1. springboot先加载所有的配置类, XXXAutoConfiguration
2. 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定。
3. 生效的配置类就会给容器中装配很多组件,只要容器中有这些组件,相当于这些功能就有了。
4. 定制化组件:①. 用户自定义@Bean替换底层的组件 ②. 通过看组件源码, 去配置文件修改。

引入场景依赖地址

修改配置项

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值