@Autowired和静态方法

我有@Autowired服务,必须在静态方法中使用。 我知道这是错误的,但我不能改变目前的devise,因为它需要很多工作,所以我需要一些简单的黑客。 我不能改变randomMethod()是非静态的,我需要使用这个autowired bean。 任何线索如何做到这一点?

 @Service public class Foo { public int doStuff() { return 1; } } public class Boo { @Autowired Foo foo; public static void randomMethod() { foo.doStuff(); } } 

您可以通过以下解决scheme之一来执行此操作:

使用构造函数@Autowired

这种方法将构造需要一些bean作为构造参数的bean。 在构造函数代码中,您使用作为构造函数执行参数获取的值来设置静态字段。 样品:

 @Component public class Boo { private static Foo foo; @Autowired public Boo(Foo foo) { Boo.foo = foo; } public static void randomMethod() { foo.doStuff(); } } 

使用@PostConstruct将值传递给静态字段

这里的想法是在bean被springconfiguration后,将一个bean移交给一个静态字段。

 @Component public class Boo { private static Foo foo; @Autowired private Foo tFoo; @PostConstruct public void init() { Boo.foo = tFoo; } public static void randomMethod() { foo.doStuff(); } } 

您必须通过静态应用程序上下文访问器方法解决此问题:

 @Component public class StaticContextAccessor { private static StaticContextAccessor instance; @Autowired private ApplicationContext applicationContext; @PostConstruct public void registerInstance() { instance = this; } public static <T> T getBean(Class<T> clazz) { return instance.applicationContext.getBean(clazz); } } 

然后你可以静态的方式访问bean实例。

 public class Boo { public static void randomMethod() { StaticContextAccessor.getBean(Foo.class).doStuff(); } } 

你可以做的是@Autowired setter方法,并设置一个新的静态字段。

 public class Boo { @Autowired Foo foo; static Foo staticFoo; @Autowired public void setStaticFoo(Foo foo) { Boo.staticFoo = foo; } public static void randomMethod() { staticFoo.doStuff(); } } 

当bean被处理时,Spring会将一个Foo实现实例注入实例字段foo 。 然后它会将相同的Foo实例注入到setStaticFoo()参数列表中,该列表将用于设置静态字段。

这是一个糟糕的解决方法,如果在Spring处理Boo实例之前尝试使用randomMethod() ,将会失败。

它很糟糕,但你可以通过使用ApplicationContextAware接口来获得bean。 就像是 :

 public class Boo implements ApplicationContextAware { private static ApplicationContext appContext; @Autowired Foo foo; public static void randomMethod() { Foo fooInstance = appContext.getBean(Foo.class); fooInstance.doStuff(); } @Override public void setApplicationContext(ApplicationContext appContext) { Boo.appContext = appContext; } } 

使用AppContext。 确保你在上下文文件中创build一个bean。

 private final static Foo foo = AppContext.getApplicationContext().getBean(Foo.class); public static void randomMethod() { foo.doStuff(); }