-------------目录直通车----------------Spring Boot自动组装的原理一、springboot中的自动组装二、自动组装如何实现三.总结四.组装APP.properties/yml
Spring Boot的自动组装原理
在Spring Boot中有一个点叫自动装配是Starter的基础,也是整个Spring Boot的核心,那什么是自动装配呢?简单来说,就是自动将Bean装配到IOC容器中这么一个操作。
另一方面,Spring Boot下的自动组装追加Starter依存
ependencygroupidorg.spring framework.boot/groupidartifactidspring-boot-starter-data-redis/artifact id/dependendend
创建spring.redis.host=localhost spring.redis.port=6379 controller
@ restcontrollerpublicclasstestcontroller { @ autowiredredistemplatestring,String redisTemplate; @getmapping(/test ) (public String test ) ) { redisTemplate.opsForValue ).set )、) hello )、) Spring Boot ); 返回' success '; }这是Spring Boot的组装机制,没有以XML或注释格式将RedisTemplate注入IOC容器中,但控制器可以直接在@Autowired中注入使用。
二、如何实现自动组装? @ springbootapplicationpublicclasstestdemoapplication (publicstaticvoidmain (string [ ] args ) springapplication.run ) trion 单击@SpringBootApplication评论时,@SpringBootApplication评论主要是@ComponentScan,@SpringBootConfiguration,http://www
@target(elementtype.type )//接口、类、枚举、注释@retention ) retentionpolicy.runtime这种类型的Annotations是jj 说明此注释包含在javadoc中@Inherited //说明子类从父类获取此注释@ springbootconfiguration @ enableautoconfiguration @ components can (exclude filters={ @ filter ) type=class}},@filter(type=filtertype.custom,classes={ autoconfigurationexcludefilter.class } ) (公共@接口
@target(elementtype.type ) retention ) retentionpolicy.runtime ) documented @ inherited @ autoconfiguration packs此评论扫描到ng IOC容器@ import ({ autoconfigurationimportselector.class } )。 public @ interfaceenableautoconfiguration { string enabled _ override _ property=' spring.boot.enableautococonfiguration curation [] exclude () default {} ); String[] excludeName () default {} ); @EnableAutoConfiguration中最重要的是* * @ import (autoconfigurationimportselector.class ) )
**注解。@Import 将 AutoConfigurationImportSelector 这个类导入,点进这个类一看: public class AutoConfigurationImportSelector implements DeferredImportSelector,***{}public interface DeferredImportSelector extends ImportSelector {}实现了 DeferredImportSelector 接口,而 DeferredImportSelector 是继承 ImportSelector 类的。在 ImportSelector 中有个非常重要的方法:
// 批量将类注入到IOC容器String[] selectImports(AnnotationMetadata var1);如何利用 ImportSelector 装配类到IOC容器中去
首先创建一个类TestClass
创建一个ImportSelector的实现类,在实现类中把定义的Bean加入String数据中(因为ImportSelector可以实现批量装配,这里用一个来举例,多个逗号分隔就好),该Bean将会装配到IOC容器中
public class TestImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[]{TestClass.class.getName()}; }}为了模拟 EnableAutoConfiguration,我们自定义一个注解,通过@Import导入
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage //添加该注解的类所在的package 作为 自动配置package 进行管理@Import(TestImportSelector.class)public @interface EnableAutoImport {}然后创建一个启动类,在启动类上使用@EnableAutoImport注解,即可通过getBean从IOC容器中得到TestClass实例
@SpringBootApplication@EnableAutoImportpublic class ImportSelectorMain { public static void main(String[] args) { ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(ImportSelectorMain.class,args); TestClass testClass = configurableApplicationContext.getBean(TestClass.class); }} 三、总结自动装配的原理是通过主要组成@SpringBootApplication注解的@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解中的@EnableAutoConfiguration 中通过 @Import({AutoConfigurationImportSelector.class}) 导入的AutoConfigurationImportSelector实现的 selectImports 方法来实现批量装配的。
上面这个问题回答上了之后,有些面试官会深入问下面这个问题:
四、装配 application.properties/yml在autoconfigure包下有个类 ServletWebServerFactoryAutoConfiguration,这个是SpringBoot 自动装配 Servlet 配置的类。
package org.springframework.boot.autoconfigure.web.servlet; // 包路径@Configuration( proxyBeanMethods = false)@AutoConfigureOrder(-2147483648)@ConditionalOnClass({ServletRequest.class})@ConditionalOnWebApplication( type = Type.SERVLET)@EnableConfigurationProperties({ServerProperties.class})@Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class, EmbeddedTomcat.class, EmbeddedJetty.class, EmbeddedUndertow.class})public class ServletWebServerFactoryAutoConfiguration {}在SpringMVC中 @EnableConfigurationProperties 是一个非常熟悉的类,上面会将ServerProperties 类中的一些配置加载到当前类中,点进 ServletProperties:
@ConfigurationProperties( prefix = "server", ignoreUnknownFields = true)public class ServerProperties {}@ConfigurationProperties 将配置文件的属性对应的值读入到 ServerProperties 这个类中,prefix=“server” 会读取 application.properties 中前缀为 server 的属性和值。