警告@Configuration类上的非静态ConfigurationClassPostProcessor声明

时间:2016-06-03 12:22:57

标签: spring spring-mvc

我使用Spring 4.2.6.RELEASE。在我的应用程序初始化期间,我收到了这样的警告:

  

[WARN]   org.springframework.context.annotation.ConfigurationClassPostProcessor   enhanceConfigurationClasses:无法增强@Configuration bean   定义   ' org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerEndpointsConfiguration $ TokenKeyEndpointRegistrar'   因为它的单例实例创建得太早了。典型的   cause是一个非静态的@Bean方法   BeanDefinitionRegistryPostProcessor返回类型:考虑声明   诸如静态'等

的方法

我找到了一个类似问题的jira:

https://jira.spring.io/browse/SPR-14234

但它被标记为已关闭,应在4.2.6.RELEASE中修复。

2 个答案:

答案 0 :(得分:0)

您的问题与spring之前的bean工厂后处理器初始化有关。

参考文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-extension-factory-postprocessors

BeanFactoryPostProcessor接口用于在容器中初始化bean之前进行不同的增强。

与上述问题相关的最佳示例之一是PropertySourcesPlaceholderConfigurer。这是bean工厂后期处理器,用于从单独的文件进行属性外部化。借助于@Value注释和语法“ $ {property.name}”来解析Bean中的属性。
参考:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-placeholderconfigurer

因此,PropertySourcesPlaceholderConfigurer是bean工厂的后处理器。在弹簧容器中创建任何bean之前,应先对其进行初始化,否则它将无法执行其工作。它应该使用属性文件中的正确值更改Bean元数据。这就是为什么应该在配置类中将其声明为静态的原因:

@Configuration
public class AppConfig {

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

在Java中,静态字段和方法在类加载器加载特定类的同时加载。因此,可以使用bean工厂后处理器声明,而无需创建特定holder类的bean。 Spring从静态方法中加载bean工厂后处理器,然后创建配置类的bean。

Spring文档在本段中强调了这一点:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-value-annotations

当前行为与票证中Juergen Hoeller所述的相同。 Spring将在日志中打印一条警告,说明有关声明的没有静态修饰符的bean工厂后处理器。

答案 1 :(得分:-1)

也许这有助于(或不)......

@RunWith(SpringRunner.class)
@DataJpaTest
public class TestMyImpl {
...

我正在使用4.3.4.RELEASE并对上面的代码块发出以下警告:

  

2016-12-30 07:33:04.296 WARN 2000 --- [main] o.s.c.a.ConfigurationClassPostProcessor:无法增强@Configuration bean定义'embeddedDataSourceBeanFactoryPostProcessor',因为它的单例实例创建得太早。典型的原因是具有BeanDefinitionRegistryPostProcessor返回类型的非静态@Bean方法:考虑将这些方法声明为'static'。

由于我使用@DataJpaTest通过替换它找到的任何h2来自动配置测试数据库(在这种情况下为dataSource),因此预期和需要行为。该警告是对@DataJpaTest的最重要行为的确认。

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace=Replace.NONE)
public class TestMyImpl {
...

通过禁用自动配置(如上所示),警告消失。现在可以照常配置datasource