国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring的Ioc模擬實現詳細介紹

Spring的Ioc模擬實現詳細介紹

2021-01-29 11:24C_凱 Java教程

這篇文章主要介紹了Spring的Ioc模擬實現詳細介紹,具有一定參考價值,需要的朋友可以了解下。

簡單來說就是當自己需要一個對象的時候不需要自己手動去new一個,而是由其他容器來幫你提供;Spring里面就是IOC容器。

例如:

在Spring里面經常需要在Service這個裝配一個Dao,一般是使用@Autowired注解:類似如下

?
1
2
3
4
5
6
7
public Class ServiceImpl{
  @Autowired
   Dao dao;
   
  public void getData(){
    dao.getData();
  }

在這里未初始化Dao直接使用是會報出空指針異常的,那么在Spring里面的做法就是通過反射來將需要的類幫你加載進來。

關于IOC:我們講個故事吧!

有一個廚師,他在做一道菜的時候需要某種調味料(bean),可是他正好沒有那瓶調味料(bean),這個時候他就必須去制作一瓶調味料(bean)出來。(這就像我們平時需要對象的時候一樣:UserDao  userdao=new UserDaoImpl)這個時候廚師的工作就不得不跟制作調味料聯系起來,這就是所謂的“耦合”。(耦合程度高通說來說就是,我沒了你我活不了了。);

這個時候IOC里的控制反轉出來了,它提出,開辟一個倉庫(容器),里面放著各種各樣的調味料(bean),當你需要某種調味料(bean)的時候只要給出調味料的名字(beanName)就可以直接去拿取,代碼類似這樣:(UserDao user=倉庫.get("調味料名字"));這樣你就可以直接拿到了調味料 (bean)而不用等到你沒有的時候再去制作一瓶出來。這就是所謂的將控制權轉移出來,它將生產調味料(bean)的工作直接讓倉庫(容器)來制作(生產);

接下來依賴注入出來了,它就更加地強大的了,它提出廚師只要有一個瓶子(private UserDao userdao),并且將瓶子蓋打開(方法:setUserDao( UserDao userdao){this.userdao=userdao}即提供對于的set方法 )再給瓶子貼上一個標簽注明要放什么材料(在xml文件中配置一下<property name="userdao",ref="xxbean"),那么這個時候你什么都不用做了,倉庫(容器)會自動派人幫你將你所需的調味料(bean)放入到瓶子中 ;當你想換另一種調味料的時候只要將瓶子上的標簽改成其他比如胡椒粉(這時要在xml文件中更改一下ref的bean就行了),依賴注入提高了代碼的靈活性,你需要替換類的實現的時候,不需要去修改只要在xml配置文件里修改一下就行了;

總結一下我的總結:IOC的主要目的就是實現解耦!解耦!解耦!重要的事情說三遍.由廚師的列子來說就是.我是一個廚師我只做菜,我不做調味料~~我不是一個做調味料的,我不跟制作調味料有那么大的關系.   IOC的出現,廚師只要安心做好自己的事情(做菜),需要調味料直接去倉庫拿取就行了!那么這樣廚師跟調味料的制作之間的關系就分離開來了,這就是解耦!解耦!解耦!使兩個東西的關系沒那么緊密.

模擬IOC的實現,主要使用的技術是java的反射機制(模擬使用的是架構分為dao層,service層,controller層):

注:歡迎各位大佬的指點,小弟也在學習,說得不好多多包涵~

一.編寫dao類,用于測試:

?
1
2
3
public interface IocDao {
  public void sayhello(); //一個用來測試的接口
}

二.編寫dao的實現類:

?
1
2
3
4
5
6
7
public class IocDaoImpl implements IocDao {
  @Override
  public void sayhello() {
    // TODO Auto-generated method stub
    System.out.println("hello word");//實現我們的dao接口里的方法
  }
}

三.編寫service類:

?
1
2
3
public interface IocDaoService {
  public void sayhello();//業務類接口,這里就跟dao一樣
}

四.編寫service的實現類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class IocDaoServiceImpl implements IocDaoService {
  private IocDao iocDao;  //創建一個接口.
  public IocDao getIocDao() {
    return iocDao;
  }
  //編寫IocDao接口對應的set方法用于依賴注入
  //依賴注入的方式有三種:接口注入,構造方法注入,set注入;
  //此處為set注入
  public void setIocDao(IocDao iocDao) {
    this.iocDao = iocDao;
  }
  @Override
  public void sayhello() {
    // TODO Auto-generated method stub
    iocDao.sayhello();//調用接口方法
  }
}

五.編寫bean.xml配置文件.(這里的i你可以看成是IocDaoImpl類,iocService看成IocDaoServiceImpl,iocDao這是IocDaoServiceImpl里的一個屬性,這個屬性傳入的參數值為“i”);

?
1
2
3
4
5
6
<beans>
 <bean id="i" class="com.hck.dao.impl.IocDaoImpl"/>
 <bean id="iocService" class="com.hck.service.impl.IocDaoServiceImpl">
   <property name="iocDao" ref="i"></property>
 </bean>
</beans>

六.編寫工廠接口.

?
1
2
3
4
//模擬ClassPathXmlApplicationContext實現的一個接口BeanFactory
public interface BeanFactory {
  public Object getBean(String beanName);
}

七.編寫ClassPathXmlApplicationContext去讀取配置文件,并且根據bean.xml里的配置對象去生成各種bean,完成其中的注入工作.(最重要的部分Ioc的實現原理),一字一句都有注釋

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//模擬ClassPathXmlApplicationContext去讀取配置文件
public class ClassPathXmlApplicationContext implements BeanFactory {
  //定義map集合來存放bean.xml里的bean的id跟其對應的實例化對象
  //<bean id="i" class="com.hck.dao.impl.IocDaoImpl"/>
  //那么類似的存放bean.put("i",new IocDaoImpl());這樣子.
  Map<String, Object> beans=new HashMap<String,Object>();
  public ClassPathXmlApplicationContext(String xmlPath){
      try {
        //創建SAXBuilder對象解析文檔
        SAXBuilder saxBuilder = new SAXBuilder();
        //解析build里的參數是一個文件路徑.
        Document document = saxBuilder.build(xmlPath);
        //document.getRootElement().getChildren("bean")獲取所有<bean>標簽內容
        List elements = document.getRootElement().getChildren("bean");
        //遍歷<bean>對象
        for (int i = 0; i < elements.size(); i++) {
          //獲取第一個<bean>標簽elements.get(0);
          Element element = (Element) elements.get(i);
          //獲取<bean>標簽里的<id>屬性,
          //<bean id="i" class="com.hck.dao.impl.IocDaoImpl"/>
          //即String beanName="i";
          String beanName = element.getAttributeValue("id");
          //同上String clazz="com.hck.dao.impl.IocDaoImpl";
          String clazz = element.getAttributeValue("class");
          //加載類對象并且實例化.Object object=new IocDaoImpl();
          Object object = Class.forName(clazz).newInstance();//object是IocDaoServiceImpl
          //將他們添加在map集合里,后面可以根據beanName直接獲取到實例化對象.
          beans.put(beanName, object);
          //遍歷<bean>標簽下的<property>字標簽.
          //第一個標簽沒有字標簽所以直接跳過.已第二個為例子
          //<bean id="iocService" class="com.hck.service.impl.IocDaoServiceImpl">
          //<property name="iocDao" ref="i"></property></bean>
          List elements2 = element.getChildren("property");
          for (int j = 0; j < elements2.size(); j++) {
            //此處我們將獲得<property name="iocDao" ref="i"></property></bean>
            Element element2 = (Element) elements2.get(j);
            //相當于String propertyName="iocDao";
            String propertyName = element2.getAttributeValue("name");
            //相當于String refBean="i";
            String refBean = element2.getAttributeValue("ref");
            //相當于String propertyName="IocDao";
            //目的是為了得到一個方法的名字setIocDao,用于反射調用
            propertyName = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
            //這里的methodName="setIocDao";
            String methodName = "set" + propertyName;
            //獲取Map集合里Key="i"的值;i對應的是IocDaoImpl的實例化對象
            //相當于 Object object2 =IocDaoImpl;
            Object object2 = beans.get(refBean);
            //獲取IocDaoServiceImpl方法里的setIocDao方法.
            //第一個方法是方法名,第二個參數是方法的參數類型.
            Method method = object.getClass().getDeclaredMethod(methodName,
                object2.getClass().getInterfaces());
            //調用方法,并傳入參數,完成依賴注入.
            method.invoke(object, object2);
          }
        }
        //      String beanName=document.getElementById(id).attributes().get("class");
        //      Object object=Class.forName(beanName).newInstance();
        //      return object;
      } catch (Exception e) {
        e.printStackTrace();
        // TODO: handle exception
      }
  }
/* (non-Javadoc)
 * @see com.hck.ioc.BeanFactory#getBean()
 */
@Override
public Object getBean(String beanName) {
  // TODO Auto-generated method stub
  return beans.get(beanName);
}

八.編寫測試類

?
1
2
3
4
5
6
7
public class Ioc {
  public static void main(String[] args) {
  ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("src/bean.xml");
  IocDaoService ids=(IocDaoService)applicationContext.getBean("iocService");
  ids.sayhello();
}
}

九.顯示結果:

?
1
hello word

總結

以上就是本文關于Spring的Ioc模擬實現詳細介紹的全部內容,希望對大家有所幫助。有什么問題可以隨時留言,歡迎大家交流討論。

原文鏈接:http://www.cnblogs.com/hckblogs/p/7765876.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 成年人黄色免费网站 | 中文字幕一区二区三区日韩精品 | 欧美尹人 | 久久久影院| 黄视频网站在线观看 | 日韩91视频 | 国产日韩免费视频 | 亚洲国产精品yw在线观看 | 日韩成人不卡 | 欧美三级影院 | 一级黄色毛片 | 国产精品自拍视频 | 精品在线视频播放 | 中文字幕在线免费播放 | 日本午夜精品 | 欧美午夜一区二区三区免费大片 | 午夜国产| 亚洲一区二区三区久久久 | 国产麻豆一区二区三区 | 日韩一区精品视频 | av中文字幕在线 | 美女久久久久 | 久久国内精品 | 4438x成人网最大色成网站 | 成人国产综合 | 欧美成人午夜视频 | 午夜午夜精品一区二区三区文 | 91视频国产精品 | 成人午夜电影在线观看 | 亚洲欧美在线免费 | 免费观看一区二区三区毛片软件 | 久久伊人色 | 国产日韩中文字幕 | 国产精品一区二区三区免费 | 免费看黄色一级大片 | 久久黄色网 | 中文字幕超清在线免费 | 亚洲激情视频 | 中文一二区 | 男人天堂网av | 国产一区 |