我使用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中修复。
答案 0 :(得分:0)
您的问题与spring之前的bean工厂后处理器初始化有关。
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
。