该自定义注解类用到ImportSelector接口类,它用于判断被@Configuration注解修饰的类是否应该被导入。处理ImportSelector接口时,bean定义已经被加载,但是bean还没有被实例化。
DeferredImportSelector接口类:继承于ImportSelector接口类,延迟选择性导入类,在所有被@Configuration注解修饰的类处理完成后才运行。DeferredImportSelector用在处理@Conditional相关的导入时特别有用。
EnableXXX >> @Import >> ImportSelector or ImportBeanDefinitionRegistrar >> 注册BeanDefinition
1、创建一个配置类
@Configuration public class SeasyImportSelectorConfig { @Bean public ServiceConfig serviceConfig(){ ServiceConfig config = new ServiceConfig(); config.setName("userService"); config.setDescription(""); return config; } }
2、创建ImportSelector的子类
/** * ImportSelector:有条件的选择被@Configuration注解标注的类进行导入 */ public class SeasyImportSelector implements ImportSelector, BeanFactoryAware { public static final String ANNOTATION_CLASS_NAME = EnableSeasy.class.getName(); private BeanFactory beanFactory; /** * 返回被选中的全限定类名的数组 * * @param annotationMetadata 自定义Enable注解类所在类中包含的所有注解类元数据 */ @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { //获取注解类的所有属性 MultiValueMap<String, Object> allAnnotationAttributes = annotationMetadata.getAllAnnotationAttributes(ANNOTATION_CLASS_NAME, true); for(Iterator<String> it=allAnnotationAttributes.keySet().iterator(); it.hasNext();){ String key = it.next(); List<Object> list = allAnnotationAttributes.get(key); Object value = list.get(0); if(value instanceof String[] || value.getClass().isArray()){ System.out.println(key + "=" + Arrays.toString((String[])value)); }else{ System.out.println(key + "=" + value); } } //获取注解类所在类的所有注解类 annotationMetadata.getAnnotationTypes().forEach(System.out::println); //InterfaceNames Stream.of(annotationMetadata.getInterfaceNames()).forEach(System.out::println); //MemberClassNames Stream.of(annotationMetadata.getMemberClassNames()).forEach(System.out::println); //MetaAnnotationTypes annotationMetadata.getMetaAnnotationTypes(ANNOTATION_CLASS_NAME).forEach(System.out::println); System.out.println("ClassName: " + annotationMetadata.getClassName()); return new String[]{SeasyImportSelectorConfig.class.getName()}; } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } }
3、创建自定义注解类
@Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) //@Import注解类:表示将ImportSelector选中返回的类导入到容器中 @Import(SeasyImportSelector.class) public @interface EnableSeasy { }
4、创建一个测试用的配置类,并加入自定义 @EnableSeasy 注解类
@Configuration @EnableSeasy @ComponentScan public class EnableSeasyConfig { }
5、测试代码
public class EnableSeasyTest { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(EnableSeasyConfig.class); ServiceConfig serviceConfig = applicationContext.getBean(ServiceConfig.class); System.out.println(serviceConfig.getName()); } }
相关推荐
自定义注解可以应用于类、接口、方法、变量等不同层级,使得代码更加模块化,易于理解和维护。本篇文章将详细探讨如何实现生成自定义注解的实体类,以及它们在实际开发中的应用。 一、自定义注解的定义 自定义注解...
Java 自定义注解验证是Java开发中的一个重要特性,它允许开发者创建自己的元数据,以便在编译时或运行时对代码进行验证和处理。自定义注解为代码提供了额外的信息,使得程序更具可读性、可维护性和灵活性。在本案例...
自定义注解,与注解解释器,并且实例化使用注解的类
在Java编程语言中,自定义运行期注解(也称为元数据)是一种强大的工具,它允许程序员在代码中添加信息,这些信息可以在程序运行时被读取和处理。这种技术通常用于实现各种目的,如代码的验证、日志记录、性能分析等...
注解处理器是一个实现了`javax.annotation.processing.Processor`接口的类,它会在编译期间由Java编译器自动调用。处理器可以分析被注解的元素,生成额外的源代码或执行验证。例如,我们的处理器可能会检查`myField`...
接下来,我们可以创建一个类并使用自定义注解标记某个字段: ```java public class AnnotationDemo { @MyCustomAnnotation("测试注解") private String testField; } ``` 现在,我们可以使用反射机制来获取这个...
定义和实现完成后,我们可以在模型类或方法参数上使用自定义注解,Spring等框架会在执行前自动进行校验: ```java public class User { @Email private String email; } ``` 5. **异常处理** 如果校验失败...
在本案例中,我们将探讨如何利用自定义注解实现在Java类定义后自动创建对应的数据库表,以适应SQL Server和Oracle这样的关系型数据库。 首先,我们需要理解自定义注解的基本结构。在Java中,你可以通过`@interface`...
自定义注解的实现需要定义注解类,比如: ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface CustomResponse { int code() default 200; String message() default "...
在这个“自定义注解实现伪动态传参的小demo”中,我们将探讨如何创建一个自定义注解,以允许在注解中传递类似于动态参数的数据。 首先,自定义注解的定义通常以`@interface`关键字开始,我们可以定义一些元素(也...
创建自定义注解处理器的第一步是定义一个类实现`Processor`接口。这个类需要包含一个无参数的构造函数,以及实现`process`方法。`process`方法会接收到所有带有特定注解的类型元素,然后可以在这个方法内编写生成...
自定义注解允许开发者创建自己的注解类型,以满足特定项目需求。本教程将通过一个超市自动售卖机的例子来详细讲解如何在Java中实现自定义注解。 首先,我们需要了解注解的基本结构。在Java中,注解以`@`符号开头,...
自定义注解是开发者创建的、用于给类、方法、变量等添加额外信息的特殊注解。例如,我们可以创建一个名为`@MyService`的注解,标记那些代表服务层类的实体。 接下来,我们将讨论如何在Spring中使用`@ComponentScan`...
"java自定义注解实践" Java 自定义注解实践是 Java 语言中的一项重要特性,它可以使开发者自定义注解,以满足不同的需求。在本文中,我们将详细介绍 Java 自定义注解的概念、特点、实现方式及实践应用。 概念 ----...
2. **编写校验逻辑**:为每个注解编写对应的校验逻辑,这些逻辑通常在验证处理器类中实现,负责解析注解并执行相应的校验操作。 3. **应用注解**:在数据模型或字段上使用自定义注解,指示哪些字段需要进行特定的...
Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)...
自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回...
3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...
@CmwAutoWired:自定义依赖注入 注意:注入的接口和实现类需要在同一包名下,注解的是类则无限制 @FieldAnnotation:自定义属性注解 @MethodAnnotation:自定义方法注解 @MethodParam:自定义方法参数注解
2. **创建注解处理器**:处理器是编译器在编译期间调用的一类特殊Java类,它们负责处理带有自定义注解的代码。实现`javax.annotation.processing.Processor`接口,并重写`process()`方法。处理器通常会生成新的源码...