Spring Boot Sping Boot :库项目中的自动连接bean

fae0ux8s  于 2023-05-06  发布在  Spring
关注(0)|答案(4)|浏览(158)

我正在努力从我的自定义库中自动连接bean,用gradle导入。读阅读几个类似的题目后,我仍然找不到解决办法。
我有一个Sping Boot 项目,它依赖于另一个项目(我的自定义库,包含组件,存储库等...)。这个库是一个Spring不可运行的jar,主要由域实体和存储库组成。它没有可运行的Application.class和任何属性...
当我启动应用程序时,我可以看到My 'CustomUserService' bean(来自库)正在尝试初始化,但其中自动连接的bean未能加载(接口UserRepository)...
错误:
com.myProject.customLibrary.configuration.CustomUserDetailsService中构造函数的参数0需要类型为“com.myProject.customLibrary.configuration.UserRepository”的Bean,但找不到该Bean。
我甚至尝试设置'Order',显式加载它(使用scanBasePackageClasses),扫描包和标记类,添加额外的EnableJPARepository注解,但没有任何效果......
代码示例(为简单起见,更改了包名称)

package runnableProject.application;

import runnableProject.application.configuration.ServerConfigurationReference.class
import com.myProject.customLibrary.SharedReference.class

//@SpringBootApplication(scanBasePackages = {"com.myProject.customLibrary", "runnableProject.configuration"}) 
//@EnableJpaRepositories("com.myProject.customLibrary")  

@SpringBootApplication(scanBasePackageClasses = {SharedReference.class, ServerConfigurationReference.class})   
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

}

来自库的类:

package com.myProject.customLibrary.configuration;

import com.myProject.customLibrary.configuration.UserRepository.class;

@Service
public class CustomUserDetailsService implements UserDetailsService {
    private UserRepository userRepository;    

    @Autowired
    public CustomUserDetailsService(UserRepository userRepository) {
        this.userRepository = userRepository;       
    }
...

package myProject.customLibrary.configuration;

@Repository
public interface UserRepository extends CustomRepository<User> {
    User findByLoginAndStatus(String var1, Status var2);

    ...
}
euoag5mw

euoag5mw1#

刚找到解决办法。我没有定义要从单独的库中扫描的基本包,而是在这个库中创建了配置类,并将其导入到我的主MyApplication.class中:

package runnableProject.application;    

import com.myProject.customLibrary.configuration.SharedConfigurationReference.class

@SpringBootApplication
@Import(SharedConfigurationReference.class)
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

}
package com.myProject.customLibrary.configuration;

@Configuration
@ComponentScan("com.myProject.customLibrary.configuration")
@EnableJpaRepositories("com.myProject.customLibrary.configuration.repository")
@EntityScan("com.myProject.customLibrary.configuration.domain")
public class SharedConfigurationReference {}
smdncfj3

smdncfj32#

您可以在库的“resources”文件夹中创建一个名为“META-INF”的文件夹,并添加一个名为“spring.factories”的文件,其内容为org.springframework.boot.autoconfigure.EnableAutoConfiguration=<fully_qualified_name_of_configuration_file>。这将自动配置您的库。

brccelvz

brccelvz3#

公认的答案太繁琐了。您需要做的是在库jar中实现您自己的自定义自动配置,以便在主应用程序的类路径扫描中获得它。更多详情here

vmpqdwk3

vmpqdwk34#

这里有一个针对Sping Boot 3更新的答案,并归结为在另一个项目中自动装配库bean的要点“简单的方法”,其中库声明它们,其他项目不必知道它必须导入或指定的东西才能使用它们(一旦库首先是依赖项)。
首先,确保您的库包含resources文件夹中的.imports文件。这意味着,例如,如果你使用Maven,那么你的pom文件的<build>部分的<resources>将包含这样的资源:

<resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
    <includes>
        …
        <include>**/*.imports</include>
    </includes>
</resource>

这一点很重要,因为Spring不再支持.factories文件(你可能已经使用过include了),而是应该使用src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,作为它的内容,只有你的自动配置类(如果你有多个自动配置类,每行一个):

com.your.library.AutoConfigure

(If你的资源文件夹不是在src/main/resources然后替换为路径到你的资源文件夹的地方,它在这个答案中提到.)
从这里开始,* 两个注解在自动配置类上显得必不可少 *。一个是@AutoConfiguration,它是新的自动配置导入系统的一部分。(这将替换imports文件中指定的autoconfiguration类上的@Configuration。根据这些文档,引入的其他配置类应该继续使用@Configuration。)
第二个,@ComponentScan,将告诉它去从所有那些Spring类(@Component@Service@Controller@Repository@Bean)中制作可自动连接的bean,这些类将在@SpringBootApplication下自动成为bean。这个注解可以进一步定制,但是如果你把裸注解放在你的库的顶级包中的一个类上,它 * 应该 * 只找到那个包中的所有bean(即整个图书馆)。

package com.your.library;

import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

@AutoConfiguration
@ComponentScan
public class AutoConfigure {
    // intentionally left empty
}

恭喜!有了这三个文件(好的,项目文件和其他两个文件中的设置),您的库的bean现在应该能够在使用该库的服务中成为@Autowired,而不需要服务将其视为与其自己的本地类有任何不同。
您可能会发现您的autoconfigure类上的其他注解是需要的或有帮助的-例如,专门配置Repositories;或者如果你在com.your.library.configuration包中有AutoConfigure类,那么它可以在@ComponentScan("com.your.library")中指定基本包来获取configuration包之外的bean。这个答案并不打算详尽地涵盖不同的Spring注解所做的事情以及可能与问题的代码示例相关的所有注解;相反,它侧重于问题所寻找的“缺失部分”:如何在依赖于库另一个项目中自动连接来自该库的那些bean。(如果你在Google上搜索如何在Sping Boot 中自动连接一个库bean/组件,而不是任何更通用或基本的版本,就会出现这个问题。
从我的测试来看,这些似乎是让@Autowired工作的最低限度。

相关问题