Springboot02

Springboot02,第1张

Springboot02

文章目录

①. 容器功能

1. 组件添加

①. @Configuration②. @Bean、@Component、@Controller、@Service、@Repository③. @Conditional 2. 原生配置文件引入

①. @importResource 3. 配置绑定

①. @Component+@ConfigurationProperties②. @EnableConfigurationProperties +@ConfigurationProperties ②. 自动配置原理

1.引导加载自动配置类

①. 容器功能 1. 组件添加 ①. @Configuration

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

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

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

      
@Configuration(proxyBeanMethods = false)
public class MyConfig {

    
    @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$197767@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




    
        
        
    


@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 roles = new ArrayList<>(Collections.singleton("USER"));

    }

}

@RestController
public class ModelController {

    @Autowired
    private AcmeProperties acmeProperties;

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

}
②. @EnableConfigurationProperties +@ConfigurationProperties

    @ConfigurationProperties功能: 和yaml配置绑定@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替换底层的组件 ②. 通过看组件源码, 去配置文件修改。

引入场景依赖地址

修改配置项

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5716402.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存