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

深入了解Spring控制反轉(zhuǎn)IOC原理

 更新時(shí)間:2022年08月09日 16:47:34   作者:夢西洲@  
IOC-Inversion?of?Control,即控制反轉(zhuǎn)。它不是什么技術(shù),而是一種設(shè)計(jì)思想。這篇文章將為大家介紹一下Spring控制反轉(zhuǎn)IOC的原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、什么是Spring IOC容器

Spring是包含眾多工具的IoC容器,控制反轉(zhuǎn)即IoC,它有兩個(gè)核心的功能:

①將對象(Bean)存儲(chǔ)在容器(Spring)

②將對象(Bean)從容器(Spring)中取出來

【擴(kuò)展:將對象存放到容器中的好處】

將對象存儲(chǔ)在 IoC 容器相當(dāng)于將以后可能?的所有工具制作好都放到倉庫中,需要的時(shí)候直接取就行了,用完再把它放回到倉庫。而new 對象的方式相當(dāng)于,每次需要工具了,才現(xiàn)做,用完就扔掉了也不會(huì)保存,下次再用的時(shí)候還得重新做,這就是 IoC 容器和普通程序開發(fā)的區(qū)別

二、IOC有哪些優(yōu)點(diǎn)

IOC 或 依賴注入把應(yīng)用的代碼量降到最低

它使應(yīng)用容易測試,單元測試不再需要單例和JNDI查找機(jī)制

最小的代價(jià)和最小的侵入性使松散耦合得以實(shí)現(xiàn)

IOC容器支持加載服務(wù)時(shí)的餓漢式初始化和懶加載

三、控制反轉(zhuǎn)(IOC)有什么作用

將創(chuàng)建對象的控制權(quán)交給Spring的IoC,以前需要程序員自己控制對象創(chuàng)建,現(xiàn)在交給Spring的IoC創(chuàng)建,如果需要使用需要通過DI(依賴注入)@Autowired自動(dòng)注入

解耦,由容器去維護(hù)具體的對象,降低耦合度

【擴(kuò)展:什么是解耦,代碼示例】

解耦指的是解決了代碼的耦合性,耦合性也可以換?種叫法叫程序相關(guān)性。這就好比我們打造?輛完整的汽車,如果所有的配件都是自己造,那么當(dāng)客戶需求發(fā)生改變的時(shí)候,比如輪胎的尺寸不再是原來的尺寸了,那我們要自己動(dòng)手來改了,但如果我們是把輪胎外包出去,那么即使是輪胎的尺寸發(fā)生變變了,我們只需要向代理工廠下訂單就行了,我們自身身是不需要出力的

在傳統(tǒng)的代碼中對象創(chuàng)建順序是:Car -> Framework -> Bottom -> Tire

改進(jìn)之后解耦的代碼的對象創(chuàng)建順序是:Tire -> Bottom -> Framework -> Car

