静态类需要使用Spring托管类

时间:2010-11-13 19:55:07

标签: java spring

我有一个静态初始化块,可以通过Spring访问一个类。如何确保在静态类之前加载Spring容器?

public class A {
}

public class B {
     static {
          ctx.getBean(A.class); // error if container is not ready
     }
}

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

实际上,如果B也由Spring管理,而不是提供静态方法将被注入到需要它的类中,那将会容易得多。

现在,如果你还需要继续你的方法: 您可以使用静态初始化方法而不是静态块,比如说

class B{
   private static A beanA;
   public static void setBeanA(A bean){
      beanA = bean;
   }
}

现在您需要做的就是调用以确保在创建上下文期间调用此set。最简单的方法是创建另一个类,并将其声明为bean,或者您可以使该set方法返回一些东西并使用它的工厂方法,或者将A自动装配到它并使用一些后期处理 - 无论您喜欢什么。以下是使用另一个bean的示例:

public class C{
   public C(A bean){
      B.setBeanA(bean);
   }
}

比弹簧配置你可以:

<bean name="A" class="A.class"/>
<bean class="C.class">
   <constructor-arg ref="A"/>
</bean>

注意,相反传递bean,您可以使用相同的方法传递整个applicationContext。

一般来说,这是一种非常不稳定的方法,它假设您的Spring上下文将在应用程序中发生任何事情之前启动。

答案 2 :(得分:0)

如果B类是带有私有构造函数的静态类,您会怎么做?