首页 > 编程知识 正文

SpringBoot实现原理(springboot原理通俗)

时间:2023-05-06 02:28:16 阅读:64415 作者:4039

-------------目录直通车----------------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

public class 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 的属性和值。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。