日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java—实现 IOC 功能的简单 Spring 框架

發(fā)布時(shí)間:2023/11/29 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java—实现 IOC 功能的简单 Spring 框架 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

編寫一個(gè)實(shí)現(xiàn) IOC 功能的簡單 Spring 框架,包含對象注冊、對象管理、及暴 露給外部獲取對象的功能,并編寫測試程序。擴(kuò)展注冊器的方式,要求采用 XML 和 txt 文件。

源代碼

package myspring;import java.lang.reflect.Method; import java.util.Map;/*** 最頂層的IOC實(shí)現(xiàn)* 該類負(fù)責(zé)從注冊器中取出注冊對象* 實(shí)現(xiàn)從對象描述信息轉(zhuǎn)換為對象實(shí)例的過程、* 實(shí)現(xiàn)根據(jù)名稱獲取對象的方法*/ public abstract class AbstractBeanFactory implements BeanFactory {private String filePath; //注冊文件路徑private Map<String,BeanInfo> container; //注冊對象信息Mapprotected SourceReader reader; //對象注冊讀取器public AbstractBeanFactory(String filePath){this.filePath = filePath;}/*** 該方法為抽象方法,需有子類類實(shí)現(xiàn),用于指定使用什么樣的注冊讀取器* @param reader 指定的注冊讀取器*/protected abstract void setSourceReader(SourceReader reader);// 從注冊讀取器中讀取,注冊對象的信息MAPpublic void registerBeans(){this.container = this.reader.loadBeans(filePath);}// 實(shí)現(xiàn)BeanFactory定義的根據(jù)名稱獲取指定對象的方法@Overridepublic Object getBean(String name) {BeanInfo beaninfo = this.container.get(name); //根據(jù)對象名獲取該對象的描述信息if(beaninfo == null){ //如果容器中不存在該對象的描述信息,則返回null,此處可以拋開一個(gè)異常return null;}else{ //根據(jù)對象信息,解析并生成指定對象實(shí)例,返回給用戶return this.parseBean(beaninfo);}} /*** 解析并生成對象實(shí)例* 該方法主要通過反射完成,步驟如下:* 1.根據(jù)類名,加載指定類,并獲取該類的貌似Class對象clazz* 2.使用Class對象clazz實(shí)例化該類,獲取一個(gè)對象,注意,這兒實(shí)例化對象時(shí),采用的無參構(gòu)造方法,因此要求注冊的對象必須含有無參構(gòu)造方法* 3.逐個(gè)設(shè)置對象字段的值,這兒采用setter Method方式,而不是直接使用Field對象的原因是,用戶有可能在setter對象中,對注入的值進(jìn)行額外處理,如格式化等* 4.返回對象實(shí)例* @param beaninfo 指定對象的描述信息* @return*/protected Object parseBean(BeanInfo beaninfo){Class clazz; try {clazz = Class.forName(beaninfo.getType()); //根據(jù)對象的全類名,指定類Object bean = clazz.newInstance(); //使用注冊對象的無參構(gòu)造函數(shù),實(shí)例化對象實(shí)例Method[] methods = clazz.getMethods(); //獲取該類聲明的所有公共方法,其實(shí)Spring獲取的是所有方法,包括非公有的for(String property : beaninfo.getProperties().keySet()){ //遍歷對象的所有屬性,進(jìn)行賦值String setter = "set" + StringUtil.firstCharToUp(property); //獲取屬性的setter方法名稱for(Method method : methods){ //遍歷該類的所有公有方法String methodName = method.getName(); //獲取方法名稱if(methodName.equals(setter)){ //比較方法名與屬性的setter方法名是否相同,如果相同則進(jìn)行賦值Object value = beaninfo.getProperties().get(property); //從對象描述信息中獲取該屬性的值method.invoke(bean,value); //通過反射對屬性進(jìn)行賦值continue; //對下一屬性賦值}}}return bean; //返回指定的對象} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} return null;}}package myspring;/*** IOC容器的頂層接口*/ public interface BeanFactory {/*** 根據(jù)對象的名稱標(biāo)識(shí)來獲取對象實(shí)例* @param name 對象名稱,即對象描述信息中的對象標(biāo)識(shí)* @return 指定名稱的對象實(shí)例*/Object getBean(String name); }package myspring;import java.util.HashMap; import java.util.Map;//該類用于描述注冊在容器中的對象 public class BeanInfo {private String id; //對象的標(biāo)識(shí)private String type; //對象的類型,即全類名private Map<String,Object> properties = new HashMap<String,Object>(); //對象的屬性及值得集合 public String getId() {return id;}public void setId(String id) {this.id = id;}public String getType() {return type;}public void setType(String type) {this.type = type;}public Map<String,Object> getProperties() {return properties;}public void setProperties(Map<String, Object> properties) {this.properties = properties;}public void addProperty(String name, Object value){this.properties.put(name, value);} } package myspring;public class Bootstrap {public static void main(String[] args) {BeanFactory factory = new TXTContext("bean.txt");Speakable s = (Speakable)factory.getBean("Person");s.speak("Lesson one!");} } package myspring;public class Person implements Speakable {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void speak(String message) {System.out.println( this.name + " say: " + message);} } package myspring;import java.util.Map;/*** 注冊讀取器接口* 負(fù)責(zé)從讀取用戶注冊的對象* 繼承該接口的類可以實(shí)現(xiàn)多種讀取方式,如從配置文件中讀取,根據(jù)標(biāo)注讀取,從網(wǎng)絡(luò)中讀取等*/ public interface SourceReader {/*** 讀取用戶注冊的對象信息* @param filePath 讀取錄取* @return 注冊對象信息Map*/Map<String,BeanInfo> loadBeans(String filePath); } package myspring;public interface Speakable {public void speak(String message); } package myspring;public class StringUtil {/*public static void main(String[] args) {System.out.println(StringUtil.firstCharToUp(str)); }*/public static String firstCharToUp(String str){char ch[]=str.toCharArray();char ch1=Character.toUpperCase(ch[0]);ch[0]=ch1;String s=new String(ch);return s;}public static String firstCharToLower(String str){char ch[]=str.toCharArray();char ch1=Character.toLowerCase(ch[0]);ch[0]=ch1;String s=new String(ch);return s;} } package myspring;public class TXTContext extends AbstractBeanFactory {/*** 上下文的構(gòu)造方法* 該方法中指明注冊讀取器* 并在構(gòu)造該方法時(shí)一次性的加載注冊的對象* @param filePath*/public TXTContext(String filePath) {super(filePath);this.setSourceReader(new TXTSourceReader()); //添加注冊讀取器,此處的注冊讀取器為XMLSourceReaderthis.registerBeans(); //加載注冊的對象信息}// 設(shè)置注冊讀取器@Overrideprotected void setSourceReader(SourceReader reader) {this.reader = reader;} }package myspring;import org.w3c.dom.*; import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.*; import java.util.HashMap; import java.util.Map;public class TXTSourceReader implements SourceReader{/*** 實(shí)現(xiàn)讀取注冊對象信息方法* 此處只是模擬測試使用,感興趣的同學(xué)可以自己書寫通過配置文件讀取的實(shí)現(xiàn)*/@Overridepublic Map<String, BeanInfo> loadBeans(String filePath) {//初始化一個(gè)對象信息Map<String,BeanInfo> beans = new HashMap<String,BeanInfo>(); //初始化一個(gè)對象信息MapBeanInfo beanInfo=new BeanInfo();File filename = new File("bean.txt"); // 要讀取以上路徑的input。txt文件InputStreamReader reader = null; // 建立一個(gè)輸入流對象readertry {reader = new InputStreamReader(new FileInputStream(filename));BufferedReader br = new BufferedReader(reader); // 建立一個(gè)對象,它把文件內(nèi)容轉(zhuǎn)成計(jì)算機(jī)能讀懂的語言String line = "";line = br.readLine();while (line != null) {String[] t=line.split("=");System.out.println(t[0]+t[1]);if(t[0].equals("id")){beanInfo.setId(t[1]);}else if(t[0].equals("class")){beanInfo.setType(t[1]);}else beanInfo.addProperty(t[0],t[1]);line = br.readLine();}} catch (FileNotFoundException fileNotFoundException) {fileNotFoundException.printStackTrace();} catch (IOException ioException){ioException.printStackTrace();}beans.put(beanInfo.getId(),beanInfo);return beans; //返回對象信息MAP}package myspring;public class XMLContext extends AbstractBeanFactory{/*** 上下文的構(gòu)造方法* 該方法中指明注冊讀取器* 并在構(gòu)造該方法時(shí)一次性的加載注冊的對象* @param filePath*/public XMLContext(String filePath) {super(filePath);this.setSourceReader(new XMLSourceReader()); //添加注冊讀取器,此處的注冊讀取器為XMLSourceReaderthis.registerBeans(); //加載注冊的對象信息} // 設(shè)置注冊讀取器@Overrideprotected void setSourceReader(SourceReader reader) {this.reader = reader;} }package myspring;import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; import org.jdom2.xpath.XPath;import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map;/*** XML注冊讀取器* 該類繼承了注冊讀取器接口,并模擬實(shí)現(xiàn)了讀取注冊對象信息的方法*/ public class XMLSourceReader implements SourceReader {/*** 實(shí)現(xiàn)讀取注冊對象信息方法* 此處只是模擬測試使用,感興趣的同學(xué)可以自己書寫通過配置文件讀取的實(shí)現(xiàn)*/@Overridepublic Map<String, BeanInfo> loadBeans(String filePath) {//初始化一個(gè)對象信息Map<String,BeanInfo> res = new HashMap<String,BeanInfo>(); //初始化一個(gè)對象信息Maptry {SAXBuilder builder = new SAXBuilder();Document doc = null;doc = (Document) builder.build(new File("book.xml")); XPath xpath = null; xpath = XPath.newInstance("//bean");List beans = null;beans = xpath.selectNodes(doc); Iterator i = beans.iterator();while (i.hasNext()) {BeanInfo beaninfo = new BeanInfo();Element bean = (Element) i.next();String id = bean.getAttributeValue("id");String cls = bean.getAttributeValue("class");beaninfo.setId(id);beaninfo.setType(cls);List<Element> list = bean.getChildren("property");for (Element el : list) {if (el.getAttribute("name") != null) {beaninfo.addProperty(el.getAttributeValue("name"),el.getAttributeValue("value"));}}res.put(beaninfo.getId(),beaninfo);}} catch (JDOMException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return res;} }}

總結(jié)

以上是生活随笔為你收集整理的Java—实现 IOC 功能的简单 Spring 框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。