public class IocCarExample {
   public static void main(String[] args) {
     Tire tire = new Tire(20);
     Bottom bottom = new Bottom(tire);
     Framework framework = new Framework(bottom);
     Car car = new Car(framework);
     car.run();
  }
  //車類,把創(chuàng)建?類的?式,改為注?傳遞的?式
  static class Car {
    private Framework framework;
    public Car(Framework framework) {
      this.framework = framework;
    }
    public void run() {
      framework.init();
    }
  }
  //車身類
  static class Framework {
    private Bottom bottom;
    public Framework(Bottom bottom) {
      this.bottom = bottom;
    }
    public void init() {
    bottom.init();
    }
  }

四、IoC和DI有什么區(qū)別

IoC:控制反轉(zhuǎn),由主動(dòng)new產(chǎn)生對象(耦合過高)轉(zhuǎn)換成從外部提供對象,就是將對象的創(chuàng)建控制權(quán)從程序轉(zhuǎn)移到了外部

DI:依賴注入,就是在程序運(yùn)行期間,自動(dòng)的將一個(gè)對象從Spring拿出來給當(dāng)前類使用

區(qū)別:

IoC 是“目標(biāo)”也是?種思想,而目標(biāo)和思想只是?種指導(dǎo)原則,而 DI 就是具體的實(shí)現(xiàn)

例如:比如說我今天心情比較好,吃?頓好的犒勞犒勞自己,那么“吃?頓好的”是思想和目標(biāo)(是 IoC),但最后我是吃海底撈,這就是具體的實(shí)現(xiàn),就是 DI

五、Spring IoC的實(shí)現(xiàn)機(jī)制

1. 簡單工廠:通過一個(gè)方法傳入一個(gè)標(biāo)識(shí),生產(chǎn)對應(yīng)對象

工廠模式案例:

public static void main(String[] arge){
  // 調(diào)用工廠方法,根據(jù)傳入?yún)?shù),返回一個(gè)對象
  BaseService  userService = Factory.getBean("user");
}
class Factory{
  public static BaseService getBean(String beanName){
      if("user".equals(beanName)){
         return = new UserServiceImpl();
      }
      if("role".equals(beanName)){
         return = new RoleServiceImpl();
      }
   }
}

2.反射:反射就是在工廠模式getBean()方法中通過反射的方式來創(chuàng)建Bean

class Factory {
    public static Fruit getInstance(String ClassName) {
        Fruit f=null;
        try {
            f=(Fruit)Class.forName(ClassName).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return f;
    }
}

【擴(kuò)展:反射是什么,反射的實(shí)現(xiàn)原理】

反射機(jī)制是在運(yùn)行的狀態(tài),對于任何一個(gè)類,都能知道所有屬性和方法,對于任何一個(gè)對象都能調(diào)用任意方法屬性,所以反射就是將Java類的各種成分映射成一個(gè)個(gè)對象

①通過Class類的靜態(tài)方法:forName(String className)(常用)獲取Class對象

 try {
   Class stuClass3 = Class.forName("fanshe.Student");//注意此字符串必須是真實(shí)路徑,就是帶包名的類路徑,包名.類名
   System.out.println(stuClass3 == stuClass2);//判斷三種方式是否獲取的是同一個(gè)Class對象
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }

②通過反射獲取構(gòu)造方法并使用:

public class Student {
  //---------------構(gòu)造方法-------------------
 //(默認(rèn)的構(gòu)造方法)
 Student(String str){
  System.out.println("(默認(rèn))的構(gòu)造方法 s = " + str);
 }
 //無參構(gòu)造方法
 public Student(){
  System.out.println("調(diào)用了公有、無參構(gòu)造方法執(zhí)行了。。。");
 }
 
