当前位置:首页 > 数码 > 源码分析-深化了解-性能治理机制-Spring-Boot-Configuration (源码分析是什么意思)

源码分析-深化了解-性能治理机制-Spring-Boot-Configuration (源码分析是什么意思)

admin8个月前 (05-09)数码33

Configuration

最近看源码时,经常看了下@Configuration(proxyBeanMethods=false)这样的性能,但从命名上看应该是与代理无关的,于是抽个期间了解了下

proxyBeanMethods

首先这个是@Configuration注解中的一个参数,咱们都知道,@Configuration是Spring中的性能类,普通用来声明Bean,在自动状况下proxyBeanMethods为true

含意

从源码中可以看到对该参数的形容如下:

Specifywhether@Beanmethodsshouldgetproxiedinordertoenforcebeanlifecyclebehavior,e.g.toreturnsharedsingletonbeaninstancesevenincaseofdirect@Beanmethodcallsinusercode.Thisfeaturerequiresmethodinterception,implementedthrougharuntime-generatedCGLIBsubclasswhichcomeswithlimitationssuchastheconfigurationclassanditsmethodsnotbeingallowedtodeclarefinal.Thedefaultistrue,allowingfor'inter-beanreferences'viadirectmethodcallswithintheconfigurationclassaswellasforexternalcallstothisconfiguration's@Beanmethods,e.g.fromanotherconfigurationclass.Ifthisisnotneededsinceeachofthisparticularconfiguration's@Beanmethodsisself-contnedanddesignedasaplainfactorymethodforcontaineruse,switchthisflagtofalseinordertoavoidCGLIBsubclassprocessing.Turningoffbeanmethodinterceptioneffectivelyprocesses@Beanmethodsindividuallylikewhendeclaredonnon-@Configurationclasses,a.k.a."@BeanLiteMode"(see@Bean'sdoc).Itisthereforebehaviorallyequivalenttoremovingthe@Configurationstereotype.

当间接在Configuration中间接经过方法,实事实例件的属性依赖时,IDEA会有这样一段揭示:

Methodannotatedwith@Beaniscalleddirectlyina@ConfigurationwhereproxyBeanMethodssettofalse.SetproxyBeanMethodstotrueorusedependencyinjection.

示例

先经过上方的示例看下现象:

两特性能类,写法差不多,区别在与proxyBeanMethods的性能以及AnimalCage属性的注入方法。

@Configuration(proxyBeanMethods=false)publicclassGenericConfiguration{@BeanpublicDogCagedogCage(){returnnewDogCage();}@BeanpublicAnimalCageanimalEden(){AnimalCageanimalCage=newAnimalCage();animalCage.addCage(dogCage());returnanimalCage;}}@Configuration(proxyBeanMethods=true)publicclassProxyConfiguration{@BeanpublicDogCagedogCage(){returnnewDogCage();}@BeanpublicAnimalCageanimalEden(@AutowiredList<Cage>cages){returnnewAnimalCage(cages);}}

先看下GenericConfiguration性能的状况:

publicclassTests{@AutowiredprivateBeanFactorybeanFactory;@AutowiredprivateGenericConfigurationgenericConfiguration;@AutowiredprivateAnimalCageanimalCage;@AutowiredprivateDogCagedogCage;@TestpublicvoidrunConfig(){log.info("configuration:{}",genericConfiguration);//原始对象类型log.info("Configuration中的Bean:{}",genericConfiguration.dogCage()==genericConfiguration.dogCage());//两次结果不一样log.info("容器中的Bnea:{}",beanFactory.getBean(DogCage.class)==beanFactory.getBean(DogCage.class));//从Spring容器中取值都是一样的animalCage.cages.forEach(cage->{if(cageinstanceofDogCage){log.info("dogCage:{}",cage==dogCage);//和上方的对象不分歧,非单例}});}}

再看下ProxyConfiguration性能的状况:

publicclassTests{@TestpublicvoidrunConfig(){log.info("configuration:{}",proxyConfiguration);//1、CGLIB代理的对象log.info("Configuration中的Bean:{}",proxyConfiguration.dogCage()==proxyConfiguration.dogCage());//2、两次结果相反log.info("容器中的Bnea:{}",beanFactory.getBean(DogCage.class)==beanFactory.getBean(DogCage.class));//3、从Spring容器中取值都是一样的animalCage.cages.forEach(cage->{if(cageinstanceofDogCage){log.info("dogCage:{}",cage==dogCage);//和上方的对象不分歧,非单例}});}}

会获取这样的现象:

LiteFullMode

看到上方的现象后,咱们有必要了解下Spring性能中的Lite和Full两种形式

lite形式蕴含:

full形式蕴含:


full形式经常使用特性:

lite形式经常使用特性:

完结语

@Configuration(proxyBeanMethods=false)的性能其实是Lite形式,这种形式下,性能类不会生成代理类,速度会更快,但是要留意,在性能类中的@Bean方法,不能用来成功单例级别的依赖。


@Import({AutoConfigurationImportSelector.class})

(2)@Import({}):将AutoConfigurationImportSelector这个类导入到spring容器中,AutoConfigurationImportSelector可以帮助springboot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器(ApplicationContext)中继续研究AutoConfigurationImportSelector这个类,通过源码分析这个类中是通过selectImports这个方法告诉springboot都需要导入那些组件:![image-](./images/)深入研究loadMetadata方法![image-](./images/)深入getCandidateConfigurations方法个方法中有一个重要方法loadFactoryNames,这个方法是让SpringFactoryLoader去加载一些组件的名字。 ![image-](./images/)继续点开loadFactory方法```java public static ListloadFactoryNames(Class factoryClass, @Nullable ClassLoaderclassLoader) {//获取出入的键 String factoryClassName = (); return(List)loadSpringFactories(classLoader)(factoryClassName,());}private static Map>loadSpringFactories(@Nullable ClassLoader classLoader) { MultiValueMap result =(MultiValueMap)(classLoader); if (result != null) { return result; } else { try { //如果类加载器不为null,则加载类路径下文件,将其中设置的配置类的全路径信息封装为Enumeration类对象Enumeration urls =classLoader != null ?(META-INF/) (META-INF/);LinkedMultiValueMap result =new LinkedMultiValueMap(); //循环Enumeration类对象,根据相应的节点信息生成Properties对象,通过传入的键获取值,在将值切割为一个个小的字符串转化为Array,方法result集合中while(()) {URL url =(URL)();UrlResource resource = newUrlResource(url);Properties properties =(resource);Iterator var6 =()(); while(()) {Entry entry= (Entry)();String factoryClassName= ((String)())();String[] var9 =((String)());int var10 =; for(int var11 = 0;var11 < var10; ++var11) {String factoryName= var9[var11]; (factoryClassName, ());}}} (classLoader, result);return result; ```会去读取一个sprin 的文件,读取不到会表这个错误,我们继续根据会看到,最终路径的长这样,而这个是spring提供的一个工具类```java public final class SpringFactoriesLoader { public static final String FACTORIES_RESOURCE_LOCATION =META-INF/; } ```它其实是去加载一个外部的文件,而这文件是在![image-](./images/)![image-](./images/)@EnableAutoConfiguration就是从classpath中搜寻META-INF/配置文件,并将其中对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的配置类,并加载到IOC容器中以刚刚的项目为例,在项目中加入了Web环境依赖启动器,对应的WebMvcAutoConfiguration自动配置类就会生效,打开该自动配置类会发现,在该配置类中通过全注解配置类的方式对Spring MVC运行所需环境进行了默认配置,包括默认前缀、默认后缀、视图解析器、MVC校验器等。 而这些自动配置类的本质是传统Spring MVC框架中对应的XML配置文件,只不过在Spring Boot中以自动配置类的形式进行了预先配置。 因此,在Spring Boot项目中加入相关依赖启动器后,基本上不需要任何配置就可以运行程序,当然,我们也可以对这些自动配置类中默认的配置进行更改**总结** 因此springboot底层实现自动配置的步骤是:1. springboot应用启动;2. @SpringBootApplication起作用;3. @EnableAutoConfiguration;4. @AutoConfigurationPackage:这个组合注解主要是@Import(),它通过将Registrar类导入到容器中,而Registrar类作用是扫描主配置类同级目录以及子包,并将相应的组件导入到springboot创建管理的容器中;5. @Import():它通过将AutoConfigurationImportSelector类导入到容器中,AutoConfigurationImportSelector类作用是通过selectImports方法执行的过程中,会使用内部工具类SpringFactoriesLoader,查找classpath上所有jar包中的META-INF/进行加载,实现将配置类信息交给SpringFactory加载器进行一系列的容器创建过程刚学了拉勾教育的《Java工程师高薪训练营》,看到刚学到的点就回答了。 希望拉勾能给我推到想去的公司,目标:字节!!

springboot自动配置原理

springboot自动配置原理是基于条件判断来配置Bean。

pring Boot的自动配置原理是基于Spring框架的条件化配置(Conditional Configuration)机制实现的。在Spring Boot中,自动配置类都是使用@Configuration注解标注的Java配置类,并且使用了多种条件注解来控制自动配置的条件和范围。

当指定的类在类路径中存在时,才会创建Bean或执行配置;当容器中不存在指定的Bean时,才会创建Bean或执行配置;当指定的配置属性存在时,才会创建Bean或执行配置;当应用是Web应用时,才会创建Bean或执行配置。

如果符合条件,Spring Boot就会自动创建Bean并注入到容器中,完成自动配置的过程。这样,应用就可以在不需要手动编写配置的情况下,快速地完成常见的功能配置,提高开发效率。

使用Spring Boot进行配置的注意事项

1、版本兼容性:Spring Boot的不同版本可能存在一些兼容性问题,需要注意选择相应的版本,以确保项目能够正常运行。

2、依赖管理:Spring Boot支持自动配置和依赖管理,需要注意导入的依赖是否正确,以避免出现冲突或版本不兼容等问题。

3、配置文件:Spring Boot的配置文件有多种格式,如properties、yaml、json等,需要根据项目的需要选择相应的格式,并将配置文件放置在正确的位置。

4、配置项:Spring Boot的配置项较多,需要注意配置项的正确使用和设置,如数据库连接、端口号、日志级别等。

性能治理机制

5、自动配置:Spring Boot的自动配置能力较强,但也需要注意自动配置的正确性,如是否需要关闭自动配置、是否需要修改默认配置等。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Configuration