【问题标题】:Invoke static method from spring config从spring config调用静态方法
【发布时间】:2015-02-02 11:10:15
【问题描述】:

是否可以在Spring配置文件中调用静态方法?

public MyClass {

   public static void staticMethod() {
       //do something
   }

}
<bean id="myBean" class="MyClass">
   <!-- invoke here -->
</bean>

【问题讨论】:

  • staticMethod 是做什么的?初始化 bean?
  • 为了让spring自动调用它,它必须属于某个spring bean。仅仅从配置中调用它是没有意义的。
  • 静态方法初始化myClass的实例
  • 我需要从静态方法返回一个值并将该值用作属性值,谁能帮忙
  • 使用@Value注解如stackoverflow.com/a/60556247/839733所示

标签: java xml spring static


【解决方案1】:
  1. 当静态方法创建 MyClass 的实例时,您可以这样做

配置

<bean id="myBean" class="MyClass" factory-method="staticMethod">
   <!-- invoke here -->
</bean>

代码

public static MyClass staticMethod() {
       //create and Configure a new Instance
}
  1. 如果您只想在 bean 实例化时调用该方法,spring 不能这样做。

配置

<bean id="myBean" class="MyClass" init-method="init">
   <!-- invoke here -->
</bean>

代码

public static void staticMethod() {
       //create and Configure a new Instance
}

public void init() {
     staticMethod();
}

【讨论】:

  • 不知道为什么这个答案被否决了......它比 IMO 投票的答案更准确地回答了这个问题。
  • 我需要从静态方法返回一个值并将该值用作属性值,谁能帮忙
  • 如果静态方法需要参数怎么办?你是怎么通过的?
  • 方法 1 不适用于这种方式的参数。使用方法 2,参数可以是 MyClass 的实例属性,并使用 int init() 作为静态方法的参数。更多示例在这里javatpoint.com/dependency-injection-with-factory-method。从示例中键入 3 可能会有所帮助。
【解决方案2】:

试试这个

<bean id="b1" class="org.springframework.beans.factory.config.MethodInvokingBean">
    <property name="staticMethod" value="MyClass.staticMethod" />
</bean>

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/MethodInvokingBean.html

【讨论】:

  • MethodInvokingFactoryBean 还假设该方法有一个返回值。
  • 有没有办法返回静态值?
【解决方案3】:

试试这样的:

<!-- call static method -->
<bean id="test" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass" value="MyClass" />
    <property name="targetMethod" value="staticMethod" />
    <property name="arguments">
        <list>
            <value>anArgument</value>
        </list>
    </property>
</bean>

删除您可能不需要的参数。

取自https://gist.github.com/bulain/1139874

我需要调用一个静态方法。上面的代码运行良好。

这也可能有用:How to make spring inject value into a static field

【讨论】:

    【解决方案4】:

    如果您使用注解进行 spring 配置,您可以将以下方法添加到您的 @Configuration 类中:

    @Bean
    public MethodInvokingFactoryBean methodInvokingFactoryBean() {
        MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean();
        methodInvokingFactoryBean.setStaticMethod("MyClass.staticMethod");
    
        return methodInvokingFactoryBean;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多