如何在Spring中自动连接依赖项/外部jar中的组件?

时间:2019-06-14 00:00:34

标签: java spring maven spring-boot

我有一个Spring Boot项目,我无法从外部jar 中获得要自动接线的组件。当我尝试这样做时,我得到org.springframework.beans.factory.NoSuchBeanDefinitionException的提示,说找不到具有该名称的bean。

我尝试了类似问题中的一些解决方案,例如:

How to autowire @service from external Jar in Spring

Spring Boot @autowired does not work, classes in different package

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

..但是仍然无法管理它。

这是我要完成的工作的一个示例:

enter image description here

这是Spring Boot项目 spring-project-example

中的启动类
package com.springdi.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;

import com.dependency.example.DependencyBasePackageClass;
import com.dependency.example.somepackage.SomeBean;

@SpringBootApplication
@ComponentScan(basePackages = {"com.springdi.example"}, basePackageClasses = DependencyBasePackageClass.class)
public class SpringProjectExampleApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringProjectExampleApplication.class, args);

        String beanName = SomeBean.class.getName();
        System.out.printf("%s can be autowired: %s\n", beanName, String.valueOf(context.containsBean(beanName)).toUpperCase());
    }
}

这只是一个简单的Spring Boot项目,用于检查是否可以自动连接依赖项jar中存在的组件。

这是 jar (dependency-example-1.0.0.jar)中的组件

package com.dependency.example.somepackage;

import org.springframework.stereotype.Component;

@Component
public class SomeBean {

    public void someMethod() {
        System.out.println("Some process...");
    }
}

这是同一 jar

基本包类
package com.dependency.example;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * Just a class to serve as the root for component
 * scanning in "com.dependency.example" and its sub-packages
 */
@Configuration
@ComponentScan
public class DependencyBasePackageClass {

}

我已经在SpringProjectExampleApplication中尝试过@Import(DependencyBasePackageClass.class),并在@ComponentScanbasePackages中尝试过basePackageClasses,但是没有成功。

我也尝试使用@SpringBootApplication(scanBasePackageClasses = {SpringProjectExampleApplication.class, DependencyBasePackageClass.class})

和非安全类型@SpringBootApplication(scanBasePackages = {"com.springdi.example", "com.dependency.example"})

@Configuration @ComponentScan({"com.dependency.example"})也失败,context.containsBean("com.dependency.example.somepackage.SomeBean")仍返回 false

此jar作为依赖项包含在classpath和pom.xml中

<dependencies>
    <!-- other dependencies -->

    <dependency>
        <groupId>com.rbaggio</groupId>
        <artifactId>dependency-example</artifactId>
        <version>1.0.0</version>
        <scope>system</scope>
        <systemPath>${basedir}/lib/dependency-example-1.0.0.jar</systemPath>
    </dependency>
</dependencies>

可能是罐子的位置,包含罐子的方式还是需要一些额外的配置?

我将不胜感激!预先感谢。

1 个答案:

答案 0 :(得分:2)

了解一些基本知识,您已经混淆了一些软件包。

@SpringBootApplication将扫描该注释所在的类下面的包中的所有类。此注释是@EnableAutoConfiguration@Configuration@ComponentScan的别名,表示@ComponentScan(basePackages = {"com.springdi.example"}, basePackageClasses = DependencyBasePackageClass.class) 不需要

com.springdi.example     // class with @SpringBootApplication annotation
         |
         |
         |
com.springdi.example.*    // Will find all @Service, @Component, @Configuration
                          // in subpackages below the @SpringBootApplication 
                          // annotation

您可以在SpringBootApplication

上了解有关注释的更多信息

由于其他带有注释的类与@SpringBootApplication处于相同的包结构中,因此需要定义所有要扫描的注释位置。

@SpringBootApplication(scanBasePackages = {"com.springdi.example", "com.dependency.example"})

可能会包括您要扫描的所有软件包。