以静态方法访问spring bean

我有一个带有静态方法的Util类。 在我的Util类中,我想使用spring bean,所以我将它们包含在我的util类中。 据我所知,使用spring bean作为静态字段并不是一个好习惯。 但有没有办法在静态方法中访问spring bean?

我的例子:

public class TestUtils { private static TestBean testBean; public void setTestBean(TestBean testBean) { TestUtils.testBean = testBean; } public static String getBeanDetails() { return beanName = testBean.getDetails(); } } 

我在很多论坛上都看到这不是最好的做法。 有人能告诉我如何处理这种情况吗?

我的配置文件:

    

我的方法是为了希望访问的bean实现InitializingBean或使用@PostConstruct ,并包含对自身的静态引用。

例如:

 @Service public class MyBean implements InitializingBean { private static MyBean instance; @Override public void afterPropertiesSet() throws Exception { instance = this; } public static MyBean get() { return instance; } } 

因此,静态类中的用法只是:

 MyBean myBean = MyBean.get(); 

这样,不需要XML配置,您不需要将bean作为构造函数参数传递,并且调用者不需要知道或关心bean使用Spring连接(即,不需要凌乱) ApplicationContext变量)。

静态方法的结果应仅依赖于传递给方法的参数,因此不需要调用任何bean。

如果需要调用另一个bean,那么您的方法应该是独立bean的成员方法。

其他答案为您提供工作解决方案,但事实上它可以做到并不意味着它应该完成。

你也可以实现ApplicationContextAware接口,如下所示:

 @Component public class TestUtils implements ApplicationContextAware { private static ApplicationContext ac; public static String getBeanDetails() { return beanName = ((TestBean) ac.getBean("testBean")).getDetails(); } @Override public void setApplicationContext(ApplicationContext ac) { this.ac = ac; } } 

与@ nullPainter的响应类似,但我们做了以下操作。 不需要后构造逻辑。 它只是在注入期间直接设置静态成员(在@Autowired方法中)。

 @Service public class MyUtil { private static MyManager myManager; @Autowired(required = true) public void setMyManager(MyManager manager) { myManager = manager; } public static MyManager getMyManager() { return myManager; } } 

这就是我从弹簧中注入静态场的方法。

      

也许这对你有帮助。

这对我有用。 在某些课程中:

 import org.springframework.web.context.ContextLoader; import org.springframework.web.context.WebApplicationContext; WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext(); DataSource datasource = (DataSource)context.getBean("dataSourceDB_01"); 

在我的xml配置中:

  ${db.driver} ${db.url} ${db.username_seg} ${db.password_seg}  

HTH

您已经概述的方法是我已经看到用于将Spring bean注入实用程序类的方法。

    

另一种选择是:

         

有:

 public class TestUtils { private static testBean; public static void setInstance(TestBean anInstance) { testBean = anInstance; } public static String getBeanDetails() { return testBean.getDetails(); } } 

更多细节在这里和这里