实现 Spring Boot 3的组合注解,java

发布于:2025-06-12 ⋅ 阅读:(21) ⋅ 点赞:(0)

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());
    }


}