gpt4 book ai didi

java - Spring's application context available everywhere - 在静态变量中设置应用程序上下文

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:00:13 26 4
gpt4 key购买 nike

与其“努力”在需要的任何地方注入(inject)或传递公共(public) Spring bean,尤其是在非 Spring 托管类中,不如在静态变量中设置 Spring 的应用程序上下文以从任何地方获取它是一个好习惯吗?这样做允许例如在非 Spring 托管类(或 Hibernate session 工厂)中获取 JdbcTemplate 单例。有充分的理由不这样做吗?

例如:

@Component
public class SpringContext implements ApplicationContextAware {

private static ApplicationContext applicationContext;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContext.applicationContext = applicationContext;
}

public static JdbcTemplate getJdbcTemplate() {
return applicationContext.getBean(JdbcTemplate.class);
}

public static SessionFactory getSessionFactory() {
return applicationContext.getBean(SessionFactory.class);
}

public static Session getCurrentSession() {
SessionFactory sf = applicationContext.getBean(SessionFactory.class);
return sf.getCurrentSession();
}

}

在另一个类中,不受 Spring 管理:

public class MyClass {

public Integer method1() {
String sql = "select 1 from dual";
Integer n = SpringContext.getJdbcTemplate().queryForObject(sql, Integer.class);
return n;
}

}

最佳答案

这似乎违背了 Spring 的预期用途,也违背了依赖注入(inject)的概念。虽然您可以这样做,但我认为更好的解决方案是在需要的地方注入(inject)这些 bean。

我发现初始化上下文一次是一个很好的做法,引用一个“根”bean,并且那个bean本质上是应用程序并且包含对每个其他bean的引用(直接或间接)系统。

关于java - Spring's application context available everywhere - 在静态变量中设置应用程序上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29800777/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com