欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring超詳細(xì)講解IOC與解耦合

 更新時(shí)間:2022年08月03日 16:14:02   作者:懶羊羊.java  
IoC就是比方說(shuō)有一個(gè)類,我們想要調(diào)用類里面的方法(不是靜態(tài)方法),就要?jiǎng)?chuàng)建該類的對(duì)象,使用對(duì)象調(diào)用方法來(lái)實(shí)現(xiàn)。但對(duì)于Spring來(lái)說(shuō),Spring創(chuàng)建對(duì)象的過(guò)程,不是在代碼里面實(shí)現(xiàn)的,而是交給Spring來(lái)進(jìn)行配置實(shí)現(xiàn)的

前言

回想寫過(guò)的圖書管理系統(tǒng)、租房系統(tǒng)、電影院賣票系統(tǒng)都是基于原生的JavaSE、OOP,沒(méi)有用到任何框架,在層與層的關(guān)系中一個(gè)類要想獲得與其他類的聯(lián)系主要的方式還是靠new,這就導(dǎo)致層與層之間、對(duì)象與對(duì)象之間的依賴性強(qiáng)“動(dòng)一發(fā)而遷全身”。特別是在處理數(shù)據(jù)層和業(yè)務(wù)層之間時(shí),由于對(duì)象沒(méi)有統(tǒng)一管理導(dǎo)致很復(fù)雜!而Spring中的IOC就很好地解決了這一問(wèn)題,降低耦合就是它的一大特色

一.所謂耦合

個(gè)人建議:學(xué)習(xí)Spring之前要多寫原生的OOP項(xiàng)目,充分體會(huì)層之間、類之間的聯(lián)系才能深刻理解Spring的特色

在項(xiàng)目開(kāi)發(fā)中,對(duì)象之間的耦合度就是多個(gè)對(duì)象間的依賴性、關(guān)聯(lián)性。對(duì)象之間的耦合越高,維護(hù)成本越高,因此對(duì)象的設(shè)計(jì)應(yīng)使類和類之間的耦合最小

當(dāng)使用Spring框架后你不用再考慮new對(duì)象了,只要寫好配置文件,IOC就會(huì)幫你做,這就降低了層與層、對(duì)象與對(duì)象之間之間的耦合度

二.Spring

Spring是分層的Java SE/EE應(yīng)用輕量級(jí)開(kāi)源框架,以loC(Inverse Of Control:反轉(zhuǎn)控制)和AOP (Aspect Oriented Programming:面向切面編程)為內(nèi)核

方便解耦,簡(jiǎn)化開(kāi)發(fā)通過(guò)Spring提供的 loC容器,可以將對(duì)象間的依賴關(guān)系交由Spring進(jìn)行控制,避免硬編碼所造成的過(guò)度耦合。用戶也不必再為單例模式類、屬性文件解析等這些很底層的需求編寫代碼,可以更專注于上層的應(yīng)用
AOP編程的支持通過(guò)Spring的AOP功能,方便進(jìn)行面向切面編程,許多不容易用傳統(tǒng)OOP實(shí)現(xiàn)的功能可以通過(guò)AOP輕松實(shí)現(xiàn)
聲明式事務(wù)的支持可以將我們從單調(diào)煩悶的事務(wù)管理代碼中解脫出來(lái),通過(guò)聲明式方式靈活的進(jìn)行事務(wù)管理,提高開(kāi)發(fā)效率和質(zhì)量
方便程序的測(cè)試可以用非容器依賴的編程方式進(jìn)行幾乎所有的測(cè)試工作,測(cè)試不再是昂貴的操作,而是隨手可做的事情
降低JavaEE API的使用難度Spring對(duì)JavaEEAPl(如JDBC、JavaMail、遠(yuǎn)程調(diào)用等)進(jìn)行了薄薄的封裝層,使這些API的使用難度大為降低

三.核心IOC理解

IoC(Inversion of Control)名為控制反轉(zhuǎn),顧名思義就是將控制權(quán)反轉(zhuǎn)

