为什么@Required 被Spring 忽略了?
Why is @Required ignored by Spring?
我读到 @Required 用于确保 属性 已设置。
但是当我尝试将它与 Spring 注释配置一起使用时,它不起作用。
下面你可以熟悉我的代码库。
@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 application context 创建SimpleClass Bean 并且不抱怨没有通过setter 注入?
更新:
当我尝试使用 XML 配置执行相同操作并添加时,我收到一个 "Exception in thread "main" org.springframework.beans.factory.BeanCreationException: 属性 'n' is required for bean 'simple'"
您需要将它与@Autowired(或@Value,如果您注入简单值)注释一起使用。
@Required
文档状态(重点是我的):
Marks a method (typically a JavaBean setter method) as being
'required': that is, the setter method must be configured to be
dependency-injected with a value.
使用 Spring 为了将方法配置为依赖注入,您必须指定它(@Autowired
是标准方式)。
但是在今天看来,在方法上同时指定 @Autowired
和 @Required
似乎很笨拙:
@Autowired
@Required
public void setN(int n) {
System.out.println("setter");
this.n = n;
}
相反,要将 setter 配置为依赖注入和必需,我建议仅使用默认情况下需要的 @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
注释可能会对您有所帮助。
指的是这个article:
没有 RequiredAnnotationBeanPostProcessor
bean,Spring 不会抱怨。
所以...添加另一个 RequiredAnnotationBeanPostProcessor
类型的 bean(使用 @Autowired
)使其抱怨。
此外,@Required
注释将用于 Bean setter。您正在尝试对原始类型进行 @Required
检查。据我了解,所有 Spring Beans(或 J2EE beans)都是对象。
对于原始类型,您可以使用 @Value
注入。
我读到 @Required 用于确保 属性 已设置。 但是当我尝试将它与 Spring 注释配置一起使用时,它不起作用。
下面你可以熟悉我的代码库。
@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 application context 创建SimpleClass Bean 并且不抱怨没有通过setter 注入?
更新: 当我尝试使用 XML 配置执行相同操作并添加时,我收到一个 "Exception in thread "main" org.springframework.beans.factory.BeanCreationException: 属性 'n' is required for bean 'simple'"
您需要将它与@Autowired(或@Value,如果您注入简单值)注释一起使用。
@Required
文档状态(重点是我的):
Marks a method (typically a JavaBean setter method) as being 'required': that is, the setter method must be configured to be dependency-injected with a value.
使用 Spring 为了将方法配置为依赖注入,您必须指定它(@Autowired
是标准方式)。
但是在今天看来,在方法上同时指定 @Autowired
和 @Required
似乎很笨拙:
@Autowired
@Required
public void setN(int n) {
System.out.println("setter");
this.n = n;
}
相反,要将 setter 配置为依赖注入和必需,我建议仅使用默认情况下需要的 @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
注释可能会对您有所帮助。
指的是这个article:
没有 RequiredAnnotationBeanPostProcessor
bean,Spring 不会抱怨。
所以...添加另一个 RequiredAnnotationBeanPostProcessor
类型的 bean(使用 @Autowired
)使其抱怨。
此外,@Required
注释将用于 Bean setter。您正在尝试对原始类型进行 @Required
检查。据我了解,所有 Spring Beans(或 J2EE beans)都是对象。
对于原始类型,您可以使用 @Value
注入。