在Spring Boot应用程序中扫描不同Maven模块 JAR的组件

在Spring Boot应用程序中扫描不同Maven模块 JAR的组件,第1张

在Spring Boot应用程序中扫描不同Maven模块/ JAR的组件

您应该想知道的第一件事是:为什么要声明(其中

@ComponentScan
之一)的目的之一
@SpringBootApplication
是启用组件扫描?
从Spring Boot文档中:

@SpringBootApplication
注解相当于使用
@Configuration
@EnableAutoConfiguration
@ComponentScan
与他们的默认属性

请注意,在Spring
Boot应用程序的类上时,您声明

@ComponentScan
将值指定为
basePackages
,它将覆盖
basePackages
默认使用的值,
@SpringBootApplication
因为默认值是该类所在的当前包。因此,要同时具有Spring
Boot Application类的软件包和缺少的其他软件包作为基本软件包,必须显式设置它们。

除了

basePackages
是递归的。因此,要对位于
"org.example"
"org.example.model"
包中的类都启用扫描,只需指定它的子包
"org.example"
就足够
"org.example.model"
了。

尝试:

@SpringBootApplication(scanbasePackages={"org.example"})

或者:

@SpringBootApplication@ComponentScan("org.example")

在Spring Boot应用程序中指定@ EnableJpaRepositories / @ ComponentScan /

scanbasePackages时?

在设计Spring Boot应用程序布局时,有两种情况:

1)(首选)使用软件包布局的情况,该布局为Spring Boot的自动配置提供零配置。

总结:如果你用的Spring
bean注解的类定型:

@Component
@Repositories
@Repositories
,…都位于同一个包或者Spring引导应用程序类的子包,仅声明
@SpringBootApplication
是你所需要的。

2)在这种情况下(为避免),您不使用将Spring Boot的自动配置提供零配置的程序包布局。

通常,这意味着您要扫描的候选类不在用注释的类的包(或子包)中

@SpringBootApplication

在这种情况下,您可以添加
scanbasePackages
属性或添加
@ComponentScan
以指定要扫描的软件包。
但是,此外,如果您的存储库不在您的类的包或子包中,并带有注释
@SpringBootApplication
,则必须声明其他内容,例如:
@EnableJpaRepositories(="packageWhereMyRepoAreLocated")

这是有关此部分的文档(重点是我的):

80.3使用Spring数据仓库

Spring Data可以创建各种风格的@Repository接口的实现。
只要那些@Repositories包含在@EnableAutoConfiguration类的同一包(或子包)中,Spring
Boot就会为您处理所有这些 *** 作。

对于许多应用程序,您需要做的就是在类路径上放置正确的Spring Data依赖项(对于JPA,有一个spring-boot-starter-data-
jpa,对于Mongodb,有一个spring-boot-starter-data-
mongodb),并创建一些存储库接口来处理您的@Entity对象。JPA示例和Mongodb示例中包含示例。

Spring Boot会根据发现的@EnableAutoConfiguration尝试猜测@Repository定义的位置。
要获得更多控制权,请使用@EnableJpaRepositories批注(来自Spring Data JPA)。


例子

1)(首选)使用软件包布局的情况,该布局为Spring Boot的自动配置提供零配置。

org.example
包中声明了Spring
Boot应用程序,并且在Bean的同一包或子包中声明了所有bean类(包括存储库)
org.example
之后,对于Spring
Boot应用程序,以下声明就足够了:

package org.example;@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        ApplicationContext ctx = SpringApplication.run(Application.class, args);    }}

存储库可以位于

org.example.repository
软件包中,例如:

package org.example.repository;@Repositorypublic interface FooRepository extends  JpaRepository<Foo, Long>,  { }

package org.example.repository;@Repositorypublic interface BarRepository extends  JpaRepository<Bar, Long>,  { }

控制器可以放在

org.example.controller
包装中:

package org.example.controller;@RestController@RequestMapping("/api/foos")public class FooController  {...}

所以…

2)在这种情况下(为避免),您不使用将Spring Boot的自动配置提供零配置的程序包布局。

org.example.application
包中声明了Spring
Boot应用程序并且没有在同一个包或子包中
org.example.application
声明所有Bean类(包括存储库)的情况下,Spring
Boot应用程序将需要以下声明:

package org.example.application;@SpringBootApplication(scanbasePackages= {"org.example", "org.thirdparty.repository"})@EnableJpaRepositories("org.thirdparty.repository")public class Application {    public static void main(String[] args) {        ApplicationContext ctx = SpringApplication.run(Application.class, args);    }}

Bean类可能如下。

可能来自外部JAR的存储库可以位于

org.thirdparty.repository
包中,例如:

package org.thirdparty.repository;@Repositorypublic interface FooRepository extends  JpaRepository<Foo, Long>,  { }

package org.thirdparty.repository;@Repositorypublic interface BarRepository extends  JpaRepository<Bar, Long>,  { }

控制器可以放在

org.example.controller
包装中:

package org.example.controller@RestController@RequestMapping("/api/foos")public class FooController  {...}

所以…

结论 :强烈建议在名称空间的基本包中定义Spring Boot应用程序,以使Spring Boot配置尽可能简单。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5621697.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存