Spring @Required注释
时间:2020-01-09 10:44:35 来源:igfitidea点击:
Spring @Required注释与一种方法(通常是setter方法)一起使用,从而使该属性的setter依赖项注入成为必需。
RequiredAnnotationBeanPostProcessor类
要使用@Required批注,需要注册RequiredAnnotationBeanPostProcessor类。默认的RequiredAnnotationBeanPostProcessor将通过" context:annotation-config"和" context:component-scan" XML标签进行注册。
Spring @Required注释示例
在示例中,有两个类Person和Address。
地址.java
public class Address { private String houseNo; private String street; private String city; private String state; private String pinCode; public String getHouseNo() { return houseNo; } public String getStreet() { return street; } public String getCity() { return city; } public String getState() { return state; } public String getPinCode() { return pinCode; } public void setHouseNo(String houseNo) { this.houseNo = houseNo; } public void setStreet(String street) { this.street = street; } public void setCity(String city) { this.city = city; } public void setState(String state) { this.state = state; } public void setPinCode(String pinCode) { this.pinCode = pinCode; } }
人.java
public class Person { private String name; private int age; private Address address; public String getName() { return name; } @Required public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Required public void setAddress(Address address) { this.address = address; } public Address getAddress() { return address; } }
在Person类中,字段名称和地址引用使用@Required注释进行注释。这意味着这些值是必需的,否则将引发BeanCreationException。
XML配置
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- Takes care of registering RequiredAnnotationBeanPostProcessor --> <context:annotation-config/> <bean id="person" class="com.theitroad.springexample.Person"> <!-- <property name="name" value="John"></property> --> <property name="age" value="35"></property> </bean> <bean id="address" class="com.theitroad.springexample.Address"> <property name="houseNo" value = "432" /> <property name="street" value = "E Lafayette Street" /> <property name="city" value = "Detroit" /> <property name="state" value = "Michigan" /> <property name="pinCode" value = "48207" /> </bean> </beans>
在此请注意,尽管两个字段都使用@Required注释进行了注释,但并未提供name属性作为地址引用。
现在,如果我们运行此示例,
public class App { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml"); Person person = context.getBean("person", Person.class); System.out.println("City- " + person.getAddress().getCity()); context.close(); } }
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'person' defined in class path resource [appcontext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanInitializationException: Properties 'address' and 'name' are required for bean 'person'
如我们所见,Spring容器无法创建bean"个人",因为必需有操作"地址"和"名称",而没有提供这些属性的值。
在XML配置中进行更改以包括必需的属性。
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- Takes care of registering RequiredAnnotationBeanPostProcessor --> <context:annotation-config/> <bean id="person" class="com.theitroad.springexample.Person"> <property name="name" value="John"></property> <property name="age" value="35"></property> <property name="address" ref="address" /> </bean> <bean id="address" class="com.theitroad.springexample.Address"> <property name="houseNo" value = "432" /> <property name="street" value = "E Lafayette Street" /> <property name="city" value = "Detroit" /> <property name="state" value = "Michigan" /> <property name="pinCode" value = "48207" /> </bean> </beans>
现在显示正确的输出
City- Detroit
请注意,自5.1起,不推荐使用Spring @Required注释,而赞成对必需的设置使用构造函数注入。