小白记录学习心得,如有不对请指教。
1.回顾spring
spring配置bean的方法:1.配置文件配置(set注入和构造器构造)ClassPathXmlApplicationContext来获取配置文件来获取bean,2.java配置类来配置AnnotationConfigApplicationContext来获取配置类来获取bean。
本次重点研究java配置类来配置:
第一次尝试
构建Java配置类
@Configuration//表明java配置类,代替xml配置文件
@ComponentScan("com.yuke.pro.config.MyConfig")//扫描包路径,限制他只能扫自己
public class MyConfig
{
//标注为一个bean
@Bean
public User user() {
return new User();
}
}
实体
@Component
public class User
{
@Value("yuke")
private String name;
@Value("男")
private String sex;
}
测试结果
@Test
public void testNoXML() {
ApplicationContext context=new AnnotationConfigApplicationContext(MyConfig.class);
User user = context.getBean("user",User.class);
System.out.println(user.toString());
}
第二次尝试
当有两个配置文件,一个java配置类不能完成时怎么办?引出@import注解,构建两个java配置类调用java配置类2
@Configuration
@ComponentScan("com.yuke.pro.config.MyConfig")
//引入配置类2
@import(MyConfig2.class)
public class MyConfig
{
//标注为一个bean
@Bean
public User user() {
return new User();
}
}
java配置类2
@Configuration
public class MyConfig2
{
@Bean
public Hobby hobby() {
return new Hobby();
}
}
实体1
@Component
public class User
{
@Value("yuke")
private String name;
@Value("男")
private String sex;
@Autowired
private Hobby hobby;
}
实体2
public class Hobby
{
@Value("篮球")
private String name;
public Hobby() {
}
}
测试
@Test
public void testNoXML() {
ApplicationContext context=new AnnotationConfigApplicationContext(MyConfig.class);
User user = context.getBean("user",User.class);
System.out.println(user.toString());
}
第三次尝试
整合过ssm框架时,配置文件存在多个时,即有多个配置类怎么办?就像起初在配置web.xml时我们要配置多个servlet,而springmvc巧妙的通过加一层简化了问题:配DispatcherServlet,在所有servlet前面加一层,就解决了问题(没有什么是加一层解决不了的)。我们是否可以**@import(MyimportSelector.class)**,引入的MyimportSelector这个类就是为了选择我们想引入的配置类(达到加一层的效果)
多个配置类
第一个总配置类
@Configuration
@ComponentScan("com.yuke.pro.config.MyConfig")
//MyimportSelector引入其他配置类
@import(MyimportSelector.class)
public class MyConfig
{
@Bean
public User user() {
return new User();
}
}
其他配置类2
@Configuration
public class MyConfig2
{
@Bean
public Hobby hobby() {
return new Hobby();
}
}
其他配置类3
@Configuration
public class MyConfig3
{
@Bean
public Food food() {
return new Food();
}
}
创建MyimportSelector,通过MyimportSelector引入配置类
public class MyimportSelector implements importSelector {
@Override
public String[] selectimports(Annotationmetadata importingClassmetadata) {
// 导入配置类2,配置类3
return new String[]{"com.yuke.pro.config.MyConfig2","com.yuke.pro.config.MyConfig3"};
}
}
测试
@Test
public void testNoXML() {
ApplicationContext context=new AnnotationConfigApplicationContext(MyConfig.class);
User user = context.getBean("user",User.class);
System.out.println(user.toString());
}
可见加一层的效果是可行的,但是将路径硬编码到代码中,肯定是不够优化的,我们在新加配置文件时,总要更改MyimportSelector编码,所有要通过配置文件把我们要引入的配置类读到MyimportSelector,实现添加配置文件达到效果。
修改优化MyimportSelector
public class MyimportSelector implements importSelector
{
public String[] selectimports(Annotationmetadata importingClassmetadata) {
{
try {
//读取配置文件
Properties loadAllProperties = PropertiesLoaderUtils.loadAllProperties("config.properties");
//获取values集合
Collection
配置文件config.properties
config2=com.yuke.pro.config.MyConfig2 config3=com.yuke.pro.config.MyConfig3
测试结果
配置成功,从三次实验可以看出,最后只要我们在配置文件中配置java配置类的全路径,就可以获取这个对象,这个看懂了就可以开始springboot自动装配。
2.springboot自动装配
1.点开@SpringBootApplication,发现这是一个组合注解,其中前四个不用看(后面不在说明)
对比前面spring总配置类
2.点开@SpringBootConfiguration
是不是很惊喜,也就是说@SpringBootConfiguration最终还是表明这是一个Java配置类,剩下的就是怎么获取其他配置了。
3.点开@EnableAutoConfiguration
意不意外,有对上了,不用想AutoConfigurationimportSelector这个类一定和前面一样是要获取配置类路径,返回一个字符串数组给我们加载需要的配置类。
4.点开AutoConfigurationimportSelector
完全符合我们的猜测!
5.跳转到getCandidateConfigurations这个方法,看看他到底怎么获取配置
6.点开loadFactoryNames
7.点开 FACTORIES_RESOURCE_LOCATION
符合预测!就是这么简单。
8.看看这个重复出现的配置文件
3.对比spring和springboot
两者过程图比较
可以springboot相较于我们的实验三,复杂就复杂在配置类路径读取上,我们手写配置文件时,已经确认了我们要导入的配置类,而springboot还需要筛选等操作。



