最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring超詳細講解IOC與解耦合

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

前言

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

一.所謂耦合

個人建議:學習Spring之前要多寫原生的OOP項目,充分體會層之間、類之間的聯(lián)系才能深刻理解Spring的特色

在項目開發(fā)中,對象之間的耦合度就是多個對象間的依賴性、關(guān)聯(lián)性。對象之間的耦合越高,維護成本越高,因此對象的設計應使類和類之間的耦合最小

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

二.Spring

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

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

三.核心IOC理解

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

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

1.容器

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

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

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

2.控制反轉(zhuǎn)

沒有引入IOC容器之前

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

引入IOC容器之后

對象A與對象B之間失去了直接聯(lián)系,當對象A運行到需要對象B的時候,IOC容器會主動創(chuàng)建一個對象B注入到對象A需要的地方

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

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

3.依賴注入

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

四.Bean的實例化

以Dao層代表持久層,Service層代表業(yè)務層來舉例

1.無參構(gòu)造

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

<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的實例

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

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

配置好工廠的Bean

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

返回實例化的Bean對象

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

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

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

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

配置bean也變得簡單很多

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

五.Bean的依賴注入

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

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

1.set注入

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

而在這里,想要在容器內(nèi)部實現(xiàn)把B設置到A中就可以通過set注入的方式,實現(xiàn)起來就是在A類中寫一個引入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~

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

2.有參構(gòu)造

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

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

六.第一個Spring案例

①導入開發(fā)的基本坐標

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

②編寫接口和實現(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è)務層-->
        <!--        property標簽表示配置當前bean的屬性-->
        <!--        name屬性表示配置哪一個具體的屬性-->
        <!--        ref屬性表示參照哪一個bean-->
        <property name="bookDao" ref="bookDao1"/>
    </bean>

⑤使用Spring的API獲取Bean的實例

    //獲取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();

運行結(jié)果:

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

相關(guān)文章

  • 理解Java多線程之并發(fā)編程

    理解Java多線程之并發(fā)編程

    這篇文章主要介紹了理解Java多線程之并發(fā)編程的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Java 程序員容易犯的10個SQL錯誤

    Java 程序員容易犯的10個SQL錯誤

    本文介紹了Java 程序員容易犯的10個SQL錯誤。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • springboot如何為web層添加統(tǒng)一請求前綴

    springboot如何為web層添加統(tǒng)一請求前綴

    這篇文章主要介紹了springboot如何為web層添加統(tǒng)一請求前綴,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java中ClassLoader類加載學習總結(jié)

    Java中ClassLoader類加載學習總結(jié)

    本篇文章主要給大家講述了Java中ClassLoader類加載的原理以及用法總結(jié),一起學習下。
    2017-12-12
  • Spring中Eureka的自我保護詳解

    Spring中Eureka的自我保護詳解

    這篇文章主要介紹了Spring中Eureka的自我保護詳解,當Eureka Server節(jié)點在短時間內(nèi)丟失過多客戶端時(可能發(fā)生了網(wǎng)絡分區(qū)故障),那么這個節(jié)點就會進入自我保護模式,一旦進入該模式,Eureka Server就會保護服務注冊表中的信息,需要的朋友可以參考下
    2023-11-11
  • Spring Boot配置線程池拒絕策略的場景分析(妥善處理好溢出的任務)

    Spring Boot配置線程池拒絕策略的場景分析(妥善處理好溢出的任務)

    本文通過實例代碼給大家介紹下如何為線程池配置拒絕策略、如何自定義拒絕策略。對Spring Boot配置線程池拒絕策略的相關(guān)知識感興趣的朋友一起看看吧
    2021-09-09
  • 2022?最新?IntelliJ?IDEA?詳細配置步驟演示(推薦)

    2022?最新?IntelliJ?IDEA?詳細配置步驟演示(推薦)

    作為一名開發(fā)人員,第一肯定是選擇一款趁手的開發(fā)利器,本人使用?Java?偏多,這里推薦使用?IntelliJ?IDEA,?俗稱神級開發(fā)工具,具體的安裝過程就不過多贅述了,有需要了解的朋友可以參考下本文
    2022-09-09
  • SpringBoot?整合數(shù)據(jù)源的具體實踐

    SpringBoot?整合數(shù)據(jù)源的具體實踐

    本文主要介紹了SpringBoot?整合數(shù)據(jù)源的具體實踐,利用?Spring?Boot?的自動配置和簡化的注解來簡化數(shù)據(jù)源配置工作,從而更專注于應用程序的業(yè)務邏輯開發(fā),感興趣的可以了解一下
    2023-11-11
  • mybatis如何使用Java8的日期LocalDate和LocalDateTime詳解

    mybatis如何使用Java8的日期LocalDate和LocalDateTime詳解

    這篇文章主要給大家介紹了關(guān)于mybatis如何使用Java8的日期LocalDate和LocalDateTime的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • java中List集合及其實現(xiàn)類的方法詳解

    java中List集合及其實現(xiàn)類的方法詳解

    本篇文章給大家?guī)淼膬?nèi)容是關(guān)于java中List集合及其實現(xiàn)類的方法介紹(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。下面我們就來學習一下吧
    2019-06-06

最新評論

龙山县| 定安县| 来凤县| 佛坪县| 涟水县| 石泉县| 会理县| 封丘县| 东港市| 衡东县| 彰武县| 利川市| 乌兰县| 来安县| 河源市| 敦煌市| 汶川县| 萝北县| 常山县| 石城县| 连江县| 揭西县| 永德县| 莎车县| 观塘区| 尚义县| 昆明市| 维西| 大厂| 余庆县| 台江县| 金乡县| 华阴市| 祥云县| 宜昌市| 搜索| 华蓥市| 大渡口区| 永康市| 西乌| 青州市|