我怎么能@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接口。 所以我理解了这个问题并找到了解决方案。 但我仍然有点不高兴,因为我需要两次配置相同的查找路径。 我老老实实地觉得这很愚蠢。