通過(guò)控制反轉(zhuǎn),把對(duì)象的創(chuàng)建由原來(lái)的人為new反轉(zhuǎn)成Spring來(lái)處理,但是代碼中不可能出現(xiàn)沒(méi)有依賴的情況,所以IOC解耦只是降低他們的依賴關(guān)系,不會(huì)消除依賴關(guān)系

1.容器

容器的核心是Bean,這個(gè)單詞譯為——豆莢,顧名思義我們的對(duì)象都被裝在這個(gè)豆莢里統(tǒng)一管理

里面存的是各種對(duì)象(在xml里配置的bean、@repository. @service、@controller. @component) ,實(shí)際上就是抽象的(k-v)map——(id-class)

在項(xiàng)目啟動(dòng)的時(shí)候會(huì)讀取配置文件里面的bean節(jié)點(diǎn),根據(jù)全限定類名使用反射創(chuàng)建對(duì)象放到map里、掃描到打上上述注解的類還是通過(guò)反射創(chuàng)建對(duì)象放到map里。這個(gè)時(shí)候map里就有各種對(duì)象了,接下來(lái)我們?cè)诖a里需要用到里面的對(duì)象時(shí),再通過(guò)DI注入(autowired.resource等注解, xml里bean節(jié)點(diǎn)內(nèi)的ref屬性,項(xiàng)目啟動(dòng)的時(shí)候會(huì)讀取xm|節(jié)點(diǎn)ref屬性根據(jù)id注入,也會(huì)掃描這 些注解,根據(jù)類型或id注入: id就是對(duì)象名)

2.控制反轉(zhuǎn)

沒(méi)有引入IOC容器之前

對(duì)象A依賴于對(duì)象B,那么對(duì)象A在初始化或者運(yùn)行到某一點(diǎn)的時(shí)候, 自己必須主動(dòng)去創(chuàng)建對(duì)象B或者使用已經(jīng)創(chuàng)建的對(duì)象B,無(wú)論是創(chuàng)建還是使用對(duì)象B,控制權(quán)都在自己手上

引入IOC容器之后

對(duì)象A與對(duì)象B之間失去了直接聯(lián)系,當(dāng)對(duì)象A運(yùn)行到需要對(duì)象B的時(shí)候,IOC容器會(huì)主動(dòng)創(chuàng)建一個(gè)對(duì)象B注入到對(duì)象A需要的地方

通過(guò)前后的對(duì)比,不難看出來(lái):對(duì)象A獲得依賴對(duì)象B的過(guò)程,由主動(dòng)行為變?yōu)榱吮粍?dòng)行為,控制權(quán)顛倒過(guò)來(lái)了,這就是"控制反轉(zhuǎn)"這個(gè)名稱的由來(lái)

全部對(duì)象的控制權(quán)全部上繳給"第三方"IOC容器,所以,IOC容器成了整個(gè)系統(tǒng)的關(guān)鍵核心,它起到了一種類似“粘合劑,固體膠”的作用,把系統(tǒng)中的所有對(duì)象粘合在一起發(fā)揮作用, 如果沒(méi)有這個(gè)"粘合劑",對(duì)象與對(duì)象之間會(huì)彼此失去聯(lián)系,這就是有人把IOC容器比喻成“粘合劑”的由來(lái)

3.依賴注入

“獲得依賴對(duì)象的過(guò)程被反轉(zhuǎn)了"??刂票环崔D(zhuǎn)之后,獲得依賴對(duì)象的過(guò)程由自身管理變?yōu)榱擞蒊OC容器主動(dòng)注入。依賴注入是實(shí)現(xiàn)IOC的方法,就是由IOC容器在運(yùn)行期間,動(dòng)態(tài)地將某種依賴關(guān)系注入到對(duì)象之中(下面詳說(shuō))

四.Bean的實(shí)例化

以Dao層代表持久層,Service層代表業(yè)務(wù)層來(lái)舉例

1.無(wú)參構(gòu)造

在Bean中存在默認(rèn)無(wú)參構(gòu)造函數(shù)的情況下,根據(jù)默認(rèn)無(wú)參構(gòu)造方法來(lái)創(chuàng)建對(duì)象,就像這樣:

<bean id="userDao" class="yu7daily.dao.impl.UserDaoImpl"/>

