SpringBoot的自动装配(一)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot的自动装配(一)相关的知识,希望对你有一定的参考价值。

参考技术A 一、什么是SpringBoot的自动装配

    SpringBoot的自动装配是指:SpringBoot会自动将一些配置类的bean注册到ioc容器,我们可以在需要的地方使用@Autowired或@Resource等注解来使用它。
    自动的表现形式就是我们只需要引我们享用功能的包,其他的配置完全不需要管,springboot会自动注入这些配置备案,我们直接使用就行。
    自动装配也是SpringBoot的一个重要的特点,他帮我们做了很多的配置。

二、它是怎样实现的?

    1、run方法
        当启动一个SpringBoot项目时,本质上就是执行了地洞累中的主方法,然后执行了run方法。

    ConfigurableApplicationContext这个对象就是 ApplicationContext接口的一个子接口。
    其实SpringBoot项目的启动,本质上就是一个Spring的初始化操作。
2、@SpringBootApplication
    点开这个注解可以发现,这是一个组合注解,包括:

        这些注解中,前四个是JDK中的自动元注解,是用来修饰注解的注解。@ComponentScan是用来扫描路径的,如果不置顶特定的扫描路径的话,扫描的路径是当前修饰的类所在的包及其子包。而@SpringBootConfiguration这个注解的本质就是@Configuration注解。所以在这里面跟SpringBoot自动装配有关系的就只有一个了:@EnableAutoConfiguration
    3、@EnableAutoConfiguration

    @AutoConfigurationPackage不是用来实现自动装配的,在Spring中,他是用来扫描实体类Entity等注解的。所以重点是在@Import上。
    @Import注解实现了AutoConfigurationImportSelector类,自动装配也是在这个类中进行了具体的实现。自动装配实现的就是该类中的selectImports方法里。通过selectImports方法,取到spring.factories文件下的一系列类名,随后将这些类自动加载至IOC容器中。
    4、总结
        SpringBoot的自动装配也就是通过@EnableAutoConfiguration注解,加载AutoConfigurationImportSelector类中的selectImports方法,进而扫描spring.factories文件下的自动配置类,并将其装配到IOC容器的过程。

springboot自动装配---实现一个自定义自动装配组件

对于springboot个人认为它就是整合了各种组件,然后提供对应的自动装配和启动器(starter),基于这个流程去实现一个定义的装配组件

还是这张图

 

 技术图片

 

一、创建自己的自动配置工程, spring.factories文件中配置上自己的配置

技术图片

 

1.创建一个Properties类(UserDefProperties)用于接收配置文件配置的参数,类似于RabbitMQ/Mybatis等在yaml中配置的参数(对标该类org.springframework.boot.autoconfigure.amqp.RabbitProperties),

package com.nijunyang.autoconfig.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 *  * 自定义的配置类,映射配置文件参数
 * @author: create by nijunyang
 * @date:2019/7/15
 */
@ConfigurationProperties(prefix = "spring.userdef.model")
public class UserDefProperties 
    private String userName;
    private Integer age;
    private Double height;

    public String getUserName() 
        return userName;
    

    public void setUserName(String userName) 
        this.userName = userName;
    

    public Integer getAge() 
        return age;
    

    public void setAge(Integer age) 
        this.age = age;
    

    public Double getHeight() 
        return height;
    

    public void setHeight(Double height) 
        this.height = height;
    

 

2.创建一个XXXAutoConfiguration类(UserDefAutoConfiguration),实现我们的装配逻辑也就是从配置文件中获取数据并初始化我们需要的数据,比如RabbitMQ/Mybatis初始化各种连接工厂(org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration.RabbitConnectionFactoryCreator#rabbitConnectionFactory),我们这儿就获取配置数据转换成一个对象用于测试效果,

package com.nijunyang.autoconfig.config;

import com.nijunyang.autoconfig.model.User;
import com.nijunyang.autoconfig.properties.UserDefProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;

/**
 * 自定义启动类配置类
 * @author: create by nijunyang
 * @date:2019/7/15
 */
@Slf4j
@EnableConfigurationProperties(value = UserDefProperties.class)
public class UserDefAutoConfiguration 

    @Autowired
    private UserDefProperties userDefProperties;

    @Bean
    public User user()
        log.info("自定义自动装配UserDefAutoConfiguration.....");
        User user = new User();
        user.setAge(userDefProperties.getAge());
        user.setUserName(userDefProperties.getUserName());
        user.setHeight(userDefProperties.getHeight());
        return user;
    

 

3. spring.factories文件中配置EnableAutoConfiguration数据指向我们自己的UserDefAutoConfiguration

 

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.nijunyang.autoconfig.config.UserDefAutoConfiguration

 

二、创建自己的启动器(starter)

技术图片

 

1.启动器啥都不需要做,只需要引入自动配置工程依赖

 

<dependency>
            <groupId>com.nijunyang</groupId>
            <artifactId>autoconfig</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

 

三、测试工程

技术图片

 

1. 引入启动器依赖

<dependency>
            <groupId>com.nijunyang</groupId>
            <artifactId>starter</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

 

2. application.properties配置中加入自动配置工程中Properties类对应的值,类似我们在application.properties配置mybatis连接一样

spring.userdef.model.userName=zhangsan
spring.userdef.model.age=18
spring.userdef.model.height=1.70

 

3.测试接口类,自动注入我们用我们用于测试的建模

package com.nijunyang.autoconfigurationstartertest.controller;


import com.nijunyang.autoconfig.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author: create by nijunyang
 * @date:2019/7/15
 */
@RestController
public class Controller 

    @Autowired
    User user;

    @GetMapping("/test")
    public User getUser()
    
        return user;
    

//    @GetMapping("/test")
//    public String getUser()
//    
//        return "123";
//    

 

4.启动工程查看日志,发现我们自定义的装配类日志会在启动日志输出,说明启动过程中去自动装配了自己的组件

 技术图片

5.测试接口访问,返回配置文件中的数据

技术图片

 

 

四、断点查看selectImports方法引入自定义启动和不引入对比,org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports

引入:

技术图片

 

不引入:

技术图片

 

至此就简单实现了一个自定义的自动装备组件...

 

以上是关于SpringBoot的自动装配(一)的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot项目开发技巧一:自动装配

SpringBoot进阶之道-自动装配

springboot自动装配---实现一个自定义自动装配组件

SpringBoot自动配置/装配(SPI)

深入理解SpringBoot之自动装配

springboot 自动装配