我有一个静态初始化块,可以通过Spring访问一个类。如何确保在静态类之前加载Spring容器?
public class A {
}
public class B {
static {
ctx.getBean(A.class); // error if container is not ready
}
}
答案 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类是带有私有构造函数的静态类,您会怎么做?