如何从另一个类加载spring bean

Posted

技术标签:

【中文标题】如何从另一个类加载spring bean【英文标题】:how to load spring bean from another class 【发布时间】:2016-07-30 12:40:00 【问题描述】:

我已经使用 context-param 在 web.xml 中加载了“myspring.xml”

在“myspring.xml”中,我编写了将参数作为构造函数参数传递给的bean

<bean id="abc" class="com.Hello">
     <constructor-arg ref="dataSource"/>
     <constructor-arg value= “dummy data”/>
</bean>

在 Hello bean 中,我已将构造函数初始化为,

  public class Hello
     public Hello(datasource,dummydata)
     

     public void methodFromHelloBean()
       // use here dummydata from constructor
     
 

这里,'Hello' bean 在服务器启动时被初始化,正如我在 web.xml 中定义的那样,它工作正常。

我的问题是-

我正在处理现有的应用程序。 我想在我的另一个类中调用 methodFromHelloBean() 说 MyService 类。 如何调用 MyService 类中的方法。

我知道的一种方法是使用 applicationContext。 但在我现有的应用程序中,我没有看到任何使用应用程序上下文路径加载的 bean。

还有什么其他方法,我如何从“MyService”类初始化“Hello”bean。 初始化时是否需要将参数传递给构造函数以及如何。

提前致谢。

【问题讨论】:

在MyService中注入Hello bean怎么样? MyService 是否定义为 Spring bean? 是的,在现有的应用程序 bean 中已自动连接。但是如果我想使用 auto wire , public class MyService @AutoWired 你好。现在在这里我如何调用 methodFromHelloBean 并传递构造函数参数? 你不能。构造函数参数必须在 Spring 上下文中的设计时给出。如果你必须给你的Hello bean参数,它必须通过你要调用的方法。 谢谢 Arthur.So 如果我想在 MyService 类中调用 methodFromHelloBean ,我该如何调用呢?通过将对象创建为 public class MyService @Autowired Hello hello; public void testMethod() hello.methodFromHelloBean() 会起作用吗?我很怀疑,因为 Hello 有参数化的构造函数,它接受数据源和另一个参数。并且 methodFromHelloBean 使用来自构造函数的参数。 让我写一个答案,这样我们就可以清楚地看到发生了什么。 【参考方案1】:

假设我们有 MyService 一个类,它的 bean 实例使用来自 abc 的某个方法 methodFromHelloBean,即 Hello bean。

public class Hello 

    private boolean cacheInitialized;

    public void methodFromHelloBean(Object param) 
        if (!cacheInitialized) 
             initializeCache(param);
             cacheInitialized = true;
        
        // do whatever you please with cache.
    

    private void initializeCache(Object param) 
        // TODO
    



public class MyService 

     @Autowired
     private Hello abc;

     public void someMethod() 
          // determine which parameters to pass to abc
          Object param = ...
          abc.methodFromHelloBean(param);
     


【讨论】:

谢谢亚瑟。但是仍然存在一个疑问,因为 Hello 具有从那里可用的“myspring.xml”获取参数“datasource”(DB 事物)的构造函数。如何从 MyService 类传递该数据源参数。 实际上我想通过在加载 Hello 类的服务器启动时加载“myspring.xml”来实现类似缓存的功能。 Hello 类使用 datasource 和 methodFromHelloBean 方法中的其他参数填充数据。我想在我的应用程序中需要时调用填充数据方法,即“methodFromHelloBean”,比如 MyService 类。所以不需要传递数据源和其他参数,我可以使用已经填充的方法来处理没有 DB 命中的数据。 可以的。你可以在这里使用某种惰性模式。我将编辑答案以反映这一点。 谢谢。我认为这可能会有所帮助。我会试试这个。 我正在编辑你的代码,请告诉我它是否可以工作。

以上是关于如何从另一个类加载spring bean的主要内容,如果未能解决你的问题,请参考以下文章

spring加载问题?

Spring - 从类路径资源 [Beans.xml]-NoClassDefFoundError 加载 XML bean 定义

如何从另一个类加载 xib

如何配置 Spring bean 容器来加载 Java 属性文件?

java jsf 如何去重新加载bean

spring能动态给一个类增加一个方法或属性吗