1. 实现步骤

1.1. 写一个自定义注解

1
2
3
4
5
6
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface WMapper {
}

1.2. 实现一个ImportBeanDefinitionRegistrar

1
2
3
4
5
6
7
8
9
10
11
12
public static class HelloImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//借助ClassPathBeanDefinitionScanner扫描类
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry, false);
//加入自定义注解
scanner.addIncludeFilter(new AnnotationTypeFilter(WMapper.class));
//扫描指定包
scanner.scan("io.github.weiwenduo");
}
}

1.3. 配置类

1
2
3
4
@Configuration
@Import(HelloImportBeanDefinitionRegister.class)
public class HelloConfiguration {
}

1.4. 写一个类,加上我们的自定义注解

1
2
3
@WMapper
public class HelloService {
}

1.5. 写一个测试类试一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@SpringBootTest(classes = SpringBasicApplication.class)
@ImportAutoConfiguration({HelloConfiguration.class})
public class Case1Test {

@Autowired(required = false)
private OtherService otherService;

@Test
public void test() {
Optional.ofNullable(otherService).ifPresentOrElse(
o -> System.out.println("otherService注入成功"),
() -> System.out.println(OtherService.class.getSimpleName() + "为空,注入失败")
);
}

}

输入如下结果

1
2
3
2021-03-03 16:06:51.421  INFO 97481 --- [           main] i.g.w.spring.test.case1.Case1Test        : No active profile set, falling back to default profiles: default
2021-03-03 16:06:51.655 INFO 97481 --- [ main] i.g.w.spring.test.case1.Case1Test : Started Case1Test in 0.373 seconds (JVM running for 0.959)
otherService注入成功

说明类已经加载到Bean容器中了。