①. 容器功能
1. 组件添加
①. @Configuration②. @Bean、@Component、@Controller、@Service、@Repository③. @Conditional 2. 原生配置文件引入
①. @importResource 3. 配置绑定
①. @Component+@ConfigurationProperties②. @EnableConfigurationProperties +@ConfigurationProperties ②. 自动配置原理
1.引导加载自动配置类
①. 容器功能 1. 组件添加 ①. @Configuration1. @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
③. @Conditional@ComponentScan 扫描包路径
@import({User.class, DBHelper.class}) 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
2. 原生配置文件引入 ①. @importResource条件装配:满足Conditional指定的条件,则进行组件注
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②. @EnableConfigurationProperties +@ConfigurationPropertiesroles = new ArrayList<>(Collections.singleton("USER")); } } @RestController public class ModelController { @Autowired private AcmeProperties acmeProperties; @RequestMapping("test1") public AcmeProperties test() { return this.acmeProperties; } }
②. 自动配置原理 1.引导加载自动配置类@ConfigurationProperties功能: 和yaml配置绑定@EnableConfigurationProperties: ①. 和带有@ConfigurationProperties注解的类配置绑定。②. 将带有@ConfigurationProperties注解的类注入到容器中
①. @SpringBootConfiguration: 代表当前是个配置类②. @EnableAutoConfiguration: 指定包下导入组件③. @ComponentScan: 指定扫描那些Spring注解④. @AutoConfigurationPackage: 给容器导入自定义组件
进入AutoConfigurationPackages.Registrar.class
⑤. @import(AutoConfigurationimportSelector.class): 给容器导入Springboot自带场景组件
总结:
1. springboot先加载所有的配置类, XXXAutoConfiguration
2. 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定。
3. 生效的配置类就会给容器中装配很多组件,只要容器中有这些组件,相当于这些功能就有了。
4. 定制化组件:①. 用户自定义@Bean替换底层的组件 ②. 通过看组件源码, 去配置文件修改。
引入场景依赖地址
修改配置项
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)