繁体   English   中英

我如何@Autowire 一个从外部罐子创建的弹簧豆?

[英]How can I @Autowire a spring bean that was created from an external jar?

我有一个我已经创建并用作 util library的模块/jar。 我在那里创建了一个服务,如下所示:

@Service
public class PermissionsService { ... }

...它驻留在此处的包中: com.inin.architect.permissions和在我的主应用程序中,我正在引用/加载这个 jar(即设置为应用程序的 maven POM.xml 文件中的依赖项),例如所以:

<dependency>
        <groupId>com.inin.architect</groupId>
        <artifactId>permissions</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

在应用程序中,我想使用该服务,例如:

@Autowired
PermissionsService permissions

在应用程序的 spring 设置中,我有这个:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.inin.generator", "com.inin.architect.permissions" })
public class WebConfig extends WebMvcConfigurerAdapter implements ServletContextAware { }

但是,当我在 tomcat 下运行我的应用程序时,它抱怨没有PermissionsService的 bean:“org.springframework.beans.factory.NoSuchBeanDefinitionException: Noqualifying bean of type ...”

那么,如何将 lib 中的 bean 带入我的应用程序? 肯定有办法。 您是否必须将库设置为完整的 Spring MVC 应用程序才能正常工作? 即你必须在库中设置@Configuration 和@ComponentScan 吗?

您必须至少扫描包含要注入的类的包。 例如,使用 Spring 4 注释:

@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}

XML 配置的原理相同。

只是对此的说明,但您可以将您的依赖与 spring 分离。 在你的@Configuration类中创建

@Bean public PermissionsService  permissionsService(){
   return new PermissionsService()
}

这也将允许它被注入。 并不是说您必须删除 spring 注释,只是一个选项,使其可能在 spring 之外可用。

好的-我遇到了完全相同的问题-我想从外部 jar 自动装配 mongo db 存储库接口。

  • 我可以自动装配那个罐子里的每个豆子

    @SpringBootApplication(scanBasePackages = {"com.myrootpackage"})

  • 但是 - 自动装配接口总是失败,并显示“找不到 blablabla...”

但是接口与我可以导入的 bean 位于同一个包中。 事实证明,搜索 mongo db 接口并没有考虑来自@SpringBootApplication 的 scanBasePackages!

它必须通过显式配置

@EnableMongoRepositories(basePackages = {"com.myrootpackage"})

或者您可以将主类“向上”移动,以便默认搜索也适用于 mongo 接口。 所以我理解了这个问题并找到了解决方案。 但是我还是有点不高兴,因为我需要配置相同的查找路径两次。 老实说,我觉得这很愚蠢。

您可以在主应用程序中按以下方式为com.inin.architect.permissions导入 application-context.xml。

<import resource="classpath:/permissionApplicationContext.xml" />

这将使您能够从您定义的com.inin.architect.permissions自动装配 bean。

我在从其他项目依赖项扫描其他类时遇到了同样的问题,扫描解决方案取决于您需要扫描的类的类型,如下所示:

如果它们是普通的@Component,@Service 注释使用

@ComponentScan({"com.mypackge1","com.mypackage2"})

如果类的类型是基于实体的域对象,请使用

@EntityScan("com.mypackge1.domain")

如果 JPA 存储库类

@EnableJpaRepositories(basePackages = {"com.mypackage.repository"})

如果 Redis 存储库类使用

@EnableRedisRepositories(basePackages = {"com.mypackage.repository"})

Mongo 等也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM