Spring 的手动转配与Spring Boot自动装配的区别
以WebMvcAutoConfiguration为例
// 模式注解--是@Component派生注解
@Configuration(proxyBeanMethods = false)
// @Conditional(OnWebApplicationCondition.class)还是基于Condition来实现的
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
}
Spring Boot自动装配
定义:基于约定大于配置的原则,实现Spring组件自动装配的目的。【Spring Framework中很多都需要配置手动配置】
转配:模式注解、@Enable模块【配置的方式】、条件装配、工厂加载机制
实现:
- 激活自动装配
- @EnableAutoConfiguration
- 实现自动装配
- xxxAutoConfiguration
- 配置自动装配实现
- spring.factories
底层装配技术
- Spring模式注解装配
- Spring @Enable模块装配
- Spring 条件装配
- Spring工厂加载机制
- 实现类:SpringFactoriesLoader
- 配置资源:META-INFO/spring.factories
public final class SpringFactoriesLoader {
// 该目录下放了很多自动装配的内容
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class);
private static final Map<ClassLoader, MultiValueMap<String, String>> cache = new ConcurrentReferenceHashMap();
private SpringFactoriesLoader() {
}
// factoryClass: 工厂类--激活自动装配 classLoader: 相应的类加载器
public static <T> List<T> loadFactories(Class<T> factoryClass, @Nullable ClassLoader classLoader) {
...
// 主要核心操作--迭代装配
List<T> result = new ArrayList(factoryNames.size());
Iterator var5 = factoryNames.iterator();
while(var5.hasNext()) {
String factoryName = (String)var5.next();
result.add(instantiateFactory(factoryName, factoryClass, classLoaderToUse));
}
...
}
}
自动装配
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,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudServiceConnectorsAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
自定义自动装配
- 条件判断:user.name == "Administrator"
- 模式注解:@Configuration
- @Enable模块:@EnableHelloWorld->HelloworldImportSelector->HelloWorldConfiguration->helloworld
/**
* Spring Boot自动装配
*/
@EnableHelloWorld
public class EnableHelloWorldBootstrap {
public static void main(String[] args) {
ConfigurableApplicationContext context = new SpringApplicationBuilder(EnableHelloWorldBootstrap.class)
.web(WebApplicationType.NONE)
.run(args);
// helloWorld Bean是否存在
String helloWorld = context.getBean("helloWorld", String.class);
System.out.println("helloWorld Bean : " + helloWorld);
context.close();
}
}
@Configuration // Spring 模式注解
@EnableHelloWorld // Spring @Enable模块装配--会节约很多的模块开发
// 条件装配
@ConditionalOnSystemProperty(name="user.name", value = "Administrator")
public class HelloWorldAutoConfiguration {
}
# 自动装配
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.SpringBootStudy.diveinspringboot.Configuration.HelloWorldAutoConfiguration
参考内容:
《慕课网--小马哥Spring Boot2.0》