成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

基于Java反射技術實現簡單IOC容器

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

前言

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

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

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

1.創建一個實體類,比如學生類,汽車類

2.創建XML文件配置對象的信息

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

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

基于Java反射技術實現簡單IOC容器

編寫一個喜聞樂見的Student學生類。

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

后面使用反射技術可以強制給 private 修飾的屬性賦值

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

創建XML文件,配置對象信息

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

<?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.首先根據XML中的配置文件,生成學生對象

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

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

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, 對應 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 根節點 */ private static void reloadBean(Node beanNode) { Element bean = (Element) beanNode; String id = bean.getAttribute('id'); // IOC 容器中 bean 的名字 String beanClass = bean.getAttribute('class'); // 全類名 // 每個 bean 節點下的全部 property 節點 NodeList childNodes = beanNode.getChildNodes(); Map<String, String> attributeMap = reloadAttribute(childNodes); // 使用反射構造 bean 對象 Object instance = creatBean(beanClass, attributeMap); // 將所有的 bean 對象放入容器中 ioc.put(id, instance); } /** * 加載 bean 的屬性值 * * @param attributeNodes 所有的屬性 property 節點 * @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; } /** * 構造bean對象 * * @param className 全類名 * @param attributes 每個對象的屬性和 * @return Object 構造完成的 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 權限檢查 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的方式創建學生對象 使用ioc容器getBean()方法獲取對象 調用對象的復寫的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 的方式創建對象, 從容器中獲取 Student stu1 = (Student) SpringIOC.getBean('stu3'); // 調用學生類的方法,打印信息 System.out.println(stu1.toString()); }}

運行結果,控制臺打印輸出的內容

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美成人精品1314www| 一区二区三区精品久久久| 亚洲女女做受ⅹxx高潮| 国产91精品在线观看| 91黄色免费版| 亚洲午夜影视影院在线观看| 黑丝一区二区三区| 日本一区二区三区dvd视频在线| 丁香桃色午夜亚洲一区二区三区| 欧美日韩精品系列| 麻豆精品视频在线观看免费| 久久久999| 亚洲综合一区二区三区| 欧美日韩国产高清视频| 久久久亚洲午夜电影| 成av人片一区二区| 精品久久久久久久久久久久包黑料 | 中文字幕av一区 二区| 国产一区二区三区在线看麻豆| 在线观看网站黄不卡| 日日欢夜夜爽一区| 久久综合婷婷| 丝袜美腿亚洲色图| 久久精品五月婷婷| 日本aⅴ精品一区二区三区| 久久伊人亚洲| 日韩成人免费看| 美女诱惑黄网站一区| 亚洲第一福利视频在线| 欧美中文字幕| 日韩精品一二区| 日本久久一区二区三区| 日本成人超碰在线观看| 欧美少妇bbb| 国产精品中文字幕一区二区三区| 日韩一级二级三级| 91网页版在线| 亚洲私人影院在线观看| 中文日韩欧美| 亚洲第一av色| 欧美视频在线观看一区二区| 国产麻豆精品在线观看| 日韩欧美国产高清| 99re66热这里只有精品3直播| 欧美国产综合一区二区| 一区二区三区四区五区视频| 日产国产欧美视频一区精品| 欧美疯狂性受xxxxx喷水图片| 国产成人免费9x9x人网站视频| 精品国产欧美一区二区| 亚洲午夜精品久久久久久浪潮| 亚洲一区电影777| 欧美综合视频在线观看| 国产经典欧美精品| 久久精品一区蜜桃臀影院| 韩国自拍一区| 亚洲动漫第一页| 欧美综合亚洲图片综合区| 高清在线不卡av| 亚洲国产精品高清| 99热精品在线| 免费人成网站在线观看欧美高清| 欧美日韩二区三区| 97精品久久久久中文字幕| 亚洲视频你懂的| 色婷婷久久久综合中文字幕| 国产精品亚洲成人| 国产亚洲精品免费| 一区二区91| 蜜臀av一区二区| 精品久久久久一区二区国产| 国产自产精品| 日韩精品成人一区二区三区| 欧美成人三级电影在线| 伊人精品成人久久综合软件| 秋霞电影网一区二区| 久久色成人在线| 一区二区冒白浆视频| 精品一区二区精品| 日本一区二区三区免费乱视频 | 成人avav在线| 亚洲国产一区二区在线播放| 欧美日韩国产123区| 韩日精品视频| 日本不卡一二三| 精品国产乱码久久久久久老虎 | 亚洲视频欧美在线| 久久99精品一区二区三区三区| 久久综合九色综合欧美亚洲| 亚洲欧美电影在线观看| 国产成人在线视频播放| 亚洲精品自拍动漫在线| 日韩一区二区不卡| 亚洲欧美日韩视频二区 | 国产主播一区二区三区四区| 三级久久三级久久| 久久久精品国产免费观看同学| 亚洲欧美视频| 99久久精品一区| 蜜桃精品视频在线| 国产精品免费丝袜| 欧美色精品天天在线观看视频| 欧美高清日韩| 久久精品国产一区二区| ...中文天堂在线一区| 欧美日韩成人综合| 激情综合视频| 国产经典欧美精品| 天天av天天翘天天综合网 | 亚洲一区二区三区爽爽爽爽爽 | 美女网站在线免费欧美精品| 亚洲欧洲一区二区在线播放| 538prom精品视频线放| 一区二区三区福利| 成人免费高清在线| 亚洲一区二区三区三| 337p粉嫩大胆噜噜噜噜噜91av| 久久久久久亚洲精品杨幂换脸| www.日韩大片| 日本少妇一区二区| 亚洲欧美日韩人成在线播放| 精品国产污污免费网站入口 | 欧美精品一区二区三区一线天视频| 色婷婷亚洲精品| 亚洲区国产区| 99热在这里有精品免费| 老司机午夜精品| 亚洲综合色成人| 中文字幕制服丝袜一区二区三区 | 亚洲国产三级在线| 亚洲国产精品精华液2区45| 91精品国产手机| 欧洲精品一区二区| 欧美一级二区| 一区一区视频| 色综合久久综合网97色综合| 国产一区二区三区香蕉| 舔着乳尖日韩一区| 国产精品国产三级国产aⅴ入口| 欧美美女网站色| 久久一日本道色综合久久| 亚洲精品久久久久久一区二区| 97久久超碰国产精品| 国产成人日日夜夜| 久久99国产精品麻豆| 午夜精品久久久久久久| 亚洲免费观看高清完整版在线观看| 久久久蜜臀国产一区二区| 欧美久久一二区| 欧洲精品在线观看| 美女精品网站| aa级大片欧美三级| 激情久久综合| 国产一区在线免费观看| 欧美一区二区视频在线| 99视频一区二区三区| 成人av动漫在线| 成人激情综合网站| 岛国精品在线播放| 国产精品99久久久| 久久99国产精品麻豆| 蜜桃视频第一区免费观看| 日本视频免费一区| 奇米四色…亚洲| 美女视频黄频大全不卡视频在线播放| 肉肉av福利一精品导航| 日本欧美肥老太交大片| 日韩黄色片在线观看| 婷婷成人激情在线网| 亚洲国产综合视频在线观看| 亚洲一区二区三区四区在线免费观看 | 国产精品视频福利| 国产一区二区三区成人欧美日韩在线观看 | 国产精品区一区二区三区| 久久丝袜美腿综合| 久久久久国产一区二区三区四区| 日韩一级成人av| 欧美一区二区三区免费在线看| 欧美精品精品一区| 欧美一级黄色录像| 日韩精品在线一区| 久久网这里都是精品| 欧美—级在线免费片| 综合分类小说区另类春色亚洲小说欧美 | 久久av二区| 久色成人在线| 欧美影院一区二区三区| 欧美特级限制片免费在线观看| 米奇777在线欧美播放| 久久精品天堂| 在线一区二区三区四区| 欧美日韩日日摸| 欧美一区二区视频在线观看| 日韩一区二区影院| 精品免费视频一区二区| 久久久精品一品道一区| 中文字幕一区二区三| 亚洲激情六月丁香| 午夜亚洲国产au精品一区二区| 蜜桃在线一区二区三区|