多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php框架 > 框架設(shè)計(jì) > [置頂] 【SSH進(jìn)階之路】Spring的IOC逐層深入――為什么要使用IOC[實(shí)例講解](二)

[置頂] 【SSH進(jìn)階之路】Spring的IOC逐層深入――為什么要使用IOC[實(shí)例講解](二)

來(lái)源:程序員人生   發(fā)布時(shí)間:2015-01-28 08:38:56 閱讀次數(shù):3722次

      上篇博客【SSH進(jìn)階之路】Spring簡(jiǎn)介,搭建Spring環(huán)境――輕量級(jí)容器框架(1),我們簡(jiǎn)單的介紹了Spring的基本概念,并且搭建了兩個(gè)版本的Spring開(kāi)發(fā)環(huán)境,但是我們剩下了Spring最核心的兩大技術(shù):IoC和AOP,沒(méi)有深入介紹。從這篇博文開(kāi)始,我們開(kāi)始逐一的深入學(xué)習(xí)Spring的兩個(gè)核心。Spring目前最引人注視的地方,就是IOC=Inversion  OControl(控制反轉(zhuǎn))或DI=Dependence  Injection(依賴(lài)注入)的設(shè)計(jì)思想。

      這篇博客我們使用傳統(tǒng)方式(即不使用Spring)來(lái)實(shí)現(xiàn)1個(gè)添加用戶(hù)的實(shí)例,再同理使用Spring實(shí)現(xiàn)添加用戶(hù)的實(shí)例,對(duì)照學(xué)習(xí)IoC的概念,和為何使用IoC等等,最后,簡(jiǎn)單總結(jié)。下面我們開(kāi)始:

 

傳統(tǒng)方式:

 

客戶(hù)端:

public class Client { public static void main(String[] args){ //由我們的利用程序負(fù)責(zé)服務(wù)(對(duì)象)定位,主動(dòng)發(fā)起查找 UserManager userManager = new UserManagerImpl(); userManager.addUser("jiuqiyuliang", "123456"); } }

業(yè)務(wù)邏輯層:

UserManager接口:添加用戶(hù)的方法

public interface UserManager { public void addUser(String userName,String password); }

UserManager實(shí)現(xiàn)

public class UserManagerImpl implements UserManager{ @Override public void addUser(String userName, String password) { //由我們的利用程序負(fù)責(zé)服務(wù)(對(duì)象)定位,主動(dòng)發(fā)起查找 //UserDao userDao = new UserDao4MysqlImpl(); UserDao userDao = new UserDao4OracleImpl(); userDao.addUser(userName, password); } }

數(shù)據(jù)訪(fǎng)問(wèn)層:

UserDao接口:添加用戶(hù)的方式

public interface UserDao { public void addUser(String userName,String password); }

UserDao兩種實(shí)現(xiàn)(Mysql和Oracle):傳統(tǒng)方式使用配置文件,然后使用工廠(chǎng)來(lái)創(chuàng)建相應(yīng)的對(duì)象(即我們常常說(shuō)的配置文件+抽象工廠(chǎng)+反射,1會(huì)兒我們?cè)倏纯碨pring創(chuàng)建對(duì)象的方式)

public class UserDao4MysqlImpl implements UserDao{ @Override public void addUser(String userName, String password) { //打印訪(fǎng)問(wèn)Mysql的相干信息 System.out.println("UserDao4MysqlImpl.addUser"); } }
public class UserDao4OracleImpl implements UserDao{ @Override public void addUser(String userName, String password) { //打印訪(fǎng)問(wèn)Oracle的相干信息 System.out.println("UserDao4OracleImpl.addUser"); } }

運(yùn)行效果圖:



