每個程序員都有自己寫代碼的習慣吧,用公司編代碼的方式習慣了之后,就按照公司的方法在后台建立了一些工具類。
util類——JPAUtil.java(與數據庫打交道)備注:只是一部分,只做了增刪改查。
package cn.itcast.oa.util; import java.io.Serializable; import java.util.List; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.itcast.oa.base.IDAO; import cn.itcast.oa.domain.Role; import cn.itcast.oa.model.PageInfo; import cn.itcast.oa.model.SortParamList; public class JPAUtil { //這是第一種拿到applicationContext的方法。(通過applicationContextAware) //靜態屬性,spring初始化MyApplicationContextUtil的時候,將applicationContext屬性set到這里面了。 /*private static ApplicationContext applicationContext; public static Object getBean(String beanName) { return getCtx().getBean(beanName); } public static void setApplicationContext(ApplicationContext ctx) { applicationContext = ctx; } private static ApplicationContext getCtx() { return applicationContext; }*/ private static IDAO dao = (IDAO) ApplicationUtil.getBean("baseDao"); //這是第二種拿到applicationContext的方法 private static ApplicationContext ac = new ClassPathXmlApplicationContext( "applicationContext.xml"); /** * find條件查詢數據帶分頁排序 * @param jpql * @param params * @param sortParams * @param pageInfo * @return */ public static <T> List<T> find(String jpql, QueryParamList params, SortParamList sortParams, PageInfo pageInfo) { // IDAO dao = null; // try { // dao = (IDAO) getCtx().getBean("baseDao"); // } catch (BeansException e) { // e.printStackTrace(); // } return dao.find(jpql, params, sortParams, pageInfo); } /** * 創建一條數據 * @param t */ public static <T>void create(T t) { dao.create(t); } /** * 根據id查詢數據 * @param clazz * @param id * @return */ public static <T> T loadById(Class<T> clazz, Serializable id) { return dao.loadById(clazz,id); } /** * 更新數據 * @param t */ public static <T> void update(T t) { dao.update(t); } /** * * @param t */ public static <T>void refresh(T t) { dao.refresh(t); } /** * 刪除數據 * @param clazz * @param id */ public static <T>void remove(Class<T> clazz, Serializable id) { dao.remove(clazz,id); } }
這里面要重點說一下ApplicationUtil這個獲取容器Bean的類。再說這個類之前,先說一下MyApplicationContextUtil這個類:
util類——MyApplicationContextUtil.java
package cn.itcast.oa.util; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class MyApplicationContextUtil implements ApplicationContextAware{ private ApplicationContext context; private Log log = LogFactory.getLog(this.getClass()); @Override public void setApplicationContext(ApplicationContext contex) throws BeansException { this.context = contex; } public void handle() { // JPAUtil.setApplicationContext(context); ApplicationUtil.setApplicationContext(context); log.debug("applicationContext進行設置完成。。。"); } }
這個類實現了ApplicationContextAware接口,因此可以直接獲取到ApplicationContext。這種方法和使用private static ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); 獲取有異曲同工之處,不過還是采用了上面這種方法,因為在此方法中的handle()中可以進行后續的擴展。
這個接口在Spring的官方文檔中也有闡述:
大體意思:當容器創建了一個對象實例,這個實例實現了ApplicationContextAware接口,那么這個實例可以當做這個容器的引用。
在MyApplicationContextUtil類中,當它創建一個實例后就可當做ApplicationContext容器的引用,而這個類是在spring容器初始化時給實例化了,在配置文件中給出了。然后這個實例類又將ApplicationContext對象set到了ApplicationUtil類中。
<!--獲取Spring容器管理對象的環境類 --> <bean id="myApplicationContext" class="cn.itcast.oa.util.MyApplicationContextUtil" init-method="handle"></bean>
util類——ApplicationUtil.java
package cn.itcast.oa.util;
import org.springframework.context.ApplicationContext;
public class ApplicationUtil {
private static ApplicationContext applicationContext;
public static Object getBean(String beanName) {
return getCtx().getBean(beanName);
}
public static void setApplicationContext(ApplicationContext ctx) {
applicationContext = ctx;
}
private static ApplicationContext getCtx() {
return applicationContext;
}
}
這樣,在JPAUtil類中,就可以拿到容器對象,然后拿到對應的實現Bean了,然后實現其中的方法。