我们打算开发一个包含所有Spring应用程序应该拥有的Spring组件的库,比如连接到监视、管理和编排服务的Beans。
这个想法是,利用斯普林斯的"AutoConfiguration"-mechanism。
首先,我编写了一个类com.mycorp.project.basic.startup-notification.StartupNotificationPublisher.class
,uppon "ApplicationStartedEvent“通过我们最喜欢的Message发送一条消息(对于exmample来说,这个消息代理应该是一个日志文件),向世界问好。
此类的实例将通过配置类com.mycorp.project.basic.startup-notification.autoconfiguration.StartupNotificationAutoConfiguration.class
创建。
package com.mycorp.project.basic.startup-notification
// ... Imports
@RequiredArgsConstructor
public class StartupNotificationPublisher {
private final String topic;
private final Logger messagePublisher = LoggerFactory.getLogger(StartupNotificationPublisher.class);
@EventListener
public void onApplicationStartedEvent(ApplicationStartedEvent event) {
messagePublisher.info("{}: Hello, Attention, I am here!", topic);
}
}
package com.mycorp.project.basic.startup-notification.autoconfiguration
// ... Imports
@Configuration
public class StartupNotificationAutoConfiguration {
@ConditionalOnMissingBean
@Bean
StartupNotificationPublisher startupNotificationPublisher()
{
return new StartupNotificationPublisher("helloTopic");
}
}
最后,为了使自动配置工作,我在jar的META-INF
-Folder中放置了一个文件-Folder(是的,它在那里!),包含:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mycorp.project.basic.startup-notification.autoconfiguration.StartupNotificationAutoConfiguration
我假设,这将使spring发挥它的魔力,在我添加依赖项时找到该文件,运行配置并创建该bean来发布消息。
然而,事实并非如此。只有当我将包添加到我的@SpringBootApplication
的扫描路径时,我才会收到我的消息。
我错过了什么?是否有更具体的要求,如特殊的项目结构?我需要一个名为spring启动程序的库吗?
ProjectStructure:
rootDirectory
|-src
| |-main
| |-java
| | |-com/mycorp/project/basic/startup-notification
| | |-autoconfiguration
| | | |-StartupNotificationAutoConfiguration.java
| | |-StartupNotificationPublisher.java
| |-resources
| |-META-INF
| |-spring.factories
|-build.gradle
|-...etc...
由此产生的Jar结构:
.jar
|-META-INF
| |-spring.factories
|-com
|-mycorp
|-project
|-basic
|-startup-notification
|-autoconfiguration
| |-StartupNotificationAutoConfiguration.class
|-StartupNotificationPublisher.class
发布于 2020-06-18 12:01:10
如果配置正确,弹簧工厂与组件扫描无关。
我可以确认,您做的一切都是正确的,相同的配置多次适用于我的项目。因此,要跟踪发生了什么:
spring.factories
文件放置在:中。
abc/src/main/resources/META-INF/spring.factories
BOOT-INF/lib
-- jar应该在那里--打开jar并检查META-INF/spring.factories
文件夹在那里。如果这里有问题,请检查pom.xml
中的依赖项--应该将自动配置模块定义为spring引导应用程序的依赖项。确保配置确实加载(这意味着自动配置模块是recognized):)
以下列方式重写配置:
@Configuration
public class StartupNotificationAutoConfiguration {
public StartupNotificationAutoConfiguration() {
System.out.println("Loading the configuration StartupNotificationAutoConfiguration"); // or use logging framework
}
@ConditionalOnMissingBean
@Bean
StartupNotificationPublisher startupNotificationPublisher()
{
return new StartupNotificationPublisher("helloTopic");
}
}
如果您看到这条消息,那么自动配置模块就在那里,并在spring之前加载.
@ConditionalOnMissingBean
注释。如果bean是在您的应用程序中定义的,那么它将优先于在自动配置模块中定义的bean。这也可能是问题的根源。发布于 2020-06-18 10:33:06
@RequiredArgsConstructor
public class StartupNotificationPublisher {
private final String topic;
private final Logger messagePublisher = LoggerFactory.getLogger(StartupNotificationPublisher.class);
@PostConstruct
public void postConstruct() {
messagePublisher.info("publisher constructed");
}
@EventListener
public void onApplicationStartedEvent(ApplicationStartedEvent event) {
messagePublisher.info("{}: Hello, Attention, I am here!", topic);
}}
https://stackoverflow.com/questions/62447730
复制相似问题