以静态方法访问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