基于Java对Spring代码配置
@Configuration
public Class AppConfig {
@Bean
public SampleService sampleService() {
return new SampleService();
}
}
@Bean注解用于修饰方法,方法的返回值会作为一个Bean装配到Spring容器。
@Configuration注解用于修饰一个类,表明这个类的作用是用来对Spring容器进行配置的。
上面的代码相当于XML配置
<beans> <bean id = "sampleService" class = "com.**.SampleService.class"/> </beans>
Java代码配置ComponentScan
@ComponentScan("com.**.service.impl")
@Configuration
public Class AppConfig {
}
上面的代码相当于XML配置
<beans> <context:component-scan base-package="com.**.service.impl"/> </beans>
使用@Import组合多个配置
Spring通常会创建多个配置类,再借助@Import将多个配置类组合成一个。
@Configuration
public class ConfigA {
@Bean
public A a() {
return new A();
}
}
@Configuration
@Import(ConfigA.class)
public class ConfigB {
@Bean
public B b() {
return new B();
}
}
加载ConfigB的配置,就自动加载了ConfigA的配置。
@SpringBootApplication注解
@SpringBootApplication是一个组合注解,由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan构成
@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
@EnableAutoConfiguration
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration
将主配置类所在包及其子包的所有配置的Bean扫描加载到Spring容器,利用SpringFactoriesLoader机制加载自动装配配置,它的配置数据在META-INF/spring.factories中
notes:所有实现ImportSelector的类都会在启动时被ConfigurationClassParser中的processImports进行实例化并执行selectImports
1)SpringFactoriesLoader
loadSpringFactories(ClassLoader classLoader)会遍历整个ClassLoader中所有jar包下的spring.factories文件
2)AutoConfigurationImportSelector
// SpringFactoriesLoader会根据EnableAutoConfiguration.class去所有spring.factories里找对应的value
List<String> configurations = SpringFacotoriesLoader.loadFactoryName(EnableAutoConfiguration.class, ClassLoader);
// 加载对应的文件
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
classLoader.getResource(FACTORIES_RESOURCE_LOCATION);