亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java之控制反轉和依賴注入

2019-11-06 06:11:40
字體:
來源:轉載
供稿:網友

學習java的同學注意了?。。?nbsp;學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!

1.簡介

依賴注入和控制反轉,目的是為了使類與類之間解耦合,提高系統的可擴展性和可維護性,下面通過一個例子來引入這一概念。

 

2.案例

1)一般情況下的類耦合

Main.java

復制代碼
public class Main {     public static void main(String[] args) {          /******** 一般寫法,Main類與Chinese類和American類之間的強耦合 ***********/          // Chinese和American,當類和方法修改時,此處的類和方法也需要修改          Chinese chinese = new Chinese();          chinese.sayHelloWorld("張三");          American american = new American();          american.sayHelloWorld("Jack");     }}/******************** 一般方法 ***************************/interface Human {     public void sayHelloWorld(String name);}class Chinese implements Human {     public void sayHelloWorld(String name) {          String helloWorld = "你好," + name;          System.out.PRintln(helloWorld);     }}class American implements Human {     public void sayHelloWorld(String name) {          String helloWorld = "Hello," + name;          System.out.println(helloWorld);     }}復制代碼

 

通過上面代碼可以看出:Main類與Chinese類和American類之間存在著強耦合 , Chinese和American類和方法修改時,此處的類和方法也需要修改。不容易擴展和維護。

 

2)工廠方法來解耦合

復制代碼
public class Main {     public static void main(String[] args) {          /******** 工廠方法, Main類與類Chinese和American不再耦合,僅僅和其接口Human耦合 ***********/          // 修改時還需要修改在Main類中修改這些字符串          // Chinese和American,當類和方法修改時,只有方法需要修改          HumanFactory humanFactory = new HumanFactory();          Human human1 = humanFactory.getHuman("chinese");          human1.sayHelloWorld("張三");          Human human2 = humanFactory.getHuman("american");          human2.sayHelloWorld("Jack");     }}/******************** 工廠方法 ***************************/interface Human {     public void sayHelloWorld(String name);}class HumanFactory {     public Human getHuman(String type) {          if ("chinese".equals(type)) {               return new Chinese();          } else {               return new American();          }     }}復制代碼

 

通過上面代碼可以看出:Main類與類Chinese和American不再耦合,僅僅和其接口Human耦合,修改時還需要修改在Main類中修改這些字符串,當類和方法修改時,只有方法需要修改。這一定程度上降低了Main類和Chinese、American類的耦合

 

3)依賴注入和控制反轉

復制代碼
public class Main {     public static void main(String[] args) {          /******************** IOC控制反轉和依賴注入 ***************************/          // 利用容器,通過xml文件直接注入屬性值,在Main類中只添加需要的          // Chinese和American,當類和方法修改時,代碼完全不用修改,只需要修改xml文件即可,徹底實現了解耦          BeanFactory beanFactory = new BeanFactory();          beanFactory.init("/config.xml");          UserBean userBean = (UserBean) beanFactory.getBean("userBean");          System.out.println("userName=" + userBean.getUserName());          System.out.println("passWord=" + userBean.getPassword());     }}/******************** IOC控制反轉和依賴注入 ***************************/// 下面是Spring的IOC實現:Bean工廠class BeanFactory {     private Map<String, Object> beanMap = new HashMap<String, Object>();     public void init(String fileName) {          try {               // 讀取指定的配置文件               SAXReader reader = new SAXReader();               // System.out.println(xmlpath);               String realPathString = new File("").getCanonicalPath();               Document document = reader.read(new File(realPathString + "/src/com/devin/") + fileName);               Element root = document.getRootElement();               Element foo;               // 遍歷bean               for (Iterator i = root.elementIterator("bean"); i.hasNext();) {                    foo = (Element) i.next();                    // 獲取bean的屬性id和class                    Attribute id = foo.attribute("id");                    Attribute cls = foo.attribute("class");                    // 利用Java反射機制,通過class的名稱獲取Class對象                    Class bean = Class.forName(cls.getText());                    // 獲取對應class的信息                    java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean);                    // 獲取其屬性描述                    java.beans.PropertyDescriptor pd[] = info.getPropertyDescriptors();                    // 設置值的方法                    Method mSet = null;                    // 創建一個對象                    Object obj = bean.newInstance();                    // 遍歷該bean的property屬性                    for (Iterator ite = foo.elementIterator("property"); ite.hasNext();) {                         Element foo2 = (Element) ite.next();                         // 獲取該property的name屬性                         Attribute name = foo2.attribute("name");                         String value = null;                         // 獲取該property的子元素value的值                         for (Iterator ite1 = foo2.elementIterator("value"); ite1.hasNext();) {                              Element node = (Element) ite1.next();                              value = node.getText();                              break;                         }                         for (int k = 0; k < pd.length; k++) {                              if (pd[k].getName().equalsIgnoreCase(name.getText())) {                                   mSet = pd[k].getWriteMethod();                                   mSet.invoke(obj, value);                              }                         }                    }                    // 將對象放入beanMap中,其中key為id值,value為對象                    beanMap.put(id.getText(), obj);               }          } catch (Exception e) {               System.out.println(e.toString());          }     }     // 通過bean的id獲取bean的對象.     public Object getBean(String beanName) {          Object obj = beanMap.get(beanName);          return obj;     }}UserBean.javapublic class UserBean {     private String userName;     private String password;     public String getPassword() {          return password;     }     public String getUserName() {          return userName;     }     public void setUserName(String userName) {          this.userName = userName;     }     public void setPassword(String password) {          this.password = password;     }}config.xml<?xml version="1.0" encoding="UTF-8"?><beans>     <bean id="userBean" class="com.devin.UserBean">          <property name="userName">               <value>張三</value>          </property>          <property name="password">               <value>Jack</value>          </property>     </bean></beans>復制代碼

 

說明:模擬了Spring中IOC的實現,雖然只是完成了Spring中依賴注入的一小部分工作,但是很好的展現了Java反射機制在Spring中的應用,能使我們能更好的從原理上了解IOC的實現。

學習Java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情精品久久久久久久变态| 亚洲福利在线观看| 视频在线观看一区二区| 亚洲性av网站| 亚洲人精品午夜在线观看| 九九精品视频在线观看| 欧美性猛交xxxx富婆| 欧美综合在线第二页| 国产97在线|亚洲| 欧美国产精品人人做人人爱| 国产精品白嫩初高中害羞小美女| 97视频在线免费观看| 日韩亚洲精品电影| 精品自拍视频在线观看| 亚洲free性xxxx护士白浆| 国产成人av网址| 国产精品h在线观看| 精品久久国产精品| 久久精品免费电影| 国产精品中文字幕在线观看| 国产精品日韩一区| 国产精品成人播放| 成人国产亚洲精品a区天堂华泰| 欧美一级大片在线免费观看| yellow中文字幕久久| 国产精品wwww| 亚洲免费视频观看| 日韩亚洲国产中文字幕| 精品亚洲一区二区三区在线观看| 国产日韩欧美视频| 久久电影一区二区| 成人午夜在线视频一区| 国产精品日韩欧美综合| 欧美黄色性视频| 人人爽久久涩噜噜噜网站| 欧美在线日韩在线| 欧美日韩中国免费专区在线看| 最近2019中文字幕一页二页| 久久精品99国产精品酒店日本| 欧美成人午夜激情| 国产精品亚洲欧美导航| 国产精品成人久久久久| 日韩有码片在线观看| 亚洲精品国产精品国产自| 在线视频中文亚洲| 色先锋资源久久综合5566| 九九精品在线播放| 久久久久久国产三级电影| 国产91色在线| 57pao精品| 久久成人精品视频| 亚洲欧美国产一本综合首页| 91成人在线观看国产| 97国产精品久久| 中文字幕日韩av| …久久精品99久久香蕉国产| 91精品中国老女人| 欧美精品激情视频| 欧美一级大片在线免费观看| 久久视频国产精品免费视频在线| 欧美一区深夜视频| 欧美性一区二区三区| 精品视频在线播放| 国产亚洲精品久久| 国产欧美一区二区三区久久人妖| 亚洲精品久久久久中文字幕欢迎你| 亚洲男人天天操| 成人国产亚洲精品a区天堂华泰| 日韩精品在线观看一区| www.亚洲男人天堂| 在线电影av不卡网址| 日日噜噜噜夜夜爽亚洲精品| 欧美高清电影在线看| 国产精品久久一| 亚洲日本成人女熟在线观看| 欧美性猛交xxxx黑人猛交| 亚洲丝袜一区在线| 欧美肥老太性生活视频| 懂色av一区二区三区| 国产成人av网址| 正在播放欧美一区| 欧美男插女视频| 亚洲天堂av综合网| 国产成人精品在线观看| 欧美成人久久久| 亚洲黄页网在线观看| 久久视频在线直播| 7m精品福利视频导航| 亚洲精品aⅴ中文字幕乱码| 2019中文字幕在线| 在线观看亚洲区| 国产精品 欧美在线| 国产欧亚日韩视频| 亚洲欧美国产另类| 久久在线视频在线| 欧美激情一区二区三区成人| 日韩av中文字幕在线播放| 91av在线影院| 亚洲美女性视频| 欧美激情极品视频| 精品性高朝久久久久久久| 伊人伊成久久人综合网站| 亚洲第一网中文字幕| 一本色道久久88综合日韩精品| 国产91色在线免费| 91精品国产99| 国产91精品久久久久久久| 午夜美女久久久久爽久久| 日本成人在线视频网址| 国产精品∨欧美精品v日韩精品| 69精品小视频| 国产精品久久久久久五月尺| 日韩成人在线播放| 色妞欧美日韩在线| 亚洲国产一区二区三区在线观看| 国产精品18久久久久久首页狼| 久久精品99久久香蕉国产色戒| 91精品综合久久久久久五月天| 亚洲大胆人体视频| 97在线免费观看| 78m国产成人精品视频| 日韩经典中文字幕在线观看| 国产欧美精品va在线观看| 国产日韩欧美夫妻视频在线观看| 尤物九九久久国产精品的分类| 91欧美激情另类亚洲| 亚洲国产精品免费| 亚洲国产欧美一区二区三区久久| 久久在线观看视频| 亚洲一区国产精品| 日韩中文在线中文网三级| 午夜精品福利视频| 国产欧美精品在线播放| 97超碰蝌蚪网人人做人人爽| 久久久久北条麻妃免费看| 91在线无精精品一区二区| 亚洲男人的天堂在线| 国产97在线亚洲| 亚洲成人激情在线观看| 国内精品视频久久| 国产精品一区二区女厕厕| 不卡毛片在线看| 亚洲大胆美女视频| 亚洲欧美精品suv| 午夜精品久久久久久99热| 欧美精品videos性欧美| 欧美一区二区三区免费视| 在线观看日韩www视频免费| 国产精品海角社区在线观看| 青青草99啪国产免费| 欧美中文在线观看国产| 国产精品夜色7777狼人| 国产精品久久久久久久久久99| 久久久久日韩精品久久久男男| 亚洲国产欧美一区二区三区同亚洲| 亚洲97在线观看| 欧美黄色成人网| 一区二区三区视频免费在线观看| 69**夜色精品国产69乱| 亚洲免费视频在线观看| 欧美中文字幕在线播放| 国产精品日韩久久久久| 日韩福利在线播放| 中文字幕日本欧美|