首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >库与Spring AutoConfiguration: spring.factories和其他什么?

库与Spring AutoConfiguration: spring.factories和其他什么?
EN

Stack Overflow用户
提问于 2020-06-18 10:18:53
回答 2查看 2.8K关注 0票数 2

我们打算开发一个包含所有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创建。

代码语言:javascript
运行
复制
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(是的,它在那里!),包含:

代码语言:javascript
运行
复制
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.mycorp.project.basic.startup-notification.autoconfiguration.StartupNotificationAutoConfiguration

我假设,这将使spring发挥它的魔力,在我添加依赖项时找到该文件,运行配置并创建该bean来发布消息。

然而,事实并非如此。只有当我将包添加到我的@SpringBootApplication的扫描路径时,我才会收到我的消息。

我错过了什么?是否有更具体的要求,如特殊的项目结构?我需要一个名为spring启动程序的库吗?

ProjectStructure:

代码语言:javascript
运行
复制
rootDirectory
|-src
|  |-main
|    |-java
|    | |-com/mycorp/project/basic/startup-notification
|    |                            |-autoconfiguration
|    |                            | |-StartupNotificationAutoConfiguration.java
|    |                            |-StartupNotificationPublisher.java
|    |-resources
|      |-META-INF
|        |-spring.factories
|-build.gradle
|-...etc...

由此产生的Jar结构:

代码语言:javascript
运行
复制
.jar
|-META-INF
| |-spring.factories
|-com
  |-mycorp
    |-project
      |-basic
        |-startup-notification
          |-autoconfiguration
          | |-StartupNotificationAutoConfiguration.class
          |-StartupNotificationPublisher.class
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-18 12:01:10

如果配置正确,弹簧工厂与组件扫描无关。

我可以确认,您做的一切都是正确的,相同的配置多次适用于我的项目。因此,要跟踪发生了什么:

  1. 确保给定模块"abc",将spring.factories文件放置在:

中。

abc/src/main/resources/META-INF/spring.factories

  1. 确保库jar确实包含这个文件,并且它确实驻留在工件中(您的春季引导应用程序)。为此,使用WinRar (或类似的工具)打开应用程序,并使用nagivate到BOOT-INF/lib -- jar应该在那里--打开jar并检查META-INF/spring.factories文件夹在那里。如果这里有问题,请检查pom.xml中的依赖项--应该将自动配置模块定义为spring引导应用程序的依赖项。确保配置确实加载(这意味着自动配置模块是recognized):

)

以下列方式重写配置:

代码语言:javascript
运行
复制
@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之前加载.

  1. 尝试删除@ConditionalOnMissingBean注释。如果bean是在您的应用程序中定义的,那么它将优先于在自动配置模块中定义的bean。这也可能是问题的根源。
票数 1
EN

Stack Overflow用户

发布于 2020-06-18 10:33:06

代码语言:javascript
运行
复制
@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);
}}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62447730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档