实现 Spring Boot 3的组合注解,java
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 {@Beanpublic Con con() {return new Con();}@Beanpublic 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 {@Overridepublic 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());}}