【问题标题】:Spring Static methods弹簧静态方法
【发布时间】:2018-12-09 12:23:36
【问题描述】:

我正在学习Spring,正在看的书有如下代码行

@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

为什么需要static关键字,在静态方法上声明@Bean注解是否正常,如果是,为什么?

【问题讨论】:

  • This question 可能会有所帮助。
  • 对于那个 specific 类型是必需的,因为“占位符”系统用于填充像 ${server.port} 这样的表达式。它用于引导整个配置,因此必须在一切开始之前可用。
  • 除了你正在阅读的书之外,还要考虑其他的事实来源,比如 spring 官方参考文档 - docs.spring.io/spring/docs/current/spring-framework-reference/…

标签: java spring static


【解决方案1】:

PropertySourcesPlaceholderConfigurer 对象是一个BeanFactoryPostProcessor,所以,根据Spring documentation

必须特别注意返回的 @Bean 方法 弹簧BeanFactoryPostProcessor (BFPP) 类型。因为 BFPP 对象 必须在容器生命周期的早期实例化,它们可以 干扰注释的处理,例如@Autowired@Value、 和@PostConstruct@Configuration 类中。为了避免这些 生命周期问题,将返回 BFPP 的 @Bean 方法标记为 static

通过将此方法标记为静态,可以在不引起调用的情况下调用它 其声明@Configuration 类的实例化,从而避免 上面提到的生命周期冲突。但是请注意静态@Bean 方法不会针对范围和 AOP 语义进行增强,因为 上文提到的。这适用于 BFPP 案例,因为它们不是 通常由其他 @Bean 方法引用。提醒一下,一个 将为任何非静态@Bean 方法发出警告级别的日志消息 具有可分配给 BeanFactoryPostProcessor 的返回类型。

【讨论】:

    猜你喜欢
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    相关资源
    最近更新 更多