反射机制剖析(二): 利用抽象工厂实现BeanFactory

来源:互联网 发布:单片机检测高低电平 编辑:程序博客网 时间:2024/04/30 05:56

BeanFactory保存在ServletContext中,ServletContext充当Web和业务逻辑的桥梁

 

统一工厂创建和管理对象

利用抽象工厂+单例+反射实现

BeanFactory.java

/** * 抽象工厂 * 采用单例 * @author TCH * */publicclass BeanFactory {privatestatic BeanFactory instance = new BeanFactory(); //系统缺省配置文件名称privatefinal String beansConfigFile = "beans-config.xml"; Documentdoc = null; /* * key=配置文件中的id值 * value=对应了改Id的对象 */MapserviceMap = new HashMap<String, Object>(); MapdaoMap = new HashMap<String, Object>(); privateBeanFactory(){//加载beans-config.xml文件try{doc= newSAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream(beansConfigFile));}catch (DocumentException e) {e.printStackTrace();thrownew RuntimeException();}} publicstatic BeanFactory getInstance(){returninstance;} /** * 根据产品编号取得具体的Service产品 * @param beanId * @return */publicsynchronized Object getServiceObject(Class c){//如果存在对应对象实例,返回if(serviceMap.containsKey(c.getName())) {returnserviceMap.get(c.getName());}ElementbeanElt = (Element)doc.selectSingleNode("//service[@id=\"" +c.getName() +"\"]");StringclassName = beanElt.attributeValue("class");System.out.print(className); ObjectserviceObj = null;try{serviceObj= Class.forName(className).newInstance();//利用动态代理模式创建代理TransactionHandlertransactionHandler = new TransactionHandler();serviceObj= transactionHandler.newProxyInstance(serviceObj); serviceMap.put(c.getName(),serviceObj);}catch (Exception e) {e.printStackTrace();thrownew RuntimeException(); }returnserviceObj;} /** * 根据产品编号取得具体的Dao产品 * @param beanId * @return */publicsynchronized Object getDaoObject(Class c){//如果存在对应对象实例,返回if(daoMap.containsKey(c.getName())) {returndaoMap.get(c.getName());}ElementbeanElt = (Element)doc.selectSingleNode("//dao[@id=\"" +c.getName() +"\"]");StringclassName = beanElt.attributeValue("class");System.out.print(className); ObjectdaoObj = null;try{daoObj= Class.forName(className).newInstance();daoMap.put(c.getName(),daoObj);}catch (Exception e) {e.printStackTrace();thrownew RuntimeException(); }returndaoObj;}publicstatic void main(String[] args){System.out.print(BeanFactory.class);}}


 

ServiceDao层的接口和实现类配置信息

beans-config.xml

<?xmlversion="1.0" encoding="UTF-8"?><beans><service-class><serviceid="com.java.drp.basedata.manager.ItemManager"class="com.java.drp.basedata.manager.ItemManagerImpl"/><serviceid="com.java.drp.flowcard.manager.FlowCardManager"class="com.java.drp.flowcard.manager.FlowCardManagerImp"/><serviceid="com.java.drp.statreport.manager.StatReportManager"class="com.java.drp.statreport.manager.StatReportManagerImp"/></service-class><dao-class><daoid="com.java.drp.basedata.dao.ItemDao"class="com.java.drp.basedata.dao.ItemDao4Oracle"/><daoid="com.java.drp.flowcard.dao.FlowCardDao"class="com.java.drp.flowcard.dao.FlowCardDao4Oracle"/></dao-class></beans>


 

抽象Servlet公共部分:command、User、BeanFactory

BaseServlet.java

publicclass BaseServlet extends HttpServlet { privateString command; privateUser user; privateBeanFactory beanFactory; @Overrideprotectedfinal void service(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {command= request.getParameter("command");user= (User)request.getSession().getAttribute("user_info");super.service(request,response);} protectedString getCommand() {returncommand;} protectedUser getCurrentUser() {returnuser;} protectedBeanFactory getBeanFactory() {//从ServletContext中取得BeanFactorybeanFactory= (BeanFactory)this.getServletContext().getAttribute("beanFactory");returnbeanFactory;}}


 

应用:物料维护Servlet,使用BeanFactory创建对象

FlowCardServlet.java

/** * 物料维护Servlet * @author Administrator * */publicclass FlowCardServlet extends BaseServlet { privateFlowCardManager flowCardManager; @Overridepublicvoid init() throws ServletException {flowCardManager= (FlowCardManager)getBeanFactory().getServiceObject(FlowCardManager.class);//                TransactionHandlertransactionHandler = new TransactionHandler();//                //对目标生成代理对象//                flowCardManager= (FlowCardManager)transactionHandler.newProxyInstance(flowCardManager);} @Overrideprotectedvoid doGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {if(Constants.DEL.equals(getCommand())) {del(request,response);}else {        search(request,response);        }} @Overrideprotectedvoid doPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {doGet(request,response);} /** * 删除 * @param request * @param response * @throws ServletException * @throws IOException */privatevoid del(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {String[]flowCardVouNos = request.getParameterValues("selectFlag");flowCardManager.delFlowCard(flowCardVouNos);response.sendRedirect(request.getContextPath()+ "/servlet/flowcard/FlowCardServlet");}


原创粉丝点击