日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

基于Java反射技術(shù)實現(xiàn)簡單IOC容器

瀏覽:2日期:2022-08-29 15:22:25

前言

首先思考一個問題,如果你正在做一個復(fù)雜的系統(tǒng),一個系統(tǒng)模塊內(nèi)有幾百個功能業(yè)務(wù)類,這些類需要使用同一些對象來進(jìn)行工作。那么,你會怎樣去管理這些通用且一樣的對象呢?

學(xué)習(xí)過Spring的朋友會知道,Spring框架為此提供了一種非常先進(jìn)的思想,即IOC(控制反轉(zhuǎn))。Spring可以理解為一個工廠,負(fù)責(zé)對象的創(chuàng)建和對象間關(guān)系的維護(hù)。IoC即控制反轉(zhuǎn),簡單說就是之前需要使用new的方式創(chuàng)建對象,而Spring框架會從XML文件中根據(jù)配置的信息來創(chuàng)建對象,然后放進(jìn)它自己的容器之中。在程序要使用到該對象的時候,自動注入。

下面就來做一個最簡單的IOC容器。

1.創(chuàng)建一個實體類,比如學(xué)生類,汽車類

2.創(chuàng)建XML文件配置對象的信息

3.編寫一個IOC容器類。這個類工作起來,首先加載XML文件,掃描自己配置的對象信息,之后使用反射技術(shù)創(chuàng)建對象,最后將這些

對象放進(jìn)自己的Map集合中(容器)。外部想要調(diào)用這些對象,那么就使用Map的鍵,來拿到這個集合中對應(yīng)的值(對象)。

基于Java反射技術(shù)實現(xiàn)簡單IOC容器

編寫一個喜聞樂見的Student學(xué)生類。

我做的比較簡單,沒有使用get() set()方法。

后面使用反射技術(shù)可以強(qiáng)制給 private 修飾的屬性賦值

package cn.haidnor.bean;public class Student { /** 學(xué)生姓名 */ private String name; /** 學(xué)生性別 */ private String gender; /** 學(xué)生年齡 */ private int age; @Override public String toString() { return 'Student{' +'name=’' + name + ’’’ +', gender=’' + gender + ’’’ +', age=' + age +’}’; }}

創(chuàng)建XML文件,配置對象信息

id 表示在IOC容器(Map)的鍵 class 表示對象類的全類名 name 表示對象的各種屬性名 property下的文本節(jié)點(diǎn)表示該屬性的值

<?xml version='1.0' encoding='UTF-8'?><beans> <bean class='cn.haidnor.bean.Student'> <property name='name'>Lucy</property> <property name='age'>18</property> <property name='gender'>female</property> </bean> <bean class='cn.haidnor.bean.Student'> <property name='name'>Tom</property> <property name='age'>21</property> <property name='gender'>male</property> </bean> <bean class='cn.haidnor.bean.Student'> <property name='name'>LiLi</property> <property name='age'>23</property> <property name='gender'>female</property> </bean></beans>

編寫IOC容器類

1.首先根據(jù)XML中的配置文件,生成學(xué)生對象

2.所有的對象都放入到一個Map中

3.提供一個getBean()的方法,傳入配置文件中的id,返回對應(yīng)的對象

