之前写过Java的自定义注解,但是一直没有深入的去研究这个东西。下面就是我这几天研究的心得。
annotation的基础知识我之前的博客有,这里只讲例子:
Annotation注解的定义
类上的注解:
package anno; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE)//类上的注解 @Retention(RetentionPolicy.RUNTIME)//在运行时有效 public @interface TypeAnnotation { /** * 类名称注解,默认值为类名称 * @return */ public String tableName() default "className"; /** * 枚举例子 * @author peida * */ public enum EnumClassDemo{BULE,RED,GREEN}; /** * 枚举例子属性 * @return */ EnumClassDemo getEnumClassDemo() default EnumClassDemo.RED; }
属性上的注解:
package anno; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD)//属性上的注解 @Retention(RetentionPolicy.RUNTIME)//运行时有效 public @interface FiledAnnotation { /** * 字段名称注解,默认值为类名称 * @return */ public String fileName() default "fileName"; /** * 枚举例子 * @author peida * */ public enum EnumFiledDemo{BULE,RED,GREEN}; /** * 枚举例子属性 * @return */ EnumFiledDemo getEnumFiledDemo() default EnumFiledDemo.GREEN; }
注解支持类:
这里特别注意:要实现spring的BeanPostProcessor接口,这个接口里面有两个方法,
一个是实例化bean之前调用的方法postProcessBeforeInitialization,
一个是实例化bean之后调用的方法postProcessAfterInitialization。
可以把解析注解代码,放到之后的方法postProcessAfterInitialization里面,可对bean做一些修改。
package annosupport; import java.lang.reflect.Field; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import anno.FiledAnnotation; import anno.TypeAnnotation; import service.Table; public class AnnoSupport implements BeanPostProcessor{ public static Table annoImpl() throws Exception{ Class<Table> class1=Table.class; Table table=class1.newInstance();//返回对象新的实例 if(class1.isAnnotationPresent(TypeAnnotation.class)){//判断类上面是否有注解 TypeAnnotation typeAnnotation=(TypeAnnotation) class1.getAnnotation(TypeAnnotation.class);//得到类注解对象 System.out.println("tableName:"+typeAnnotation.tableName()+"------>getEnumClassDemo:"+typeAnnotation.getEnumClassDemo()); class1.getMethod("setId", String.class).invoke(table, typeAnnotation.tableName());//调用setter方法设置值,id值 } Field[] fields= class1.getDeclaredFields();//得到所有属性 for (Field field : fields) { if(field.isAnnotationPresent(FiledAnnotation.class)){//判断字段上面是否有注解 FiledAnnotation filedAnnotation=field.getAnnotation(FiledAnnotation.class);//得到字段注解对象 System.out.println("fileName:"+filedAnnotation.fileName()+"------>getEnumFiledDemo:"+filedAnnotation.getEnumFiledDemo()); class1.getMethod("setName", String.class).invoke(table, filedAnnotation.fileName());//调用setter方法设置值,name值 } } return table; } /** * spring bean 实例化之前操作 */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // TODO Auto-generated method stub System.out.println("bean实例化之前"); return bean; } /** * spring bean 实例化之后操作 */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { // TODO Auto-generated method stub System.out.println("bean实例化之后"); try { bean=annoImpl(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return bean; } }
配置spring的配置文件
配置包的扫描路径以及位置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.1.xsd"> <bean id="table" class="service.Table"/><!--把被注解的类交给spring管理--> <bean class="annosupport.AnnoSupport"/><!--注解支持类交给spring管理--> </beans>
被注解的类
package service; import org.springframework.stereotype.Service; import anno.FiledAnnotation; import anno.TypeAnnotation; import anno.FiledAnnotation.EnumFiledDemo; import anno.TypeAnnotation.EnumClassDemo; @TypeAnnotation(tableName="类注解",getEnumClassDemo=EnumClassDemo.BULE) public class Table { private String id; @FiledAnnotation(fileName="字段注解",getEnumFiledDemo=EnumFiledDemo.GREEN) private String name; private int age; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
测试例子:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.Table;
public class TestSpring {
public static void main(String[] args) {
try {
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
Table table=(Table) ctx.getBean("table");
System.out.println("id:"+table.getId()+"---->name:"+table.getName());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
bean实例化之后
tableName:类注解------>getEnumClassDemo:BULE
fileName:字段注解------>getEnumFiledDemo:GREEN
id:类注解---->name:字段注解//说明注解成功起作用了,类注解的作用是把tableName值放入id属性中,并创建实例;字段注解是吧filedName值放入name属性当中,并注入实例。
AnnoSupport加上@Service注解交给spring
Table加上@Service注解交给spring
在spring配置文件进行配置:
<context:component-scan base-package="annosupport" />
<context:component-scan base-package="service" />
其余的bean配置可以去掉
直接测试也可以
相关推荐
Spring框架广泛运用了多种设计模式,如工厂模式(BeanFactory)、单例模式(Singleton)、代理模式(AOP代理)、装饰器模式(BeanPostProcessor)等,这些模式的运用使得Spring具有高度的灵活性和可扩展性。...
Spring注解详解 Spring框架中,注解(Annotation)是一种元数据,能够提供更多关于程序元素的信息,从而简化配置和编程。Spring从2.5版本开始支持注解,通过使用注解,可以使得Bean的配置更加简洁和灵活。 注册...
【Spring的BeanPostProcessor与工厂模式】 在Spring框架中,BeanPostProcessor(BPP)是一个强大的接口,它允许我们自定义bean的初始化和销毁过程。BPP是在bean实例化之后,但初始化之前以及销毁之前执行特定操作的...
Spring 注解详解 Spring 注解是 Spring 框架中的一种强大功能,它允许开发者使用注解来配置和管理 Bean 对象。本文将详细讲解 Spring 注解的含义、类型、使用方法和相关配置。 注册注解处理器 在 Spring 中,需要...
这时,自定义注解和`BeanPostProcessor`的结合可以提供更大的灵活性,让你能够根据业务逻辑定制更复杂的注入规则。 总的来说,`@Value`在Spring 4中是一个强大且灵活的工具,用于注入配置值。通过理解它的基本用法...
### Spring注解驱动开发知识点详解 #### 一、Spring注解驱动概述 Spring框架通过引入注解支持,极大地简化了Java EE应用的开发工作。它不仅提供了基础的依赖注入功能,还增强了对组件扫描的支持,使得开发者能够...
【Spring 2.0 知识点详解】 Spring 2.0是Java企业级应用开发中的重要框架,它以其简洁的“实用主义”原则降低了J2EE开发的复杂性。以下将详细介绍Spring 2.0的核心技术和关键特性。 1. **Spring 概述** - **起源...
### Spring4 注解详解 #### 一、背景与概述 在Spring框架的早期版本中,主要依赖XML配置文件来进行依赖注入和其他配置管理。随着技术的发展和应用需求的变化,这种配置方式逐渐显得繁琐且不易维护。为了解决这一...
《Spring自定义实现详解》 在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,它以其强大的依赖注入、面向切面编程以及丰富的生态体系赢得了开发者们的喜爱。本项目"spring-custom-master"旨在深入...
Spring通过一系列的扩展点和钩子(hook),允许开发者自定义容器行为,其中BeanPostProcessor接口就是一个非常重要的扩展点。 BeanPostProcessor接口提供了两个方法,分别是postProcessBeforeInitialization和...
综上所述,要在低版本的Spring中实现类似自动配置的功能,需要巧妙地利用Spring提供的扩展点,如BeanFactoryPostProcessor和BeanPostProcessor,以及Java Config和XML配置的组合。同时,还需要结合生命周期回调和...
### Spring的BeanFactory的接口注解 #### 一、引言 在Spring框架中,`BeanFactory`是工厂模式的一种实现,它负责管理容器中的Bean的生命周期与依赖注入。了解`BeanFactory`及其相关接口的功能对于掌握Spring的核心...
- **@Aspect与Advisor**:解释Spring AOP中的@Aspect注解和Advisor的作用。 - **静态通知**:分析静态通知的实现机制。 - **动态通知**:探讨动态通知的实现原理。 #### 3. MVC框架 - **MVC处理流程**:详细介绍...
此外,Spring提供了多种扩展点,如 BeanPostProcessor 和 InstantiationAwareBeanPostProcessor,允许自定义处理Bean的创建和初始化过程。 在Spring框架中,"spring-beans"模块是所有其他模块的基石,它提供的IoC...
Spring3 是一个强大的Java应用程序框架,它引入了注解来简化配置,提高代码的可读性和可维护性。本文将详细介绍Spring3中的主要注解及其用法。 首先,要让Spring容器识别并处理注解,我们需要注册注解处理器。有三...