类FIELD上的java注释不起作用

时间:2016-05-14 04:24:02

标签: java spring annotations

我正在使用自定义注释检查spring依赖关系我在java中创建了一个自定义注释,我将其应用于FIELD。它处理METHOD但未处理FEILD

我的自定义注释是类

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Mandatory {
}

我的目标类是:

public class Student {  
    @Mandatory
    int salary;

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

}

我的spring-configuration文件是

<?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:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <context:annotation-config />

    <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor">
    <property name="requiredAnnotationType" value="com.spring.core.annotation.Mandatory"/>
    </bean>


<bean id="student" class="com.spring.core.annotation.Student">
    <!-- <property name="salary" value="200000"></property> -->
</bean> 

</beans>

我的app类是

public class App {

    public static void main(String[] args) {
        ApplicationContext context= new ClassPathXmlApplicationContext("annotations.xml");
        Student stud= (Student)context.getBean("student");
        System.out.println(stud);
    }
}

输出为:Student [salary=0]

预期:它应该抛出异常属性salary

1 个答案:

答案 0 :(得分:3)

根据JavaDoc,RequiredAnnotationBeanPostProcessor查看属性setter方法,而不是属性字段本身。

  

此BeanPostProcessor存在的动机是允许开发人员使用任意JDK 1.5注释来注释其自己的类的 setter属性,以指示容器必须检查依赖项的配置注入价值。

强调部分有点混乱,所以我通过查看@Required注释JavaDoc来确认,这是RequiredAnnotationBeanPostProcessor检查的默认注释。您应该注意到@Target元注释仅引用METHOD(而不是FIELD),JavaDoc提到以下内容:

  

将方法(通常是JavaBean setter方法)标记为“必需”,即 setter方法必须配置为依赖注入值。< / p>