 //有一個(gè)參數(shù)的構(gòu)造方法
 public Student(char name){
  System.out.println("姓名:" + name);
 }
 //有多個(gè)參數(shù)的構(gòu)造方法
 public Student(String name ,int age){
  System.out.println("姓名:"+name+"年齡:"+ age);//這的執(zhí)行效率有問題,以后解決。
 }
 //受保護(hù)的構(gòu)造方法
 protected Student(boolean n){
  System.out.println("受保護(hù)的構(gòu)造方法 n = " + n);
 }
 //私有構(gòu)造方法
 private Student(int age){
  System.out.println("私有的構(gòu)造方法   年齡:"+ age);
 }
 
}

六、IoC支持哪些功能

Spring 的 IoC 設(shè)計(jì)支持以下功能:

1.依賴注入

2.依賴檢查

3.自動(dòng)裝配

4.支持集合

5.指定初始化方法和銷毀方法

6.支持回調(diào)某些方法(但是需要實(shí)現(xiàn) Spring 接口,略有侵入)

其中,最重要的就是依賴注入,從 XML 的配置上說,即 ref 標(biāo)簽。對應(yīng) Spring RuntimeBeanReference 對象。

對于 IoC 來說,最重要的就是容器。容器管理著 Bean 的生命周期,控制著 Bean 的依賴注入

【擴(kuò)展:解釋Bean周期】下篇博客詳細(xì)介紹

七、BeanFactory和ApplicationContext有什么區(qū)別

首先創(chuàng)建Spring上下文的時(shí)候,會(huì)使用BeanFactory和ApplicationContext兩種方法

//先得到Spring上下文
  ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");//配置文件對應(yīng)
 // 先得到 spring 獲取 bean 的對象
  BeanFactory beanFactory =
                new XmlBeanFactory(new ClassPathResource("spring-config.xml"));

共同點(diǎn):BeanFactory和ApplicationContext是Spring的兩大核心接口,都可以當(dāng)做Spring的容器。其中ApplicationContext是BeanFactory的子接口

區(qū)別:

①繼承關(guān)系和功能:ApplicationContext是BeanFactory的子類,BeanFactory只是提供了基礎(chǔ)操作Bean的方法,ApplicationContext除了繼承了 BeanFactory 的所有功能之外,它還擁有獨(dú)特的特性,還添加了對國際化?持,資源訪問?持等

②性能:ApplicationContext 是?次性加載并初始化所有的 Bean 對象,而 BeanFactory是需要那個(gè)才去加載那個(gè),因此更加輕量

八、ApplicationContext通常的實(shí)現(xiàn)是什么

FileSystemXmlApplicationContext :此容器從一個(gè)XML文件中加載beans的定義,XML Bean 配置文件的全路徑名必須提供給它的構(gòu)造函數(shù)

ClassPathXmlApplicationContext:此容器也從一個(gè)XML文件中加載beans的定義,這里,你需要正確設(shè)置classpath因?yàn)檫@個(gè)容器將在classpath里找bean配置

WebXmlApplicationContext:此容器加載一個(gè)XML文件,此文件定義了一個(gè)WEB應(yīng)用的所有bean

九、依賴注入的方式,構(gòu)造器依賴注入和 Setter方法注入的區(qū)別

依賴注入是時(shí)下最流行的IoC實(shí)現(xiàn)方式,依賴注入分為接口注入,Setter方法注入,和構(gòu)造器注入,三種方式。其中接口注入由于在靈活性和易用性比較差,現(xiàn)在從Spring4開始已被廢棄

1.構(gòu)造器注入

將被依賴對象通過構(gòu)造函數(shù)的參數(shù)注入給依賴對象,并且在初始化對象的時(shí)候注入。優(yōu)點(diǎn):對象初始化完成后便可獲得可使用的對象。

缺點(diǎn):當(dāng)需要注入的對象很多時(shí),構(gòu)造器參數(shù)列表將會(huì)很長;不夠靈活。若有多種注入方式,每種方式只需注入指定幾個(gè)依賴,那么就需要提供多個(gè)重載的構(gòu)造函數(shù),麻煩

2.setter方法注入

lOC Service Provider通過調(diào)用成員變量提供的setter函數(shù)將被依賴對象注入給依賴類優(yōu)點(diǎn):靈活,可以選擇性地注入需要的對象

缺點(diǎn):依賴對象初始化完成后由于尚未注入被依賴對象,因此還不能使用

3.接口注入

依賴類必須要實(shí)現(xiàn)指定的接口,然后實(shí)現(xiàn)該接口中的一個(gè)函數(shù),該函數(shù)就是用于依賴注入。該函數(shù)的參數(shù)就是要注入的對象

優(yōu)點(diǎn):接口注入中,接口的名字、函數(shù)的名字都不重要,只要保證函數(shù)的參數(shù)是要注入的對象類型即可。缺點(diǎn):侵入行太強(qiáng),不建議使用

【擴(kuò)展:什么是侵入性?】

如果類A要使用月別人提供的一個(gè)功能,若為了使用這功能,需要在自己的類中增加額外的代碼,這就是侵入性

區(qū)別:

十、依賴注入的基本原則和優(yōu)點(diǎn)

依賴注入的基本原則:

應(yīng)用組件不應(yīng)該負(fù)責(zé)查找資源或者其他依賴的協(xié)作對象。配置對象的工作應(yīng)該由IoC容器負(fù)責(zé),“查找資源”的邏輯應(yīng)該從應(yīng)用組件的代碼中抽取出來,交給IoC容器負(fù)責(zé)。容器全權(quán)負(fù)責(zé)組件的裝配,它會(huì)把符合依賴關(guān)系的對象通過屬性(JavaBean中的setter)或者是構(gòu)造器傳遞給需要的對象

優(yōu)勢:

①查找定位操作與應(yīng)用代碼完全無關(guān)

②不依賴于容器的API,可以很容易地在任何容器以外使用應(yīng)用對象

③不需要特殊的接口,絕大多數(shù)對象可以做到完全不必依賴容器

以上就是深入了解Spring控制反轉(zhuǎn)IOC原理的詳細(xì)內(nèi)容,更多關(guān)于Spring控制反轉(zhuǎn)IOC的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MyBatis源碼分析之日志logging詳解

