栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot自动装配理解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot自动装配理解

小白记录学习心得,如有不对请指教。
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 values = loadAllProperties.values();
                return values.toArray(new String[values.size()]);
            }
            catch (IOException e) {
                e.printStackTrace();
            }    
        }
        return null;
    }
}
 

配置文件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还需要筛选等操作。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号