2009-06-19 19 views

Respuesta

74

En resumen, no. No se puede autoconectar o conectar manualmente campos estáticos en Spring. Tendrás que escribir tu propia lógica para hacer esto.

+0

Cuando encuentre el código antiguo de hacer esto, es un anti-patrón. Entrecierra los ojos, inclina tu cabeza y encuentra una mejor manera de resolver el problema. Estaras contento de haberlo hecho. –

+0

esta [respuesta] (http://stackoverflow.com/a/3746611/409976) también es útil en Spring @' AutoWired' –

+0

Puede encontrar más información actualizada [answer here] (http://stackoverflow.com/a/ 17660550) – nmy

5

Crea un bean que puedes autoaumentar, que inicializará la variable estática como efecto secundario.

52

@Autowired se puede utilizar con setters para que pueda tener un setter que modifique un campo estático.

Sólo una sugerencia final ... NO

+4

Inteligente .... Sin embargo, no me atrevo a decirlo de otra manera :) – skaffman

+33

¿Por qué sugieres que no hagas esto? –

+7

Sí, también estoy interesado en saber por qué no se recomienda hacer esto ... – will824

4

se puede lograr esto usando la notación XML y la MethodInvokingFactoryBean. Para un ejemplo, busque here.

private static StaticBean staticBean; 

public void setStaticBean(StaticBean staticBean) { 
    StaticBean.staticBean = staticBean; 
} 

Usted debe tratar de usar la inyección primavera, cuando sea posible, ya que es el método recomendado pero esto no siempre es posible, ya que estoy seguro de que puede imaginar como no todo puede ser retirado del recipiente de la primavera o tal vez lidiar con sistemas heredados.

Nota: las pruebas también pueden ser más difíciles con este enfoque.

61
@Component 
public class NewClass{ 
    private static SomeThing someThing; 

    @Autowired 
    public void setSomeThing(SomeThing someThing){ 
     NewClass.someThing = someThing; 
    } 
} 
+0

¿Alguna idea de cómo puedo usar este enfoque al inicializar un repositorio? – kiedysktos

0

Init su componente autowired en el método @PostConstruct

@Component 
public class TestClass { 
    private static AutowiredTypeComponent component; 

    @Autowired 
    private AutowiredTypeComponent autowiredComponent; 

    @PostConstruct 
    private void init() { 
     component = this.autowiredComponent; 
    } 

    public static void testMethod() { 
     component.callTestMethod(); 
    } 
} 
Cuestiones relacionadas