2016-05-14 16 views
3

我正在用自定義註釋檢查spring依賴關係我已經在java中創建了一個自定義註釋,並將其應用於FIELD。其對METHOD工作,但不是在FEILD關於類的java註釋FIELD不起作用

我的自定義註釋類是

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; 
    } 

} 

和我的彈簧配置文件是

<?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> 

我的應用程序類是

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需要

回答

3

根據的JavaDoc異常特性,RequiredAnnotationBeanPostProcessor看屬性setter方法,而不是屬性字段本身。

此BeanPostProcessor的存在的動機是允許開發者自己的類的註釋setter屬性與任意JDK 1.5註釋以指示該容器必須檢查的依賴注入值的配置。

的強調部分稍顯混亂,所以我確認通過查看@Required JavaDoc的註釋,這是默認的註解RequiredAnnotationBeanPostProcessor檢查。你應該注意到的是,@Target元註釋中的引用方法(不域),以及JavaDoc中提到以下幾點:

標記爲被「必要」的方法(通常是JavaBean的setter方法):那是,setter方法必須配置爲使用值進行依賴注入。