我已阅读@Required用于确保已设置属性。 但是,当我尝试将其与Spring Annotation Configuration一起使用时,它将无法正常工作。
下面您可以熟悉我的代码库。
@Configuration
@ComponentScan
public class AppConfig {
@Bean(initMethod = "initMethod")
public SimpleClass simpleClass(){
return new SimpleClass();
}
}
public class SimpleClass implements InitializingBean {
private int n;
public SimpleClass() {
System.out.println("constructor");
}
public int getN() {
return n;
}
@Required
public void setN(int n) {
System.out.println("setter");
this.n = n;
}
void initMethod(){
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet()");
}
}
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
SimpleClass simpleClass = context.getBean(SimpleClass.class);
}
}
为什么Spring应用程序上下文会创建SimpleClass Bean,而不抱怨没有通过setter进行注入?
UPD: 当我尝试使用XML配置进行相同的操作并添加时,然后收到“线程“主”中的异常” org.springframework.beans.factory.BeanCreationException:bean“简单”需要属性“ n””
答案 0 :(得分:2)
您需要将其与@Autowired(或@Value,如果您注入简单值)注释一起使用。
答案 1 :(得分:2)
@Required
文档说明(强调是我的):
将方法(通常是JavaBean setter方法)标记为 'required':即, setter方法必须配置为 依赖项注入了一个值。
使用Spring为了将方法配置为注入依赖项,您必须指定它(@Autowired
是标准方法)。
但是在方法上同时指定@Autowired
和@Required
似乎很笨拙:
@Autowired
@Required
public void setN(int n) {
System.out.println("setter");
this.n = n;
}
相反,要将配置器配置为依赖项注入和必需注入,我建议仅使用@Autowired
,默认情况下是必需的,您会注意到:
public @interface Autowired {
/**
* Declares whether the annotated dependency is required.
* <p>Defaults to {@code true}.
*/
boolean required() default true;
}
所以就足够了:
@Autowired
public void setN(int n) {
System.out.println("setter");
this.n = n;
}
请注意,setter注入可能会失败,因为int n
可能不会被解析为依赖项。参数上的@Value
注释可能会对您有所帮助。
答案 2 :(得分:0)
请参考此article:
没有RequiredAnnotationBeanPostProcessor
bean,Spring不会抱怨。
因此,...添加另一个RequiredAnnotationBeanPostProcessor
类型的bean(使用@Autowired
)使其投诉。
此外,@Required
注释将用于Bean setter。您正在尝试对基本类型进行@Required
检查。据我了解,所有Spring Bean(或J2EE Bean)都将成为对象。
对于基本类型,可以使用@Value
注入。