package cn.haidnor.core;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import java.lang.reflect.Field;import java.util.HashMap;import java.util.Map;public class SpringIOC { /** * 配置文件地址 */ private static final String CONFIGURATION_PATH = 'resources/applicationContext.xml'; /** * ioc容器 */ private static Map<String, Object> ioc = new HashMap<>(); static { initialization(); } /** * 從 ioc 容器中獲取指定 bean * * @param name 需要獲取的 bean 的 id, 對應(yīng) XML 配置文件中的 bean id * @return bean */ public static Object getBean(String name) { return ioc.get(name); } /** * 初始化容器 */ private static void initialization() { Document document = null; try { DocumentBuilderFactory bdf = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = bdf.newDocumentBuilder(); document = documentBuilder.parse(CONFIGURATION_PATH); } catch (Exception e) { e.printStackTrace(); } NodeList beanNodes = document.getElementsByTagName('bean'); for (int i = 0; i < beanNodes.getLength(); i++) { Node node = beanNodes.item(i); reloadBean(node); } } /** * 裝載 benn * * @param beanNode xml 文件 bean 根節(jié)點(diǎn) */ private static void reloadBean(Node beanNode) { Element bean = (Element) beanNode; String id = bean.getAttribute('id'); // IOC 容器中 bean 的名字 String beanClass = bean.getAttribute('class'); // 全類名 // 每個 bean 節(jié)點(diǎn)下的全部 property 節(jié)點(diǎn) NodeList childNodes = beanNode.getChildNodes(); Map<String, String> attributeMap = reloadAttribute(childNodes); // 使用反射構(gòu)造 bean 對象 Object instance = creatBean(beanClass, attributeMap); // 將所有的 bean 對象放入容器中 ioc.put(id, instance); } /** * 加載 bean 的屬性值 * * @param attributeNodes 所有的屬性 property 節(jié)點(diǎn) * @return Map 屬性的名字和值集合 */ private static Map<String, String> reloadAttribute(NodeList attributeNodes) { Map<String, String> keyValue = new HashMap<>(); for (int i = 0; i < attributeNodes.getLength(); i++) { Node filed = attributeNodes.item(i); if (filed.getNodeType() == Node.ELEMENT_NODE) {Element element = (Element) filed;String fileName = element.getAttribute('name');String value = element.getFirstChild().getNodeValue();keyValue.put(fileName, value); } } return keyValue; } /** * 構(gòu)造bean對象 * * @param className 全類名 * @param attributes 每個對象的屬性和 * @return Object 構(gòu)造完成的 bean 對象 */ private static Object creatBean(String className, Map<String, String> attributes) { Object instance = null; try { Class<?> clazz = Class.forName(className); instance = clazz.newInstance(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) {setFiledValue(instance, field, attributes); } } catch (Exception e) { e.printStackTrace(); } return instance; } /** * 為實例對象的屬性賦值 * * @param instance 實例對象 * @param field 屬性字段對象 * @param attributes 屬性名與屬性值的 Map 集合 */ private static void setFiledValue(Object instance, Field field, Map<String, String> attributes) { // 忽略 field 權(quán)限檢查 field.setAccessible(true); String type = field.getType().toString(); String name = field.getName(); try { switch (type) {case 'char': field.setChar(instance, attributes.get(name).charAt(0)); break;case 'class java.lang.Boolean':case 'boolean': field.setBoolean(instance, Boolean.parseBoolean(attributes.get(name))); break;case 'class java.lang.Byte':case 'byte': field.setByte(instance, Byte.parseByte(attributes.get(name))); break;case 'class java.lang.Float':case 'float': field.setFloat(instance, Float.parseFloat(attributes.get(name))); break;case 'class java.lang.Integer':case 'int': field.setInt(instance, Integer.parseInt(attributes.get(name))); break;case 'class java.lang.Long':case 'long': field.setLong(instance, Long.parseLong(attributes.get(name))); break;case 'class java.lang.Short':case 'short': field.setShort(instance, Short.parseShort(attributes.get(name))); break;default: field.set(instance, attributes.get(name)); break; } } catch (Exception e) { e.printStackTrace(); } }}

最后編寫測試類

不使用new的方式創(chuàng)建學(xué)生對象 使用ioc容器getBean()方法獲取對象 調(diào)用對象的復(fù)寫的toString()方法

package cn.haidnor.test;import cn.haidnor.bean.Student;import cn.haidnor.core.SpringIOC;public class Test { public static void main(String[] args) { // 不使用 new 的方式創(chuàng)建對象, 從容器中獲取 Student stu1 = (Student) SpringIOC.getBean('stu3'); // 調(diào)用學(xué)生類的方法,打印信息 System.out.println(stu1.toString()); }}

運(yùn)行結(jié)果,控制臺打印輸出的內(nèi)容

Student{name=’LiLi’, gender=’female’, age=23}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品99久久免费观看| 欧美特黄一级| 少妇精品在线| 亚洲天堂免费| 伊人久久婷婷| 日韩一区精品视频| 亚洲精品麻豆| 奇米色欧美一区二区三区| 日本特黄久久久高潮| 国产精品一区二区av交换| 国产精品日本一区二区三区在线 | 99re国产精品| 丝袜亚洲精品中文字幕一区| 亚洲精品自拍| 日本视频在线一区| 精品一区二区三区中文字幕视频| 成人一二三区| 欧美91福利在线观看| 亚洲永久字幕| 日本欧美一区二区| 美女视频网站久久| 午夜久久中文| 国产一级久久| 国产日韩一区二区三区在线| 久久免费影院| 亚洲二区在线| 亚洲免费观看高清完整版在线观| 青青草国产成人99久久| 国产69精品久久| 日韩啪啪电影网| 国产精品毛片一区二区三区| 欧美一级网址| 日本不卡免费高清视频在线| 制服诱惑一区二区| 久久国产视频网| 天堂中文在线播放| 亚洲天堂日韩在线| 久久精品国产久精国产| 免费不卡中文字幕在线| 蜜桃视频第一区免费观看| 国产欧美日韩在线一区二区| 黄毛片在线观看| 日韩一区精品字幕| 久久精品福利| 女人av一区| 欧美日韩视频免费看| 91看片一区| 最近国产精品视频| 成人在线视频区| 不卡av一区二区| 国产精品蜜月aⅴ在线| 日韩精品欧美| 日本亚洲欧洲无免费码在线| 日韩综合一区| 亚洲图片久久| 日韩在线短视频| 日韩国产欧美视频| 日韩av一级| 国产日韩一区二区三免费高清| 美女一区网站| 日本高清久久| jiujiure精品视频播放| 久久99偷拍| 每日更新成人在线视频| 精品久久久久中文字幕小说| 爽好久久久欧美精品| 97精品国产福利一区二区三区| 在线一区二区三区视频| 国产高潮在线| 国产午夜久久av| 亚洲欧洲日本mm| 麻豆国产欧美日韩综合精品二区| 中文欧美日韩| 日韩国产欧美| 日韩1区2区3区| 久久在线视频免费观看| 国产精品亚洲综合色区韩国| 午夜在线观看免费一区| 日本一二区不卡| 日本a级不卡| 国产婷婷精品| 亚洲精品国产嫩草在线观看| 国产精品一区亚洲| 亚洲精品九九| 伊人精品视频| 亚洲爱爱视频| а√在线中文在线新版| 国产丝袜一区| 日本一区二区三区视频在线看 | 亚洲午夜天堂| 国产精品久久久一区二区| 中文无码久久精品| 九九在线精品| 亚洲91视频| 麻豆视频在线观看免费网站黄| 国产日韩亚洲| 日韩不卡一二三区| 亚洲精品成人一区| 夜夜精品视频| 红桃视频国产精品| 日韩一区亚洲二区| 精品日韩一区| 麻豆精品视频在线| 国产精品超碰| 欧美激情 亚洲a∨综合| 欧美一区久久| 日韩av网站在线免费观看| 一二三区精品| 亚洲在线观看| 免费国产自线拍一欧美视频| 狠狠爱成人网| 99视频一区| 国产精品美女久久久浪潮软件| 欧美一区二区性| 成人在线网站| 久久久久久美女精品| 久久九九电影| 亚洲高清不卡| 在线精品小视频| 亚洲激情久久| 在线视频精品| 一区二区三区四区在线观看国产日韩| 视频一区国产视频| 蜜臀a∨国产成人精品| 亚州欧美在线| 欧美偷窥清纯综合图区| 国产精选久久| 精品日韩一区| 在线一区视频观看| 欧美日韩精品在线一区| 久久久影院免费| 欧美va天堂在线| 国产麻豆综合| 日韩在线观看中文字幕| 91精品麻豆| 嫩草伊人久久精品少妇av杨幂| 久久精品国产在热久久| www.九色在线| 女同性一区二区三区人了人一| 黄色日韩在线| 亚洲综合激情在线| 国产精品一区高清| 国内精品麻豆美女在线播放视频| 天堂√8在线中文| 伊人久久亚洲美女图片| 国产一区二区精品| 婷婷亚洲成人| 久久99精品久久久野外观看| 成人亚洲一区二区| 蜜桃国内精品久久久久软件9| 亚洲欧美日韩国产综合精品二区| 日韩中文字幕无砖| 老司机免费视频一区二区| 激情黄产视频在线免费观看| 亚洲欧美网站在线观看| 日韩中文字幕1| 国产在线不卡一区二区三区| 亚洲综合二区| 水蜜桃精品av一区二区| 蜜芽一区二区三区| 欧美a一区二区| 影院欧美亚洲| 老色鬼精品视频在线观看播放| 国产视频一区在线观看一区免费| 美女视频黄久久| 蜜臀精品一区二区三区在线观看 | 国产成人调教视频在线观看| 国产一级一区二区| 国产成人精品一区二区免费看京 | 国产三级精品三级在线观看国产| 久久国产中文字幕| 国产精品hd| 视频在线在亚洲| 日韩在线观看| 你懂的网址国产 欧美| 日本欧美在线看| 日韩欧美看国产| 国产精品亚洲二区| 亚洲激情偷拍| 超级白嫩亚洲国产第一| 日韩一区二区三区四区五区| 激情偷拍久久| 精品中国亚洲| 日韩精品国产欧美| 欧美美女一区| 国产成人精品亚洲线观看| 日韩不卡一区二区三区| 一区二区视频欧美| 色在线视频观看| 国产精品xxxav免费视频| 亚洲天堂日韩在线| 午夜国产精品视频| 美女av在线免费看| 国产日韩高清一区二区三区在线 | 久久蜜桃精品| 久久99国产精品视频| 日韩av午夜在线观看| 亚洲欧美日韩一区在线观看| 成人精品亚洲| 伊人网在线播放|