2.工廠靜態(tài)方法

①首先寫好配置文件

<bean id="userDao" class="yu7daily.factory.StaticFactory" factory-method="getUserDao"></bean>

②工廠的靜態(tài)方法返回Bean的實(shí)例

public class StaticFactory {
    public static UserDao getUserDao(){ return new UserDaoImpl(); }
}

3.工廠實(shí)例方法(常用)

配置好工廠的Bean

<bean id="factory" class="yu7daily.factory.DynamicFactory">
<bean id="userDao" factory-bean="factory" factory-method="getUserDao"/>

返回實(shí)例化的Bean對(duì)象

public class DynamicFactory {
    public UserDao getUserDao(){ return new UserDaoImpl(); }
}

由于上述的方式,factory-bean的名稱不固定,不夠簡(jiǎn)便,于是又產(chǎn)生了新的簡(jiǎn)便方法

public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    //代替原始實(shí)例工廠中創(chuàng)建對(duì)象的方法
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }
    public Class<?> getObjectType() {
        return UserDao.class;
    }
}

我還可以通過(guò)public boolean isSingleton() { return true; }來(lái)確定造出的對(duì)象是否為單例(true代表單例)

配置bean也變得簡(jiǎn)單很多

<bean id="userDao" class="yu7daily.factory.UserDaoFactoryBean"/>

五.Bean的依賴注入

他是Spring核心IOC的具體體現(xiàn),簡(jiǎn)言之就是把持久層對(duì)象傳入業(yè)務(wù)層,不用我們自己去new了依賴注入的目的就是降低耦合

依賴注入的前提是寫好Bean配置,和上面的相似,以下就不寫了

1.set注入

set注入可以減少硬編碼問(wèn)題,本質(zhì)是在容器內(nèi)部將一個(gè)類設(shè)置到另一個(gè)類中,就像這樣

而在這里,想要在容器內(nèi)部實(shí)現(xiàn)把B設(shè)置到A中就可以通過(guò)set注入的方式,實(shí)現(xiàn)起來(lái)就是在A類中寫一個(gè)引入B的set方法,就像這樣:

xmlns:p="http://www.springframework.org/schema/p"<bean id="a" class="yu7daily.service.A" p:b-ref="b">
private B b;
public void setB(B b) {
    this.b = b;
   }

這樣的話我們就可以在A中為所欲為地調(diào)用B里的方法啦關(guān)鍵是不用new~

比較起來(lái)看,不用注入依賴的話,我想在A類中調(diào)用B里的方法還需要獲取容器、得到Bean、最后得來(lái)對(duì)象,十分麻煩

2.有參構(gòu)造

和Set注入大同小異,本質(zhì)也是類之間的設(shè)置,只不過(guò)是形式不同而已

private B b;
public A(B b) {
  this.b = b;
  }

六.第一個(gè)Spring案例

①導(dǎo)入開(kāi)發(fā)的基本坐標(biāo)

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.22.RELEASE</version>
        </dependency>
    </dependencies>

②編寫接口和實(shí)現(xiàn)類

③創(chuàng)建Spring核心配置文件

在類路徑中的resources里創(chuàng)建

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

④在Spring配置文件中向bean里添加BookDaoImql和BookServiceImpl

    <!--    配置bean-->
    <!--    id表示給bean起名字,class表示給bean定義類型-->
    <bean id="bookDao1" class="yu7daily.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="yu7daily.service.impl.BookServiceImpl">
        <!--配置service與dao的關(guān)系,也就是數(shù)據(jù)層和業(yè)務(wù)層-->
        <!--        property標(biāo)簽表示配置當(dāng)前bean的屬性-->
        <!--        name屬性表示配置哪一個(gè)具體的屬性-->
        <!--        ref屬性表示參照哪一個(gè)bean-->
        <property name="bookDao" ref="bookDao1"/>
    </bean>

⑤使用Spring的API獲取Bean的實(shí)例

    //獲取ioc容器
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    //獲取bean
    BookDao bookDao = (BookDao) ctx.getBean("bookDao1");
    bookDao.save();
    //獲取service
    BookService bookService = (BookService) ctx.getBean("bookService");
    bookService.save();

