在所有需要的地方,特別是在非Spring託管類中,注入或傳遞普通的Spring bean不是「掙扎」,而是設置Spring的應用程序上下文在一個靜態變量從任何地方得到它?這樣做允許例如在非Spring託管類(或Hibernate會話工廠)中獲取JdbcTemplate單例。有沒有很好的理由不這樣做?Spring的應用程序上下文在任何地方都可用 - 在一個靜態變量中設置應用程序上下文
例如:
@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的理念是讓所有的容器都能夠管理,所以你的場景永遠不會發生。但是,您有時需要遵守規則。我建議創建實際的單身人士,當你需要他們,並有彈簧注入他們的依賴。看看我的答案[這個問題](http://stackoverflow.com/questions/5010219/singleton-and-autowired-returning-null)。 –