       看到上面的代碼,非常的熟習(xí),由于我們平時(shí)常常使用。但是問(wèn)題來(lái)了,在業(yè)務(wù)邏輯層的實(shí)現(xiàn)中,UserDao有多種不同的實(shí)現(xiàn)方式,例如Mysql和Oracle,UserManager要依賴(lài)于UserDao的具體實(shí)現(xiàn)。并且對(duì)象是由我們自己負(fù)責(zé)創(chuàng)建的,我們主動(dòng)的發(fā)起了1個(gè)查找,要依賴(lài)于1種數(shù)據(jù)庫(kù)的實(shí)現(xiàn)。此時(shí)我們的UserManager就和UserDao的具體實(shí)現(xiàn)牢牢的耦合在1起了我們?cè)倏纯蛻?hù)端,我們要使用UserManager,同業(yè)務(wù)邏輯層1樣,還得需要我們自己負(fù)責(zé)主動(dòng)查找UserManager的具體實(shí)現(xiàn)。

 

      我們可以發(fā)現(xiàn):傳統(tǒng)方式,對(duì)象和對(duì)象之間產(chǎn)生嚴(yán)重的依賴(lài)關(guān)系,耦合度非常高而且依賴(lài)關(guān)系都寫(xiě)死在了代碼里,項(xiàng)目不容易修改和保護(hù),必須要改代碼

 

      下面我們使用Spring方式改造實(shí)例,實(shí)現(xiàn)一樣的功能,讓Spring管理我們的對(duì)象,看看Spring是怎樣創(chuàng)建對(duì)象和描寫(xiě)對(duì)象之間依賴(lài)關(guān)系的。

 

Spring方式:

 

項(xiàng)目的包圖:

         

客戶(hù)端:

public class Client { public static void main(String[] args){ BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); //到IOC容器中獲得UserManager UserManager userManager = (UserManager) factory.getBean("userManager"); //UserManager使用UserDao,在配置文件已有依賴(lài)關(guān)系 userManager.addUser("jiuqiyuliang", "123456"); } }

業(yè)務(wù)邏輯層:
 UserManager實(shí)現(xiàn):

public class UserManagerImpl implements UserManager{ private UserDao userDao; //使用構(gòu)造方式賦值 public UserManagerImpl(UserDao userDao) { this.userDao = userDao; } @Override public void addUser(String userName, String password) { userDao.addUser(userName, password); } }

Spring的配置文件:

<?xml version="1.0" encoding="UTF⑻"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans⑷.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop⑷.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx⑷.1.xsd"> <!-- 使用spring管理對(duì)象的創(chuàng)建,還有對(duì)象的依賴(lài)關(guān)系 --> <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/> <bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/> <bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl"> <!-- (1)userManager使用了userDao,Ioc是自動(dòng)創(chuàng)建相應(yīng)的UserDao實(shí)現(xiàn),都是由容器管理--> <!-- (2)在UserManager中提供構(gòu)造函數(shù),讓spring將UserDao實(shí)現(xiàn)注入(DI)過(guò)來(lái) --> <!-- (3)讓spring管理我們對(duì)象的創(chuàng)建和依賴(lài)關(guān)系,必須將依賴(lài)關(guān)系配置到spring的核心配置文件中 --> <constructor-arg ref="userDao4Oracle"/> </bean> </beans>

 

       由于其他地方的代碼和效果圖,同上,不再浪費(fèi)大家的帶寬。

   

       對(duì)照傳統(tǒng)的實(shí)現(xiàn)方式,再看客戶(hù)端和UserManager,我們可以發(fā)現(xiàn):通過(guò)IoC或DI,我們只需要通過(guò)簡(jiǎn)單的配置,而無(wú)需任何代碼就能夠指定UserManager中所需的UserDao的具體實(shí)現(xiàn)。UserManager只需利用容器注入的UserDao實(shí)例,完成本身的業(yè)務(wù)邏輯,而不用關(guān)心具體實(shí)現(xiàn)來(lái)自哪、由誰(shuí)實(shí)現(xiàn)。換句話(huà)說(shuō):我們不再需要自己負(fù)責(zé)創(chuàng)建對(duì)象,保護(hù)對(duì)象的依賴(lài)關(guān)系,這些都有Spring替我們完成了。

     

傳統(tǒng)方式和Spring方式對(duì)照:

 

      傳統(tǒng)方式:決定使用哪個(gè)具體實(shí)現(xiàn)是由利用程序負(fù)責(zé)的,在編譯階段就肯定了。

