【问题标题】:Java Spring bean creation and access from external jarJava Spring bean 创建和从外部 jar 访问
【发布时间】:2022-01-14 13:10:34
【问题描述】:

我的实体 bean 的 spring jar 创建为 export--java--JARfile,其中我的 bean 定义如下:

package com.my.beans;
@Component("expBean")
public class ExpBean {
}

我在这个 jar 中也有配置

package com.my;

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

@Configuration
public class pBeanConfig {

    @Bean
    public ExpBean getExpBean() {
        return new ExpBean();
    }
}

我有客户端 spring 应用程序,我在上面添加只有 bean 作为外部依赖项的 jar,并在 spring 应用程序开始在客户端 spring 应用程序的主代码中使用以下代码时尝试获取我的 bean。

package com.my;

import java.util.Arrays;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication()
@ComponentScan("com.my")
public class Application {

    public static void main (String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);

        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        for (String beanName : beanNames) {         
            System.out.println(beanName);
        }
          WMyBean bean = (WMyBean) ctx.getBean("expBean");
          bean.doSomething();
}
}

但是当检查打印的 bean 定义列表时,我没有从外部 jar 中看到我的 bean,并且我得到以下错误。

"Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'expBean' available"

我尝试了很多选项,但不确定缺少什么。 选项 1

@ComponentScan("com.my")
@SpringBootApplication
public class Application {

选项 2

@ComponentScan({"com.my"})
@SpringBootApplication
public class Application {

在我错过的步骤上需要有价值的输入。

问题 1:我是否必须在客户端项目中进行配置更改才能访问我的依赖 jar 实体?

问题2:是否可以动态,在客户端项目配置中将所有没有配置的实体加载为@bean?

问题 3:每次我用更多实体更改我的依赖 jar 文件时,我是否需要构建客户端 jar?

谢谢

【问题讨论】:

  • 如果 bean 在应用程序的子包中,则不需要 ComponentScangetExpBean() 将创建一个名为 getExpBean 的 bean,而 Component("expBean") 将创建一个名为 expBean 的 bean,对于单例实例来说,两者都是错误的,因为一个会覆盖另一个。
  • 1.试试ctx.getBean("getExpBean") (?) 2. 或者:@Impot(pBeanConfig.class) (and no (additional) @ComponentScan ) 3. 或者试试@ComponentScan("com.my.beans") (留下名字expBean ...)
  • 你能添加你的每个 jar 的 maven pom.xml 吗?

标签: java spring spring-boot


【解决方案1】:

首先我假设构建工具是 Gradle,但是为了实验,你可以像这样将 jar 导入为本地文件:

dependencies {
implementation files('libs/something_local.jar')}

然后,假设您使用 Eclipse,您可以右键单击项目文件夹并执行“Gradle refresh”

在您的配置类中,您可以在 bean 中为整个类自动装配,或者选择在创建类的实例时通过在类构造函数中声明它来创建它:

    import org.springframework.beans.factory.annotation.Autowired;

//I also have config in this jar

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


@Configuration
public class pBeanConfig {

    //Autowire in the bean for the whole class.
    @Autowired
    ExpBean expBean;
    
    public pBeanConfig() {
    
    //Or, you may want to have a bean instance whenever the pBeanConfig class is instantiated.
    ExBean exBean;
   }
}

我对这个答案做了一些假设,就像它是一个 Gradle 项目一样,但是您可以通过修改 POM 文件以包含该文件来为 Maven 设置类似的依赖项。

除了构建工具,在 Eclipse 中,您可以通过右键单击项目和构建路径 => 配置构建路径 => 添加外部 jar 文件来简单地添加 jar 文件。

更新: 这张图片描述了我如何通过 Eclipse 在单独的 jar 文件中设置 bean。这些步骤应该表明该项目可以访问该 bean,即使它位于 jar 中而不是项目本身中。

【讨论】:

  • 感谢您的回复,我已经将我的 bean jar 添加为依赖项,并尝试使用上面的示例在我的客户端中查看,如果我在上下文中加载了我的依赖 bean。但是我收到了上面提到的相同错误,并且没有看到 main 中打印的 beandefination 中的豆。
  • 我在 Eclipse 中设置了与您编写的相同的项目,当我输出名称时,我可以看到 bean 出现在列表中。如果我通过 Git 给您一个指向我的项目的链接以便您进行设置,会有帮助吗?
  • 是的,这真的可以帮助我理解我错过了什么。
  • 我正在使用 Maven
  • 这是一个 Gradle 项目,build.gradle 中的依赖项显示了将通过 Maven POM.xml 拉入的内容。这是春天 2.6.2 。只需作为 gradle 项目导入并运行。 github.com/MikeT2424/Spring-scrap.git
猜你喜欢
  • 2015-06-16
  • 2023-03-23
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2011-01-15
  • 1970-01-01
  • 2014-07-25
相关资源
最近更新 更多