【问题标题】:how to load spring bean from another class如何从另一个类加载spring bean
【发布时间】: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 使用来自构造函数的参数。
  • 让我写一个答案,这样我们就可以清楚地看到发生了什么。

标签: spring dependency-injection


【解决方案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 命中的数据。
  • 可以的。你可以在这里使用某种惰性模式。我将编辑答案以反映这一点。
  • 谢谢。我认为这可能会有所帮助。我会试试这个。
  • 我正在编辑你的代码,请告诉我它是否可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 2020-08-15
  • 2018-02-17
相关资源
最近更新 更多