反射机制剖析(二): 利用抽象工厂实现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);}}
Service、Dao层的接口和实现类配置信息
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");}
- 反射机制剖析(二): 利用抽象工厂实现BeanFactory
- 利用反射机制实现工厂模式
- Java实现抽象工厂模式+java的反射的机制
- 反射机制剖析(一):谈谈工厂家族
- 利用反射实现工厂方法
- 利用反射实现工厂模式.
- 抽象工厂+反射(一)
- 抽象工厂(二)
- 反射(二)反射工厂
- Java反射机制剖析(二)-功能以及举例
- Java反射机制剖析(二)-功能以及举例
- Java反射机制剖析(二)-功能以及举例
- java反射机制剖析(二)— Class Loader
- java反射机制剖析(二)— Class Loader
- Java反射机制剖析(二)-功能以及举例
- Java反射机制剖析(二)-功能以及举例
- Java反射机制剖析(二)-功能以及举例
- Java反射机制剖析(二)-功能以及举例
- apk反编译实践
- iOS 保存图片至相册
- SRAM和SDRAM的不同点
- java判断变量类型
- Android——电脑上面玩Android 游戏(.apk文件)
- 反射机制剖析(二): 利用抽象工厂实现BeanFactory
- jqplot的DateAxisRenderer使用min、max时用到的问题
- kmalloc和vmalloc的区别
- Memcached与Redis区别
- apt-get remove openjdk*
- centOS 编译tcpflow
- Win7无法识别U盘
- Ubuntu 下编译 openJDK7
- Linux动态连接原理 GOT PLT表详解