springboot如何实现自动装配源码解读

网友投稿 266 2023-02-14

springboot如何实现自动装配源码解读

Spring Boot 自动装配

最重要的注解@SpringBootApplication

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),

@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

public @interface SpringBootApplication {

@AliasFor(annotation = EnableAutoConfiguration.class)

Class>[] exclude() default {};

@AliasFor(annotation = EnableAutoConfiguration.class)

String[] excludeName() default {};

@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")

String[] scanBasePackages() default {};

@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")

Class>[] scanBasePackageClasses() default {};

@AliasFor(annotation = Configuration.class)

boolean proxyBeanMethods() default true;

}

EnableAutoConfiguration

是实现自动装配的核心注解

@Target(Elemenhttp://tType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@AutoConfigurationPackage

@Import(AutoConfigurationImportSelector.class)

public @interface EnableAhttp://utoConfiguration {

}

getAutoConfigurationMetadata()

@Override

public void process(AnnotationMetadata annotationMetadata, DeferredImportSelector deferredImportSelector) {

Assert.state(deferredImportSelector instanceof AutoConfigurationImportSelector,

() -> String.format("Only %s implementations are supported, got %s",

AutoConfigurationImportSelector.class.getSimpleName(),

deferredImportSelector.getClass().getName()));

AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector)

.getAutoConfigurationEntry(

// 加载配置元数据

getAutoConfigurationMetadata(), annotationMetadata);

this.autoConfigurationEntries.add(autoConfigurationEntry);

for (String importClassName : autoConfigurationEntry.getConfigurations()) {

this.entries.putIfAbsent(importClassName, annotationMetadata);

}

}

private AutoConfigurationMetadata getAutoConfigurationMetadata() {

if (this.autoConfigurationMetadata == null) {

// 加载配置信息

this.autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);

}

return this.autoConfigurationMetadata;

}

static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader, String path) {

try {

// 获取资源路径

Enumeration urls = (classLoader != null) ? classLoader.getResources(path)

: ClassLoader.getSystemResources(path);

Properties properties = new Properties();

while (urls.hasMoreElements()) {

properties.putAll(PropertiesLoaderUtils.loadProperties(new UrlResource(urls.nextElement())));

}

return loadMetadata(properties);

}

catch (IOException ex) {

throw new IllegalArgumentException("Unable to load @ConditionalOnClass location [" + path + "]", ex);

}

}

protected static final String PATH = "META-INF/spring-autoconfigure-metadata.properties";

注意: 这个文件在target编译后的文件夹中

自动装配

spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories

该文件内存有:

Auto Configure

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\

org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\

org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\

org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\

org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\

EnableConfigurationProperties

@ConfigurationProperties(prefix = "spring.redis")

public class RedisProperties {

/**

* Database index used by the connection factory.

*/

private int database = 0;

/**

* Connection URL. Overrides host, port, and password. User is ignored. Example:

* redis://user:password@example.com:6379

*/

private String url;

/**

* Redis server host.

*/

private String host = "localhost";

/**

* Login password of the redis server.

*/

private String password;

/**

* Redis server port.

*/

private int port = 6379;

/**

* Whether to enable SSL support.

*/

private boolean ssl;

/**

* Connection timeout.

*/

private Duration timeout;

/**

* Client name to be set on connections with CLIENT SETNAME.

*/

private String clientName;

}

希望通过本篇对于springboot自动装配的解读,让大家对springboot底层有了一个http://大致了解,只分析了主要方法,希望对大家有帮助

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java后台与微信小程序的数据交互实现
下一篇:Java用户交互scanner及运算结构代码详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~