2010-11-13 2 views
1

У меня есть статический блок инициализации, который обращается к классу через Spring. Как я могу обеспечить загрузку Spring Container перед статическим классом?Статический класс должен использовать управляемый пружиной класс

public class A { 
} 

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

Это ужасное требование. Только не делай этого. –

+1

Что такое ctx? (Я имею в виду, откуда вы его взяли?) – Roman

ответ

2

Действительно, это будет намного проще, если B будет также управляется Spring и вместо того, чтобы обеспечить статические методы будут вводиться в классы, где это необходимо.

Теперь, если вы все равно должны продолжать свой подход: Вы можете использовать статический метод инициализации вместо статического блока, скажем

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

Теперь все, что вам нужно сделать, это вызов, чтобы убедиться, что этот набор вызывается во время создания контекста. Самый простой способ - создать еще один класс и объявить его как bean-компонент, или вы можете заставить этот метод-метод возвратить что-то и использовать его фабричным методом или автоподвести A к нему и использовать некоторую пост-обработку - что бы вы больше не хотели. Вот пример с использованием другой боб:

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> 

Заметим, что вместо прохождения боб, вы можете использовать тот же подход, чтобы пройти весь ApplicationContext ,

В целом, это очень шаткий подход, и он предполагает, что контекст Spring будет происходить до того, как что-то начнет происходить в приложении.

0

Что вы будете делать, если класс B является статическим классом с частным конструктором?

+0

Это не ответ. –

Смежные вопросы