您的位置:首页 > 编程语言 > Java开发

简易SpringIOC容器(初学)

2016-05-07 21:47 375 查看
刚刚学习了spring容器,照着书上的思路,做了一个简易版的spring容器的程序:首先定义一个接口,为简易容器使用方便:package com.wq.SimpleContainer;public interface ReportTool{public void getRun();}
然后定义相关的实现类:
PDF类:
<pre name="code" class="java">package com.wq.SimpleContainer;public class PDFReport implements ReportTool{@Overridepublic void getRun() {// TODO Auto-generated method stubSystem.out.println("使用PDF:");}}
HTML类:
<pre name="code" class="java">package com.wq.SimpleContainer;public class HTMLReport implements ReportTool{@Overridepublic void getRun() {// TODO Auto-generated method stubSystem.out.println("使用HTML:");}}
然后定义一个服务类,内部有一个接口的成员,对接口的不同子类调用:
ServiceMachine:
<pre name="code" class="java">package com.wq.SimpleContainer;public class ServiceMachine{ReportTool report;public ReportTool getReport() {return report;}public void setReport(ReportTool report) {//System.out.println((report==null)+"sbb");this.report = report;}public void getYearTable(int year){report.getRun();System.out.println("生成:"+year+" 的报表!");}public void getMonthTable(int year,int month){//System.out.println(report==null);report.getRun();System.out.println("生成:"+year+" 的    "+month+"  月份的报表!");}}
编写一个配置文件,让容器读取并且生产bean:
<pre name="code" class="plain">pdfReport=com.wq.SimpleContainer.PDFReporthtmlReport=com.wq.SimpleContainer.HTMLReportservice=com.wq.SimpleContainer.ServiceMachineservice.report=pdfReport
定义容器类,功能类似spring容器
<pre name="code" class="java">package com.wq.SimpleContainer;import java.io.FileInputStream;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Properties;import org.apache.commons.beanutils.PropertyUtils;public class Container_IOC{Map<String,Object> components;@SuppressWarnings("rawtypes")public Container_IOC(){components=new HashMap<String,Object>();/*ReportTool pdf=new PDFReport();ReportTool html=new HTMLReport();ServiceMachine service=new ServiceMachine();service.setReport(pdf);components.put("pdf", pdf);components.put("html", html);components.put("service", service);*/Properties p=new Properties();List<String> keys=new ArrayList<>();List<String> values=new ArrayList<>();try {p.load(new FileInputStream("E:\\SOFT\\IOC\\src\\com\\wq\\SimpleContainer\\springContext.properties"));for(Map.Entry entry:p.entrySet()){String key=(String) entry.getKey();String value=(String) entry.getValue();if(key.split("\\.").length>1){keys.add(key);values.add(value);//System.out.println(values[0]);}getEntityFromProterties(key,value);}} catch (Exception e) {e.printStackTrace();}for(int j=0;j<keys.size();j++){String ss[]=keys.get(j).split("\\.");if(ss.length>1){Object component=components.get(ss[0]);Object references=components.get(values.get(j));try {PropertyUtils.setProperty(component, ss[1], references);} catch (Exception e ) {e.printStackTrace();}}}}public void getEntityFromProterties(String key,String value) throws Exception{String ss[]=key.split("\\.");if(ss.length==1){Object o=Class.forName(value).newInstance();components.put(ss[0],o);}}public Object getComponents(String key){return components.get(key);}}
最后是测试类:
<pre name="code" class="java">package com.wq.SimpleContainer;public class MyContainer {public static void main(String args[]){Container_IOC con=new Container_IOC();ServiceMachine service=(ServiceMachine) con.getComponents("service");service.getMonthTable(2016, 5);}}
通过读取配置文件,实现了一定程度的解耦,简易spring(最简化版)

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: