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

时间:2015-04-10 21:57:55

标签: java spring maven spring-mvc

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

@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

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

@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?

5 个答案:

答案 0 :(得分:48)

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

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

这与XML配置的原理相同。

答案 1 :(得分:17)

请注意这一点,但你可以将你的依赖性与春天分开。在@Configuration班级中创建

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

这也可以注入它。并不是说你必须删除你的弹簧注释,只是一个选项,使它可以在春天之外使用。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

  • 我可以使用

    自动连接该罐子中的每个豆子

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

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

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

必须通过

进行显式配置
@EnableMongoRepositories(basePackages = {"com.myrootpackage"})

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

答案 4 :(得分:0)

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

如果是普通的@Component,@Service注解使用

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

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

@EntityScan("com.mypackge1.domain")

如果 JPA 存储库类

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

如果Redis存储库类使用

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

Mongo 等也一样