Java 使用@Required和@Autowired时创建bean时出错
我是spring的新手。我试图在我的代码中使用Java 使用@Required和@Autowired时创建bean时出错,java,spring,Java,Spring,我是spring的新手。我试图在我的代码中使用@Required和@Autowired,但它给了我org.springframework.beans.factory.BeanCreationException。下面是我的代码。 1) StudentAuto.java public class StudentAuto { @Autowired private String name; @Autowired private String city; public String getCity()
@Required
和@Autowired
,但它给了我org.springframework.beans.factory.BeanCreationException
。下面是我的代码。1) StudentAuto.java
public class StudentAuto
{
@Autowired
private String name;
@Autowired
private String city;
public String getCity() {
return city;
}
@Required
public void setCity(String city) {
this.city = city;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2) spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config></context:annotation-config>
<bean id='stu' class='com.bean.StudentAuto' >
</bean>
<bean name='name' class='java.lang.String'>
<constructor-arg value="nm"></constructor-arg>
</bean>
<bean name='city' class='java.lang.String'>
<constructor-arg value="ci"></constructor-arg>
</bean>
</beans>
下面是错误堆栈跟踪
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stu' defined in class path resource [spring.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanInitializationException: Property 'city' is required for bean 'stu'
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1079)
at com.bean.TestApp.main(TestApp.java:14)
Caused by: org.springframework.beans.factory.BeanInitializationException: Property 'city' is required for bean 'stu'
at org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor.postProcessPropertyValues(RequiredAnnotationBeanPostProcessor.java:149)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
... 7 more
请在这个问题上帮助我。javadoc for
@Required
状态
将方法(通常是JavaBean setter方法)标记为
“必需”:即,必须将setter方法配置为
注入值的依赖项
请注意,带注释的方法不一定是setter,但它通常就是setter
@Required
方法由RequiredAnnotationBeanPostProcessor
处理,该处理器声明
这很好地将此类检查的责任推到了容器上
(可以说是属于该公司的),并且(部分)不需要
开发人员编写一个方法,只需检查所有必需的
属性实际上已经设置好了
因此,其目的是通过检查容器是否实际调用了该方法来确保设置属性
典型的模式是
class Foo {
private String value;
@Required
public void setValue(String value) {
this.value = value;
}
}
使用bean定义
<bean class="Foo" id="fooBean">
<property name="value" value="some value"/>
</bean>
如果您没有添加
,容器会抱怨并抛出异常,就像您的配置一样
<bean id='stu' class='com.bean.StudentAuto' >
</bean>
这里,容器没有使用
@Required
方法来设置属性。由于@Autowired
,它直接在字段上使用反射。因此,@必需的
注释未经验证。1。文件:
此注释仅指示受影响的bean属性必须在配置时通过bean定义中的显式属性值或通过自动连接来填充
2。请注意:
@Required
注释用于验证检查,而不是依赖项注入。
3。修复方法:
如错误日志所示:属性'city'是bean'stu'所必需的。
。因此,您应该手动将propery标记添加到stu
bean-injectcity
:
<bean id="stu" class="com.bean.StudentAuto">
<property name="city" value="London"/>
</bean>
属性'city'是bean'stu'所必需的。
为什么指定@required
,为什么将其放在与@Autowired
不同的成员上@Autowired
默认为必需;只需删除@Required
注释即可。另外,如果您是Spring新手,我建议您学习JavaConfig系统而不是XML配置。在我看来,它更干净、更容易使用。同时使用@Required
和@Autowired
没有任何意义:@Autowired
如果无法设置属性,将导致异常。添加@Required
只会为另一个独立的机制做更多的工作,该机制会遍历bean并检查需求是否满足。如果使用@Autowired
,则属性设置为“完全停止”。您不需要检查它是否已设置,因为它肯定是通过一个@Autowired
属性设置的。您能告诉我如何从配置注释java类中的Bean注释方法中设置所需的注释参数吗(java方式相当于给定的解决方案)。谢谢
<bean id="stu" class="com.bean.StudentAuto">
<property name="city" value="London"/>
</bean>