`
raymond.chen
  • 浏览: 1436870 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

自定义EnableXXX注解类

 
阅读更多

该自定义注解类用到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开发中的一个重要特性,它允许开发者创建自己的元数据,以便在编译时或运行时对代码进行验证和处理。自定义注解为代码提供了额外的信息,使得程序更具可读性、可维护性和灵活性。在本案例...

    自定义注解和注解解释器

    自定义注解,与注解解释器,并且实例化使用注解的类

    自定义运行期注解

    在Java编程语言中,自定义运行期注解(也称为元数据)是一种强大的工具,它允许程序员在代码中添加信息,这些信息可以在程序运行时被读取和处理。这种技术通常用于实现各种目的,如代码的验证、日志记录、性能分析等...

    自定义编译期注解

    注解处理器是一个实现了`javax.annotation.processing.Processor`接口的类,它会在编译期间由Java编译器自动调用。处理器可以分析被注解的元素,生成额外的源代码或执行验证。例如,我们的处理器可能会检查`myField`...

    Java自定义注解使用反射获取字段注解

    接下来,我们可以创建一个类并使用自定义注解标记某个字段: ```java public class AnnotationDemo { @MyCustomAnnotation("测试注解") private String testField; } ``` 现在,我们可以使用反射机制来获取这个...

    自定义校验注解框架(validator)

    定义和实现完成后,我们可以在模型类或方法参数上使用自定义注解,Spring等框架会在执行前自动进行校验: ```java public class User { @Email private String email; } ``` 5. **异常处理** 如果校验失败...

    java自定义注解实现由类自动生成表

    在本案例中,我们将探讨如何利用自定义注解实现在Java类定义后自动创建对应的数据库表,以适应SQL Server和Oracle这样的关系型数据库。 首先,我们需要理解自定义注解的基本结构。在Java中,你可以通过`@interface`...

    springboot工程自定义response注解、自定义规范化返回数据结构

    自定义注解的实现需要定义注解类,比如: ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface CustomResponse { int code() default 200; String message() default "...

    自定义注解实现伪动态传参的小demo

    在这个“自定义注解实现伪动态传参的小demo”中,我们将探讨如何创建一个自定义注解,以允许在注解中传递类似于动态参数的数据。 首先,自定义注解的定义通常以`@interface`关键字开始,我们可以定义一些元素(也...

    Gradle中如何自定义实现Java注解处理器

    创建自定义注解处理器的第一步是定义一个类实现`Processor`接口。这个类需要包含一个无参数的构造函数,以及实现`process`方法。`process`方法会接收到所有带有特定注解的类型元素,然后可以在这个方法内编写生成...

    java 自定义注解例子

    自定义注解允许开发者创建自己的注解类型,以满足特定项目需求。本教程将通过一个超市自动售卖机的例子来详细讲解如何在Java中实现自定义注解。 首先,我们需要了解注解的基本结构。在Java中,注解以`@`符号开头,...

    Spring 自定义注解的解析

    自定义注解是开发者创建的、用于给类、方法、变量等添加额外信息的特殊注解。例如,我们可以创建一个名为`@MyService`的注解,标记那些代表服务层类的实体。 接下来,我们将讨论如何在Spring中使用`@ComponentScan`...

    java自定义注解实践

    "java自定义注解实践" Java 自定义注解实践是 Java 语言中的一项重要特性,它可以使开发者自定义注解,以满足不同的需求。在本文中,我们将详细介绍 Java 自定义注解的概念、特点、实现方式及实践应用。 概念 ----...

    excel导入动态校验,自定义注解动态校验

    2. **编写校验逻辑**:为每个注解编写对应的校验逻辑,这些逻辑通常在验证处理器类中实现,负责解析注解并执行相应的校验操作。 3. **应用注解**:在数据模型或字段上使用自定义注解,指示哪些字段需要进行特定的...

    自定义注解及注解处理器PPT+Demo

    Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)...

    自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏

    自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回...

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...

    java 元注解+拦截器实现自定义注解.rar

    @CmwAutoWired:自定义依赖注入 注意:注入的接口和实现类需要在同一包名下,注解的是类则无限制 @FieldAnnotation:自定义属性注解 @MethodAnnotation:自定义方法注解 @MethodParam:自定义方法参数注解

    学习Android下自定义编译期注解,及使用UniTagUtilDemo.rar

    2. **创建注解处理器**:处理器是编译器在编译期间调用的一类特殊Java类,它们负责处理带有自定义注解的代码。实现`javax.annotation.processing.Processor`接口,并重写`process()`方法。处理器通常会生成新的源码...

Global site tag (gtag.js) - Google Analytics