      Spring方式:調(diào)用類(lèi)只依賴(lài)接口,而不依賴(lài)具體的實(shí)現(xiàn)類(lèi),減少了耦合。控制權(quán)交給了容器,在運(yùn)行期才由容器決定將具體的實(shí)現(xiàn)動(dòng)態(tài)的“注入”到調(diào)用類(lèi)的對(duì)象中。這也是使用IoC的根本緣由。

 

       現(xiàn)在我們對(duì)IoC有了基本認(rèn)識(shí),我們?cè)倮斫?下IoC的概念。

 

IoC

     

      IoC(Inversion of Control),控制反轉(zhuǎn),用白話(huà)來(lái)說(shuō),就是由容器控制程序之間的關(guān)系,而非傳統(tǒng)實(shí)現(xiàn)中,由程序代碼直接控制。這也就是所謂“控制反轉(zhuǎn)”的概念所在:控制權(quán)由利用代碼中轉(zhuǎn)到了外部容器,控制權(quán)的轉(zhuǎn)移,就是所謂反轉(zhuǎn)。

  

IoC的優(yōu)缺點(diǎn)

       

優(yōu)點(diǎn):

1、把對(duì)象的創(chuàng)建和依賴(lài)關(guān)系定義在了XML文件中,我們改變子類(lèi)的實(shí)現(xiàn)變得異常簡(jiǎn)單。

2、控制反轉(zhuǎn)減輕了對(duì)象之間的耦合度,減輕了對(duì)象之間的依賴(lài)關(guān)系,增加了系統(tǒng)的靈活性,可保護(hù)性,和可移植性等等。

 

缺點(diǎn):

1、生成對(duì)象的方式變復(fù)雜了(事實(shí)上操作還是挺簡(jiǎn)單的),對(duì)不習(xí)慣這類(lèi)方式的人,會(huì)覺(jué)得有些別扭和不直觀(guān)。

2、創(chuàng)建對(duì)象由于使用了反射技術(shù),在效力上有些消耗。但相對(duì)IoC提高的保護(hù)性和靈活性來(lái)講,這點(diǎn)消耗是微不足道的,除非某對(duì)象的生成對(duì)效力要求特別高。

 

 總結(jié)

 

     IoC使得面向?qū)ο蟮氖澜绺雍?jiǎn)單,面向接口編程成了可能。

 

     引言:下篇博文,我為大家轉(zhuǎn)載了1篇深入理解IoC原理的博文,相當(dāng)簡(jiǎn)單,通俗易通。以后,我為大家準(zhǔn)備了1篇依賴(lài)注入幾種類(lèi)型對(duì)照的博文,快馬加鞭ing,敬請(qǐng)期待。

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線(xiàn)----------------------------
分享到:
------分隔線(xiàn)----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲欧洲久久 | 亚洲毛片免费视频 | 国产一级淫片a免费播放口之 | 97se亚洲综合在线 | 伊人猫咪 | xxxx大片| 香蕉乱码成人久久天堂爱免费 | 国产成人精品一区二三区2022 | 欧美jizz| 成人毛片18女人毛片免费视频未 | 久久亚洲精品无码观看不卡 | 久久不射网 | 国产亚洲欧美日韩在线看片 | 国内精品久久久久影院不卡 | 在线观看亚洲免费视频 | 另类天堂网 | 国产三级国产精品国产国在线观看 | 波多野结衣视频一区二区 | 99精品欧美一区二区三区 | 一级毛片免费毛片毛片 | 欧美人与动性xxxxx杂交 | 久久91精品国产91久久 | 亚洲国产成人资源在线软件 | 国内精品久久久久久久亚洲 | 国产精品久久久久久久久久免费 | 国产精品亚洲一区二区三区正片 | 日本成在线人视频免费视频 | 九九精品免视看国产成人 | 亚洲精品影院久久久久久 | 99国产精品欧美久久久久久影院 | 就去色综合 | 高清视频在线观看 | 国产二区视频在线观看 | 亚洲欧美精品一区 | 欧美日韩国产手机在线观看视频 | 国产成人精品日本亚洲专区6 | 成人淫片免费视频95视频 | 成人免费体验区福利云点播 | 伊人久久成人爱综合网 | 性欧美一区 | 欧美一级第一免费高清 |