什么是java自动装箱和自动拆箱 spring自动装箱_后端

一、自动装箱流程图(关键注解)

什么是java自动装箱和自动拆箱 spring自动装箱_配置文件_02

二、SpringBoot中常用到的注解说明

@Configuration

`表名这是一个配置类,将会被注入到容器中,等同于先前使用的xml配置文件。

@Configuration有一个属性,proxyBeanMethods = true,默认属性为true,即被@Configuration注解的类在spring容器中被CGLIB代理,如果在配置类中用@Bean注解标注的方法或属性,在外部被多次调用,那多次调用到的也是同一个对象(单例的)。

相反,如果proxyBeanMethods = false,那么在配置类中的bean对象不再是单实例,如果多次调用的话,那么会产生多个实例对象。

组件依赖:如果配置类中的多个bean示例之间有相互的依赖的关系,proxyBeanMethods 就应该设置为true,可以保证容器中单例,唯一。

@Bean、@Component、@Controller、@Service、@Repository

这些是我们常用到的将bean注入到容器中的注解。

@ComponentScan、@Import

@ComponentScan:包扫描

@Import:

作用在容器中的组件相关的类上(即添加了@Configuration、@Component等等表示这是一个组件)

作用:导入相关的实体类,创建对应的Bean对象。@Import可以导入内部的Class,也可以导入第三方外部引入的Class.默认组件的名字就是全类名。

什么是java自动装箱和自动拆箱 spring自动装箱_java_03

 @Conditional:条件装配,满足相应的条件则装配进容器;

例如:@ConditionalOnBean 容器中有某个实例时,类中或者是对应的方法中的实例才会被注册。

@ImportResource:原生配置文件引入,导入xml配置文件,将配置文件中的bean实例添加进容器。

什么是java自动装箱和自动拆箱 spring自动装箱_后端_04

@ConfigurantionProperties配置绑定

配置绑定这里说两种方式:

方式一:

@ConfigurationProperties(prefix = "") + @Component

@Component注解表示这个类会被注入到容器中;

@ConfigurationProperties将开启属性和配置文件绑定,并且在配置文件中的前缀是prefix中的内容;

方式二:

@EnableConfigurationProperties(T.Class) + @ConfigurationProperties(prefix = "")

@ConfigurationProperties(prefix = "")表示这个类和配置文件绑定,在属性对应的类上面;

@EnableConfigurationProperties(T.Class)在配置类上面,作用有二:一、开启类的自定绑定;二、把这个组件注入到容器中;

三、自动配置原理

SpringBoot的主启动类上面有一个@SpringBootApplication注解,这个注解涵盖了springBoot自动装配的核心思想。

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {

@SpringBootApplication这个注解里面核心是这三个注解:

  • @SpringBootConfiguration:表名这是一个配置类
  • @Component:指明了包扫描路径
  • @EnableAutoConfiguration:里面有2个注解:
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {

@AutoConfigurationPackage:它里面是这样的:是一个@Import组件,导入一系列组件,将主启动类所在的包下的所有组件导进来;

@Import({Registrar.class})
public @interface AutoConfigurationPackage {
// 利用Registrar给容器中导入一系列组件;
// 将指定的包下的所有组件导入进来。这个包指的就是主启动类所在的包。

@EnableAutoConfiguration注解中另外一个注解:@Import({AutoConfigurationImportSelector.class})

// 1、利用AutoConfigurationImportSelector中的selectImports()方法选择导入一些组件;
// 2、AutoConfigurationImportSelector中的getCandidateConfigurations来获取所有候选的配置类;
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
// 3、getCandidateConfigurations方法是通过SpringFactoriesLoader.loadFactoryNames来加载,loadSpringFactories方法中可以加载出所有的所有的组件
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
// 4、扫描META-INF/spring.factories文件,得到所有需要加载的文件;扫描得到的就是spring.factories文件中EnableAutoConfiguration下的文件名;

在SpringBoot项目启动的时候,在启动tomcat的时候,会自动扫描SpringBootjar包下的META-INF/spring.factories下的文件,得到其中的auto Configure配置文件的名称:

什么是java自动装箱和自动拆箱 spring自动装箱_什么是java自动装箱和自动拆箱_05

按需开启自动配置项:

springboot启动的时候上面会扫描达到所有的配置文件中的127个组件,但是最终会按需条件装配,按需装配;

例如下面AspectJAutoProxyingConfiguration要想被装配进IOC容器,需要满足@ConditionalOnClass的条件才会被装载进容器;

@ConditionalOnClass({Advice.class})
    static class AspectJAutoProxyingConfiguration {
        AspectJAutoProxyingConfiguration() {
        }

可以简单的总结为一下几点:

1、SpringBoot会首先加载所有的自动配置类;xxxxAutoConfiguration

2、每个自动配置类会按照条件生效,而且会默认绑定配置文件指定的值;xxxxProperties文件里面获取

3、生效的配置类会在容器中装配很多生效的组件

4、只要容器中有这些组件,就相当于具备了这些功能

5、如果用户自定义了,则以用户自定义的优先