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

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

詳解SpringIOC容器相關知識

瀏覽:13日期:2023-07-15 10:56:45
目錄一、前言二、IOC原理實戰三、IOC本質四、spring helloworld五、小結一、前言

IOC控制反轉,不是一種技術,而是一種設計思想,就是將原本在程序中手動創建對象的控制權,交給Spring框架來管理。

區別:

沒有IOC的思路:若要使用某個對象,就必須自己負責去寫對象的創建 IOC的思路:若要使用某個對象,只需要從Spring容器中獲取需要使用的對象,不關心對象的創建過程,也就是把創建對象的控制權交給了Spring框架。 好萊塢法則:Don’t call me, I ’ll call you

舉例說明:

做菜,做蒜薹炒豬肉

你有兩種做法:

第一種,自己養豬,然后種蒜薹。等到豬長大了,你就可以殺豬,蒜薹成熟了,就收割。然后開始炒,做成了蒜薹炒豬肉。

第二種,從農貿市場獲取豬和蒜薹,拿回來直接炒,做成了蒜薹炒豬肉。

此時的IOC就相當于這個農貿市場,我要做菜,我去農貿市場拿過來就可以了,而不需要自己去弄。為什么要Java對象放到容器里?因為我們要做到拿來即用,便于管理。那你能管理農貿市場嗎?你不能,那誰來管農貿市場?Spring!這就是控制反轉IOC,我們把控制權交給了Spring框架,他來幫我們管這個農貿市場,他來養豬,他來種菜。我們只需在要菜的時候,去市場買就好了。

再舉一個例子

過年了,想要給家里打掃個衛生,你想請幾個鐘點工來打掃。也有兩種做法。

第一種:自己主動找,找身邊人看看誰認識鐘點工,你自己打電話邀約,談價格

第二種:直接找家政公司,直接提出需求即可。

第一種方式就是我們自己創建對象的方式,自己主動new幾個鐘點工。而第二種就是spring給我們提供的IOC方式,家政公司就是一個容器,能給我提供很多的服務,鐘點工對象是spring幫我們創建的。

又過了幾天,我又想給廚房的油煙機清理一下,也能直接打電話給家政公司,提出需求。

那上述例子中的農貿市場和家政公司哪里來啊?

我們可以自己構建,就像自己成立一個公司一樣。具體在程序中表現為:

1.使用配置文件或者注解的方式定義一下我們自己容器里存放的東西。

或者去別人的公司里找。具體在程序中表現為:

2.一定有很多人創建了自己的公司,這些服務都可以集成在我們自己的容器里,為我們提供強大的功能,比如spring自帶很多的template模板類。

二、IOC原理實戰

首先在pom.xml文件中加入spring的相關jar包。

<dependencies> <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version> </dependency></dependencies>

我們定義我們的接口和實現類

// UserDao接口public interface UserDao { void getUser();}// UserDao實現類1,mysql實現public class UserDaoImpl implements UserDao { public void getUser() {System.out.println('mysql實現'); }}// UserDao實現類2,oracle實現public class UserDaoImpl implements UserDao { public void getUser() {System.out.println('oracle實現'); }}

然后我們的業務實現類,在不使用set注入的情況下,是這樣的:

//業務接口public interface UserService { void getUser();}//業務實現類public class UserServiceImpl implements UserService { //傳統的方法中,如果這邊要改變,那就必須將這里的語句改變才可以 private UserDao userDao = new UserDaoImpl(); public void getUser() {userDao.getUser(); }}

對應的測試類:

