文章目录
①. 容器功能
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
@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替换底层的组件 ②. 通过看组件源码, 去配置文件修改。