我怎么能@Autowire一个从外部jar创建的spring bean?

我有一个模块/ jar我已经创建并用作util 。 我在那里创建了一个服务:

@Service public class PermissionsService { ... } 

…这里位于一个包中: com.inin.architect.permissions ,在我的主应用程序中,我正在引用/加载这个jar(即设置为app的maven POM.xml文件中的依赖项)所以:

  com.inin.architect permissions 1.0-SNAPSHOT  

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

 @Autowired PermissionsService permissions 

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

 @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:没有类型的限定bean …”

那么,我怎样才能将lib从lib中带到我的应用程序中? 当然有办法。 你是否必须将库设置为一个完整的弹簧MVC应用程序,以便这可以工作? 即你是否必须在lib中设置@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之外使用。

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

  

这将使您能够从已定义的com.inin.architect.permissions中自动assemblybean。

好的 – 我有完全相同的问题 – 我想从外部jar自动装载mongo db存储库接口。

  • 我可以通过使用来自jar子中的每个bean自动assembly

    @SpringBootApplication(scanBasePackages = {“com.myrootpackage”})

  • 但是 – 自动assembly界面始终失败,“无法找到blablabla ……”

但是接口与我可以导入的bean在同一个包中。 事实certificate,搜索mongo db接口并不考虑@SpringBootApplication中的scanBasePackages!

它必须通过显式配置

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

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