gpt4 book ai didi

spring - @Required 注解如何与 JavaConfig 一起使用?

转载 作者:太空宇宙 更新时间:2023-11-04 11:54:35 26 4
gpt4 key购买 nike

我对 Spring 框架还很陌生,在理解 @Required 注释与 Java 配置的应用程序结合使用时遇到了问题。

这是一个示例。

配置文件

@Configuration
public class AppConfig {
@Bean
public Movie movieA() {
return new Movie();
}

@Bean
public MovieHolder holder() {
return new MovieHolder();
}
}

MovieHolder.java

public class MovieHolder {

private Movie movie;

public Movie getMovie() {
return movie;
}

@Required
public void setMovie(Movie movie) {
this.movie = movie;
}
}

上下文初始化

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MovieHolder holder = (MovieHolder) context.getBean("holder");
System.out.println("movie: " + holder.getMovie());

据我了解 @Required 注释的文档,应该会出现异常,因为电影不是直接设置的,也不是通过 Autowiring 设置的。相反,输出为 movie: null

我做错了什么?或者这不是 @Required 注释的正确用法?

最佳答案

在您正在实例化的 bean 中设置所需的属性是您自己的责任。 BeanPostProcessor处理用 @Configuration 注释的类中的 bean 定义的函数称为 ConfigurationClassPostProcessorBeanPostProcessor处理您的 @Required 注释默认为 RequiredAnnotationBeanPostProcessor ,当您在配置中使用 context:annotation-configcontext:component-scan 时,它会默认注册。如果您不使用这两个标签,您甚至可以注册自己的 RequiredAnnotationBeanPostProcessor作为一个bean

现在,RequiredAnnotationBeanPostProcessor 的默认实现有一个名为 boolean shouldSkip(..) 的方法,用于检查名为 SKIP_REQUIRED_CHECK_ATTRIBUTE 的 bool 属性。 RequiredAnnotationBeanPostProcessor 在后处理期间检查每个 bean 的该属性值。 。如果返回 false,则强制执行 @Required 约束,否则不执行。

现在,ConfigurationClassPostProcessor在从 @Configuration 类创建 bean 定义时,将此属性的值设置为 true(我猜是因为如果正在定义一个 bean,应该确保它具有所需的属性)。因此,对于此类 bean 不强制使用 @Required

顺便说一句,你可能会认为这是在哪里 SKIP_REQUIRED_CHECK_ATTRIBUTE属性来自以及在哪里设置:它是在 BeanDefinition 的实例上设置的Spring 在内部使用它们来创建 bean 和进行后处理。

如果您确实想强制执行 @Required 约束,则必须覆盖 RequiredAnnotationBeanPostProcessor ,覆盖 boolean shouldSkip(..) 方法并注册此类,而不是默认的 RequiredAnnotationBeanPostProcessor 。并作为 RequiredAnnotationBeanPostProcessor 的文档说:

A default RequiredAnnotationBeanPostProcessor will be registered by the "context:annotation-config" and "context:component-scan" XML tags. Remove or turn off the default annotation configuration there if you intend to specify a custom RequiredAnnotationBeanPostProcessor bean definition.

另一种方法是在 @Bean 注释上使用 initMethod 属性。它可以执行检查以查看确实设置了所需的属性。但是,由于这是基于代码的配置,因此您也可以自己调用该 init 方法。

另外,在我看来,费尽周折去使用自己的RequiredAnnotationBeanPostProcessor并没有多大意义。 ,如以下文档所述:

Please note that an 'init' method may still need to implemented (and may still be desirable), because all that this class does is enforce that a 'required' property has actually been configured with a value. It does not check anything else... In particular, it does not check that a configured value is not null.

总结一下: @Required 默认情况下不适用于 @Configuration 类。如果您需要确保所有属性都已设置,您也可以在 @Bean 方法中创建 bean 时自己完成(通过调用执行此类验证的某些 init 方法,或者只是自己提供所需的属性)。如果您确实需要使@Required注释起作用,则需要使用您自己的 RequiredAnnotationBeanPostProcessor 实现,将其注册为 spring 上下文中的 bean,并放弃 context:annotation-config 的好处。

关于spring - @Required 注解如何与 JavaConfig 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41480406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com