Spring Boot 启动类的注解 @SpringBootApplication 就是组合注解。
@SpringBootApplication
public class BaiJingApplication {
public static void main(String[] args) {
SpringApplication.run(BaiJingApplication.class, args);
}
}
获取部分代码,阅读更多内容自己去看源代码
@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 {};
假设已经 有了两个类,要创建一个组合注解:
resources
- Common.imports
创建文件 Common.imports ,文件内容为
biz.baijing.beanimport.conf.ComConf
配置文件的全类名;假设配置文件的内容。
@Configuration
public class ComConf {
@Bean
public Con con() {
return new Con();
}
@Bean
public Pro pro(Con con) {
System.out.println(con);
return new Pro();
}
}
这是一个标准的 Bean 注入的配置文件;Con 和 Pro 是两个实体类。
package biz.baijing.beanimport.conf;
import ...
public class ComImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
List<String> list = new ArrayList<>();
InputStream isFile = ComImportSelector.class.getClassLoader().getResourceAsStream("com.imports");
BufferedReader br = new BufferedReader(new InputStreamReader(isFile));
String line;
try{
while ((line = br.readLine()) != null) {
list.add(line);
}
}catch (Exception e){
throw new RuntimeException(e);
}finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
return list.toArray(new String[0]);
}
}
然后创建 Annotation 文件
package biz.baijing.beanimport.anno;
import ...
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(ComImportSelector.class)
public @interface EnableComConfiguration {
}
在启动类应用 Annotation 文件即可
package biz.baijing.beanimport.starter;
import ...
@SpringBootApplication
@EnableComConfiguration // 引用
public class BeanImportApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(BeanImportApplication.class, args);
// 测试代码,以下
Con con = context.getBean(Con.class);
System.out.println("<Con> " + con.toString());
Pro pro = (Pro) context.getBean("AA");
System.out.println("<Pro> " + pro.toString());
}
}