    MyBatis源碼分析之日志logging詳解

    這篇文章主要給大家介紹了關(guān)于MyBatis源碼分析之日志logging的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 用攔截器修改返回response,對特定的返回進(jìn)行修改操作

    用攔截器修改返回response,對特定的返回進(jìn)行修改操作

    這篇文章主要介紹了用攔截器修改返回response,對特定的返回進(jìn)行修改操作。具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • springboot打包部署到linux服務(wù)器的方法

    springboot打包部署到linux服務(wù)器的方法

    這篇文章主要介紹了springboot打包部署到linux服務(wù)器的方法,通過實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • SpringBoot中的攔截器細(xì)節(jié)解析

    SpringBoot中的攔截器細(xì)節(jié)解析

    這篇文章主要介紹了SpringBoot中的攔截器細(xì)節(jié)解析,攔截器的概念、作用、實(shí)現(xiàn)方式、執(zhí)行順序、生命周期以及高級(jí)應(yīng)用,最后,我們還將探討攔截器的性能優(yōu)化策略和常見問題,需要的朋友可以參考下
    2023-09-09
  • java使用xpath解析xml示例分享

    java使用xpath解析xml示例分享

    XPath基于XML的樹狀結(jié)構(gòu),提供在數(shù)據(jù)結(jié)構(gòu)樹中找尋節(jié)點(diǎn)的能力,下面是一小示例,需要的朋友可以參考下
    2014-03-03
  • Java中的Kafka攔截器詳解

    Java中的Kafka攔截器詳解

    這篇文章主要介紹了Java中的Kafka攔截器詳解,Producer?攔截器(interceptor)是在?Kafka?0.10?版本被引入的,主要用于實(shí)現(xiàn)?clients?端的定制化控制邏輯,需要的朋友可以參考下
    2023-11-11
  • Java最長公共子序列示例源碼

    Java最長公共子序列示例源碼

    這篇文章主要介紹了Java最長公共子序列的定義及示例源代碼,具有一定參考價(jià)值,需要的朋友可以看下。
    2017-09-09
  • Java實(shí)現(xiàn)簡單GUI登錄和注冊界面

    Java實(shí)現(xiàn)簡單GUI登錄和注冊界面

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡單GUI登錄和注冊界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 解決kafka消息堆積及分區(qū)不均勻的問題

    解決kafka消息堆積及分區(qū)不均勻的問題

    這篇文章主要介紹了解決kafka消息堆積及分區(qū)不均勻的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring與Mybatis的整合方法有哪些

    Spring與Mybatis的整合方法有哪些

    本文主要給大家介紹Spring與Mybatis的三種常用整合方法,需要用到的整合框架包mybatis-spring.jar,對spring mybatis整合感興趣的朋友可以參考下本文
    2015-10-10

最新評論