Spring的应用程序上下文随处可用 - 在静态变量

时间:2015-04-22 14:30:05

标签: java spring

而不是"奋斗"在所需的任何地方注入或传递常见的Spring bean,特别是在非Spring托管类中,将Spring的应用程序上下文设置为静态变量以从任何地方获取它是一个好习惯吗?这样做允许例如在非Spring托管类(或Hibernate会话工厂)中获取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;
    }

}

3 个答案:

答案 0 :(得分:1)

这似乎与Spring的预期用法以及依赖注入的概念背道而驰。虽然您可以这样做,但我认为更好的解决方案是在需要时注入这些bean。

我认为最好初始化上下文一次,引用一个' root' bean,该bean本质上是应用程序,并包含(直接或间接)系统中每个其他bean的引用。

答案 1 :(得分:0)

如果您有Web应用程序,则可以使用Spring中的类org.springframework.web.context.support.WebApplicationContextUtils。它提供了一种获取根WebApplicationContext的方法。

答案 2 :(得分:0)

您似乎想要不是“由 Spring 管理”但可以访问 Spring bean 的 bean。 Prototype scope 为此目的而存在:您让 Spring 实例化该类并注入任何必要的依赖项,然后您自己控制该 bean 的生命周期(Spring 不再关心它)。