運(yùn)行結(jié)果:

到此這篇關(guān)于Spring超詳細(xì)講解IOC與解耦合的文章就介紹到這了,更多相關(guān)Spring IOC與解耦合內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)接口的各種參數(shù)校驗(yàn)的示例

    SpringBoot實(shí)現(xiàn)接口的各種參數(shù)校驗(yàn)的示例

    本文主要介紹了SpringBoot實(shí)現(xiàn)接口的各種參數(shù)校驗(yàn)的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java 細(xì)致圖解帶你分析漢諾塔

    Java 細(xì)致圖解帶你分析漢諾塔

    漢諾塔問(wèn)題是一個(gè)經(jīng)典的問(wèn)題。漢諾塔(Hanoi Tower),又稱河內(nèi)塔,源于印度一個(gè)古老傳說(shuō)。本文將用Java求解這一問(wèn)題,感興趣的可以學(xué)習(xí)一下
    2022-03-03
  • 詳解Spring Cloud Netflix Zuul中的速率限制

    詳解Spring Cloud Netflix Zuul中的速率限制

    這篇文章主要介紹了詳解Spring Cloud Netflix Zuul中的速率限制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Java?CountDownLatch線程同步源碼硬核解析

    Java?CountDownLatch線程同步源碼硬核解析

    對(duì)于并發(fā)執(zhí)行,Java中的CountDownLatch是一個(gè)重要的類。為了更好的理解CountDownLatch這個(gè)類,本文將通過(guò)例子和源碼帶領(lǐng)大家深入解析這個(gè)類的原理,感興趣的可以學(xué)習(xí)一下
    2023-01-01
  • Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之?dāng)?shù)組

    Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之?dāng)?shù)組

    數(shù)組是有序的元素序列,若將有限個(gè)類型相同的變量的集合命名,那么這個(gè)名稱為數(shù)組名。組成數(shù)組的各個(gè)變量稱為數(shù)組的分量,也稱為數(shù)組的元素,有時(shí)也稱為下標(biāo)變量。數(shù)組是在程序設(shè)計(jì)中,為了處理方便, 把具有相同類型的若干元素按有序的形式組織起來(lái)的一種形式
    2022-02-02
  • Activiti流程引擎對(duì)象及配置原理解析

    Activiti流程引擎對(duì)象及配置原理解析

    這篇文章主要介紹了Activiti流程引擎對(duì)象及配置原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Spring boot學(xué)習(xí)教程之快速入門篇

    Spring boot學(xué)習(xí)教程之快速入門篇

    這篇文章主要給大家介紹了關(guān)于Spring boot的相關(guān)資料,本文屬于基礎(chǔ)入門教程,對(duì)各位學(xué)習(xí)Spring boot的新手們具有一定的參考學(xué)習(xí)價(jià)值,,要的朋友們下面來(lái)一起看看吧。
    2017-04-04
  • Springboot啟動(dòng)流程詳細(xì)分析

    Springboot啟動(dòng)流程詳細(xì)分析

    這篇文章主要介紹了SpringBoot啟動(dòng)過(guò)程的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-12-12
  • SpringBoot?項(xiàng)目的創(chuàng)建與啟動(dòng)步驟詳解

    SpringBoot?項(xiàng)目的創(chuàng)建與啟動(dòng)步驟詳解

    這篇文章主要介紹了SpringBoot?項(xiàng)目的創(chuàng)建與啟動(dòng),本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 微服務(wù)SpringBoot整合Jasypt加密工具的場(chǎng)景分析

    微服務(wù)SpringBoot整合Jasypt加密工具的場(chǎng)景分析

    Jasypt是Java加密工具包,能支持對(duì)密碼的哈希加密,對(duì)文本和二進(jìn)制數(shù)據(jù)的對(duì)稱加解密,還能集成SpringBoot項(xiàng)目對(duì)配置文件中的密鑰進(jìn)行加密存儲(chǔ),這篇文章主要介紹了微服務(wù)SpringBoot整合Jasypt加密工具,需要的朋友可以參考下
    2022-10-10

最新評(píng)論