public class MyTest { public static void main(String[] args) {//用戶實際調用的是業務層,不需要接觸dao層UserServiceImpl userService =new UserServiceImpl();userService.getUser(); }}

但是你會發現使用這種方法如果我在測試這里想用oracle實現,那就必須新增一個業務實現類或者修改我原本的業務實現類,違反了開閉原則。

所以我們的業務實現類要使用set方法動態注入我們的UserDao實現類。

public class UserServiceImpl implements UserService { private UserDao userDao; // 利用set進行動態實現值的注入 public void setUserDao(UserDao userDao) {this.userDao = userDao; } public void getUser() {userDao.getUser(); }}

如此一來只需要在測試類中通過set方法,傳入對應的實現類對象,就可以實現調用不同的實現對象的getUser方法。

public class MyTest { public static void main(String[] args) {// 利用set注入的方法,我們可以不需要修改service中的代碼,從而實現多個不同對象的getUser方法UserServiceImpl userService = new UserServiceImpl();userService.setUserDao(new UserDaoImpl());userService.getUser();//mysql實現userService.setUserDao(new UserDaoOracleImpl());userService.getUser();//oracle實現 }}

這兩種模式的區別可以發現。之前,控制UserDao實現類的控制權,在程序員手上,程序員寫在UserServiceImpl里,寫死了對應的是實現類,如果要修改的話,程序員就必須去修改對應的代碼。而后面這種方法,控制UserDao實現類的控制權,就已經不在程序員手上了。現在程序是被動接收對象,然后動態set注入實現了可以隨意使用不同的實現類的getUser方法。

這其實就是一種控制反轉IOC的原型。這種思想從本質上解決了問題,程序員不用再去管理對象的創建了。系統的耦合性大大降低。可以更加專注的在業務的實現上。spring的底層全部都是基于這種思想去實現的。

三、IOC本質

詳解SpringIOC容器相關知識

像上圖所示,IOC本質上就是把左邊變成了右邊。本來是業務層里程序員寫來主動決定調用的下面的Mysql還是Oracle,但是現在通過IOC,可以把主動權交給用戶,讓用戶想用Mysql用Mysql,想用Oracle就用Oracle。

DI(依賴注入)是實現IOC的一種方法,在沒有IOC的程序中,我們使用面向對象編程,對象的創建與對象間的依賴關系完全硬編碼再程序中,對象的創建由程序自己控制(也就是程序員自己寫),控制反轉(IOC)后將對象的創建移交給第三方了,控制反轉的這個反轉說的就是獲得依賴對象的方式反轉了。

采用XML配置方式配置Bean的時候,Bean的定義信息和實現是分離的,而采用注解的方式的時候兩者是合為一體的,Bean的定義信息直接以注解的形式定義在實現類中,從而達到了零配置的目睹。

控制反轉是一種通過描述(XML或者注解)并通過第三方去生產或獲得特定對象的方式。在Spring中實現控制反轉的是IOC容器,其實現方式是依賴注入(Dependency Injection,DI)

四、spring helloworld

找到1.2.2實例化容器部分,發現了其配置文件格式:

詳解SpringIOC容器相關知識

首先創建我們的實體類Hello:

package com.hj.pojo;public class Hello { private String str; public String getStr() {return str; } public void setStr(String str) {this.str = str; } @Override public String toString() {return 'Hello{' +'str=’' + str + ’’’ +’}’; }}

然后根據文檔中所述,在resources文件下創建beans.xml文件來使用spring創建對象。beans.xml內容如下:

<?xml version='1.0' encoding='UTF-8'?><beans xmlns='http://www.springframework.org/schema/beans' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd'> <!--使用spring來創建對象,在spring中這些都稱為bean bean = 對象 相當于 new Hello(); 正常是 類型 變量名 = new 類型(); Hello hello = new Hello(); 利用bean來實現,id就是變量名,class就是我們對象的類型 里面的property相當于給對象中的屬性設置一個值。 --> <bean class='com.hj.pojo.Hello'><!--ref:引用spring容器中創建好的對象value:具體的值,基本數據類型--><property name='str' value='Spring'/> </bean></beans>

再次查看官方文檔,查詢如何使用容器。

詳解SpringIOC容器相關知識

可以看到需要借助一個工廠來讀取bean的定義并進行訪問,然后創建對象。

import com.hj.pojo.Hello;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest { public static void main(String[] args) {//獲取spring的上下文對象ApplicationContext context = new ClassPathXmlApplicationContext('beans.xml');//我們的對象現在都在spring中管理了,我們要使用,直接去取出來就可以了Hello hello = (Hello) context.getBean('hello');System.out.println(hello.toString());//Hello{str=’Spring’}//思考?//Hello對象是誰創建的?是由Spring創建的//Hello對象的屬性是怎么設置的?是由Spring容器設置的 }}

這個Hello對象由spring創建并且由spring容器設置屬性的過程就是控制反轉。

五、小結

控制:誰來控制對象的創建,傳統的應用程序的對象是由程序本身控制創建的,使用spring后,對象是由spring來創建的。

反轉:程序本身不創建對象,而變成被動的接收對象

依賴注入:就是利用set方法來進行注入

IOC是一種編程思想,由主動的編程去變成被動的接收。

我們回頭看Hello類里左邊有個豆子的標志了,這說明這個類已經被Spring托管了。

詳解SpringIOC容器相關知識

所謂的IoC,一句話來概括:對象由spring來創建,管理和裝配。

到此這篇關于詳解SpringIOC和容器相關知識的文章就介紹到這了,更多相關SpringIOC和容器內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国产直播| 久久国产直播| 亚洲制服少妇| 婷婷精品在线| 婷婷久久免费视频| 国产精品毛片一区二区在线看| 日韩欧美三级| 麻豆精品91| 国内精品伊人| 欧美一区二区三区高清视频| 久久国产亚洲| 国产精品久久国产愉拍| 久久九九精品| 91精品尤物| 亚洲天堂1区| 久久午夜精品| 久久精品国产在热久久| 欧美~级网站不卡| 欧美日韩中文| 欧美日韩国产高清电影| 成人午夜网址| 欧洲一区二区三区精品| 国产精品高潮呻吟久久久久| 黄色日韩在线| 亚洲欧美视频| 亚洲激情欧美| 日韩欧美激情电影| 捆绑调教美女网站视频一区 | 精品一区二区三区免费看| 美女视频黄 久久| 日韩电影免费网站| 99国产精品自拍| 午夜性色一区二区三区免费视频| 欧美视频精品全部免费观看| 麻豆久久久久久| 国产v日韩v欧美v| 欧美日韩在线观看视频小说| 蘑菇福利视频一区播放| 一区二区三区国产在线| 国产精品777777在线播放| 日本在线高清| 欧美资源在线| 美日韩一区二区三区| 久久国产电影| 欧美日韩亚洲一区在线观看| 国产suv精品一区二区四区视频| 午夜av一区| 久久国产精品毛片| 久久伊人国产| 国产欧美三级| 欧美国产小视频| 国产精品美女久久久| 亚洲欧洲美洲国产香蕉| 欧美日韩中出| 国产精品av久久久久久麻豆网| 日韩精品一区二区三区免费视频| 国产69精品久久| 免费久久99精品国产| 国产伊人久久| 亚洲精品日韩久久| 电影天堂国产精品| 日韩欧美2区| 亚洲免费福利一区| 美女毛片一区二区三区四区最新中文字幕亚洲 | 亚洲精品午夜av福利久久蜜桃| 亚洲a在线视频| 日韩高清在线不卡| 精品久久国产一区| 成人在线视频区| 日韩精品中文字幕吗一区二区 | 午夜精品一区二区三区国产| 亚洲免费中文| 国产综合色产| 精品国产麻豆| 中文字幕人成乱码在线观看 | 欧美日韩免费观看视频| 9色精品在线| 日韩中文字幕区一区有砖一区| 国产精品久久久久久av公交车| 四虎国产精品免费久久| 日韩精品五月天| 欧美成人久久| 91综合久久爱com| 久久中文亚洲字幕| 蜜桃成人av| 国产麻豆一区| aⅴ色国产欧美| 久久精品1区| 久久爱www.| 精品久久免费| 日韩久久视频| 亚洲欧美日韩国产一区| 国产精品一区二区精品视频观看 | 91精品在线免费视频| 精品国产午夜肉伦伦影院| 视频一区中文字幕| 欧美日韩激情| 日韩欧美一区二区三区在线观看| 日韩国产在线观看| 91超碰国产精品| 成人免费一区| 国产精品一区二区美女视频免费看| 亚洲一级淫片| 久久成人一区| 日韩欧美精品| 中国字幕a在线看韩国电影| 亚洲三级网址| 国产亚洲福利| 亚洲欧洲一区二区天堂久久| 久久久精品久久久久久96 | 婷婷激情综合| 久久影院午夜精品| 国产一区二区三区探花| 久久婷婷国产| 日韩国产成人精品| 日韩一区二区三区精品| 免费精品视频在线| 伊人久久一区| 国产精品日韩| 99国内精品| 综合激情网...| 日韩av一区二区在线影视| 日韩国产欧美在线视频| 欧美亚洲网站| 国产日韩1区| 国产精品毛片久久久| 日韩va亚洲va欧美va久久| 婷婷精品在线观看| 欧美一区二区三区免费看| 奇米亚洲欧美| 国产精品九九| 精品91福利视频| 日韩av专区| 91日韩欧美| 国产 日韩 欧美一区| 好吊日精品视频| 亚洲人成网77777色在线播放| 日韩av三区| 免费亚洲婷婷| 色婷婷狠狠五月综合天色拍| 国产精品啊啊啊| 久久久国产精品网站| 国产一区二区三区久久久久久久久| 黑森林国产精品av| 免费人成黄页网站在线一区二区| 粉嫩av一区二区三区四区五区| 婷婷中文字幕一区| 欧美一区不卡| 激情中国色综合| 91嫩草精品| 国产精品日韩| 久久激情av| 国产欧美日韩精品一区二区免费 | 午夜久久福利| 亚洲在线成人| 蜜桃久久久久久| 日韩精品久久理论片| 国产精品久久久久久妇女| 激情综合婷婷| 亚洲性图久久| 亚洲精品国模| 精品久久久网| 免费成人网www| 色综合视频一区二区三区日韩 | 欧美日韩午夜| 狠狠躁少妇一区二区三区| 国产高清一区二区| 亚洲精品精选| 久久精品天堂| 亚洲高清不卡| 日韩va亚洲va欧美va久久| 国产色播av在线| 伊人久久亚洲影院| 日韩精品一页| 成人久久一区| 日韩在线黄色| 成人美女视频| 亚洲一区二区av| 九九久久国产| 久久亚洲国产精品一区二区| 久久av资源| 黄色亚洲在线| 麻豆极品一区二区三区| 91久久亚洲| 麻豆一区二区三| 国产亚洲网站| 国产一区二区三区亚洲综合| 视频在线观看一区| 国产精品主播| 欧美jjzz| 麻豆精品99| 亚洲黄页一区| 精品精品99| 一区二区国产在线| 欧美一区久久久| 日韩精品一区二区三区中文| 日韩在线短视频| 欧美在线不卡| 好看不卡的中文字幕| 精品久久亚洲|