JAVA自定义注解(2)


这个例子在实际应用中是比较有用的,用来将配置文件(*.properties)或者系统属性中的指定属性名称的值加载进来。此例是和Spring结合使用的,所以其他配置就略过了。

1、定义注解@Property

[java] view plain copy
  1. package com.kute.test.selfannotation;  
  2.   
  3. import java.lang.annotation.ElementType;  
  4. import java.lang.annotation.Retention;  
  5. import java.lang.annotation.RetentionPolicy;  
  6. import java.lang.annotation.Target;  
  7.   
  8. /** 
  9.  * 自定义注解@Property 
  10.  * 加载配置文件和相应的属性 
  11.  */  
  12.   
  13. @Retention(RetentionPolicy.RUNTIME)  
  14. @Target({ ElementType.TYPE, ElementType.METHOD })  
  15. public @interface Property {  
  16.   
  17.     //属性名称  
  18.     String name() default "";  
  19. }  

2、解析注解
[java] view plain copy
  1. package com.kute.test.selfannotation;  
  2.   
  3. import java.lang.reflect.Method;  
  4. import java.util.Properties;  
  5.   
  6. import org.slf4j.Logger;  
  7. import org.slf4j.LoggerFactory;  
  8. import org.springframework.beans.BeansException;  
  9. import org.springframework.beans.factory.InitializingBean;  
  10. import org.springframework.beans.factory.config.BeanPostProcessor;  
  11. import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;  
  12. import org.springframework.util.ReflectionUtils;  
  13.   
  14. public class PropertyParse extends PropertyPlaceholderConfigurer implements  
  15.         BeanPostProcessor, InitializingBean {  
  16.   
  17.     private static Logger logger = LoggerFactory.getLogger(PropertyParse.class);  
  18.     private Properties pros = null;  
  19.   
  20.     // 在spring容器实例化bean之后添加自己的逻辑  
  21.     public Object postProcessAfterInitialization(Object bean, String beanName)  
  22.             throws BeansException {  
  23.         return bean;  
  24.     }  
  25.   
  26.     // 在spring容器实例化bean之前添加自己的逻辑  
  27.     public Object postProcessBeforeInitialization(Object bean, String beanName)  
  28.             throws BeansException {  
  29.         if (bean.getClass().getAnnotation(Property.class) != null) {  
  30.             Method[] methods = bean.getClass().getDeclaredMethods();  
  31.             for (Method method : methods) {  
  32.                 Property p = method.getAnnotation(Property.class);  
  33.                 if (p != null) {  
  34.                     //获得对应名称的属性的值  
  35.                     Object para = pros.getProperty(p.name());  
  36.                     //方法参数类型名称  
  37.                     String parameterName = (method.getParameterTypes()[0]).getName();  
  38.                       
  39.                     if (parameterName.equals("java.lang.Integer")) {  
  40.                         para = new Integer(para.toString());  
  41.                     }else if (parameterName.equals(  
  42.                             "java.lang.Double")) {  
  43.                         para = new Long(para.toString());  
  44.                     }else if (parameterName.equals(  
  45.                             "java.lang.String")) {  
  46.                         para = para.toString();  
  47.                     }  
  48.                     logger.info("获得了指定名称的属性的值:" + para);  
  49.                     ReflectionUtils.invokeMethod(method, bean,  
  50.                             new Object[] { para });  
  51.                 }  
  52.             }  
  53.         }  
  54.         return bean;  
  55.     }  
  56.   
  57.     // 在初始化bean的时候执行该方法  
  58.     public void afterPropertiesSet() throws Exception {  
  59.         //此方法的作用是将配置的和系统属性加载进来  
  60.         pros = mergeProperties();  
  61.     }  
  62.   
  63. }  

3、应用注解
[java] view plain copy
  1. package com.kute.test.selfannotation;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import org.slf4j.Logger;  
  6. import org.slf4j.LoggerFactory;  
  7.   
  8. @Property  
  9. public class Teacher implements Serializable {  
  10.       
  11.     private static final long serialVersionUID = 7651360997972750779L;  
  12.     private static Logger logger = LoggerFactory.getLogger(Teacher.class);  
  13.   
  14.     @Property(name = "third.kute.blog")  
  15.     public void setValue(String value) {  
  16.         logger.info("成功设String值:" + value);  
  17.     }  
  18.       
  19.     @Property(name = "second.kute.age")  
  20.     public void setValue(Integer value) {  
  21.         logger.info("成功设Integer值:" + value);  
  22.     }  
  23.   
  24.     @Property(name = "first.kute.name")  
  25.     public void setValue(Double value) {  
  26.         logger.info("成功设Double值:" + value);  
  27.     }  
  28. }  

4、配置文件(部分)(applicationContext.xml)
[java] view plain copy
  1. <!-- PropertyParse此bean是继承了PropertyPlaceholderConfigurer来加载配置文件 -->  
  2.     <bean class="com.kute.test.selfannotation.PropertyParse">  
  3.         <!-- 除了支持配置的*.properties外,还支持获取系统属性(System.getProperties() -->  
  4.         <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />  
  5.         <!-- 资源找不到不抛出异常 -->  
  6.         <property name="ignoreResourceNotFound" value="true" />  
  7.         <property name="locations">  
  8.             <list>  
  9.                 <value>classpath*:/first.properties</value>  
  10.                 <value>classpath*:/second.properties</value>  
  11.                 <value>classpath*:/third.properties</value>  
  12.             </list>  
  13.         </property>  
  14.     </bean>  

5、文件内容

first.properties

[html] view plain copy
  1. first.kute.name=36.0  
  2. first.kute.age=111111  
  3. first.kute.blog=http://blog.csdn.net/kutekute  

second.properties

[html] view plain copy
  1. second.kute.name=37.0  
  2. second.kute.age=222222  
  3. second.kute.blog=http://blog.csdn.net/kutekute  

third.properties

[html] view plain copy
  1. third.kute.name=38.0  
  2. third.kute.age=333333  
  3. third.kute.blog=http://blog.csdn.net/kutekute 

你可能感兴趣的:(JAVA自定义注解(2))