Spring_01 spring容器、控制反轉(IOC)、依賴注入(DI)

目錄

  1 什么是spring框架

  2 spring框架的特點

  3 spring容器

    3.1 什么是spring容器

    3.2 spring容器創建對象的編程步驟

    3.4 spring容器創建對象的方式

    3.5 bean元素的幾個重要屬性

  4 IOC

    4.1 什么是IOC

    4.2 什么事DI

    4.3 DI的三種方式

1 什么是spring框架

  是一個開源的用來簡化企業級應用開發的框架

?

2 spring框架的特點

  2.1?簡化開發

    spring對一些常見的api(比如jdbc)做了封裝,使用這些封裝之后的api,代碼會大大簡化。
  比如,使用springjdbc來訪問數據庫,就不用考慮如何獲取連接,關閉連接等操作。

  2.2 管理對象

    spring可以幫我們管理對象之間的依賴關系,這樣一來, 軟件更容易維護。

  2.3 集成其它框架

    spring可以將一些框架集成進來,更方便使用這些框架。、
  比如,可以利用spring集成mybatis(mybatis是一個用 來訪問數據庫的框架),這樣mybatis用起來更加簡單。?

?

3 spring容器

  3.1 什么是spring容器

    是spring框架當中的一個核心模塊,用來管理對象。

  3.2怎么利用 spring容器 來創建對象

    3.2.1 創建一個 maven項目

      》記得讓maven項目中出現 web.xml 這個配置文件 -->> 還記得咋整嗎?

    3.2.2 導包

      spring-webmvc -->> 啟動 spring容器 時需要用到
      junit -->> 進行單元測試時需要用到

    3.2.3 啟動 spring容器

      》添加一個 spring容器 配置文件

        例:給Student類配置bean,只需在spring的配置文件中添加

          <bean id="stu" class="test.Student"></bean>

            id : 必須要保證唯一

            class:就是需要配置bean的類名,但是必須在前面加上 包名.
      》利用 ApplicationContext 的實現類 ClassPathXmlApplicationContext 去啟動容器

    3.2.4 利用 getBean(String name, Class<T> requiredType) 來實例化對象

      注意:spring容器會利用相關類的無參構造器去創建實例,所以相關類中必須要有無參構造器,否則會報錯:“找不到無參構造器”

       

  3.3 注意

    spring容器一旦啟動,就會在 堆 中將所有配置了 bean 的類創建好一個實例

 1 package test;
 2 
 3 import java.io.Serializable;
 4 
 5 public class Student implements Serializable {
 6     private Integer id;
 7     private String name;
 8     private String gender;
 9     
10     
11     public Student() {
12         super();
13         System.out.println("New Student()");
14     }
15     public Integer getId() {
16         return id;
17     }
18     public void setId(Integer id) {
19         this.id = id;
20     }
21     public String getName() {
22         return name;
23     }
24     public void setName(String name) {
25         this.name = name;
26     }
27     public String getGender() {
28         return gender;
29     }
30     public void setGender(String gender) {
31         this.gender = gender;
32     }
33     
34     public String toString() {
35         return "Student [id=" + id + ", name=" + name + ", gender=" + gender + "]";
36     }
37     
38 }
Student類
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans" 
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context" 
 5     xmlns:jdbc="http://www.springframework.org/schema/jdbc"  
 6     xmlns:jee="http://www.springframework.org/schema/jee" 
 7     xmlns:tx="http://www.springframework.org/schema/tx"
 8     xmlns:aop="http://www.springframework.org/schema/aop" 
 9     xmlns:mvc="http://www.springframework.org/schema/mvc"
10     xmlns:util="http://www.springframework.org/schema/util"
11     xmlns:jpa="http://www.springframework.org/schema/data/jpa"
12     xsi:schemaLocation="
13         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
14         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
15         http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
16         http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
17         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
18         http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
19         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
20         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
21         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
22     
23     <bean id="stu" class="test.Student"></bean>
24     
25 </beans>
test.xml配置文件
 1 package test;
 2 
 3 import java.io.Serializable;
 4 
 5 import org.springframework.context.ApplicationContext;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 public class Test implements Serializable {
 9     public static void main(String[] args) {
10         ApplicationContext ac = new ClassPathXmlApplicationContext("test.xml");
11         System.out.println(ac);
12         
13         Student stu1 = ac.getBean("stu", Student.class);
14         System.out.println(stu1);
15     }
16 }
Test類

?

  3.4spring容器 實例化對象的三種方法

    3.4.1?利用無參構造器實現(很重要)?

      必須有無參構造器,如果已經添加了有參構造器,那么默認的無參構造器就會被覆蓋;此時就需要手動添加一個無參構造器

    3.4.2?利用靜態工廠方法實現(了解)

    3.4.3?利用實例化工廠方法實現(了解)

?  3.5 bean元素的幾個重要屬性

    3.5.1 作用域

      scope 屬性 : 用來指定作用域

      缺省值是 singleton(單例),如果值是prototype(原型),則可以創建多個對象,否則不可以

      我們一般使用 單例模式 就可以啦(即:默認值)

    3.5.2?生命周期

      初始化

        init-method屬性:指定初始化方法

      銷毀

        destroy-method屬性:指定銷毀方法

        只有作用域為單例的 bean, 銷毀方法才有效

        必須使用這個spring容器接口:AbstractApplicationContext

    3.5.3 延遲加載

      默認情況下當 spring容器 啟動之后,會將所有作用域為單例的 bean 都創建好

      lazy-init屬性:指定是否延遲加載,值為 true 時延遲加載(一般不用延遲加載)

?

4 IOC(Inversion Of Controll 控制反轉)

  4.1 什么事IOC

    對象之間的依賴關系交給容器來管理。

  4.2?什么是DI (Dependency Injection 依賴注入)

    容器通過調用set方法或者構造器來建立對象之間的依賴關系

    注:IOC是目標,而DI是手段

?

  4.3DI 注入的兩種方式

    4.3.1?利用 set 方法完成依賴注入(掌握)

      注入類中必須有一個成員變量,該成員變量的類型必須是被依賴注入的類

      注入類中必須實現需要注入的那個成員變量的 set 方法

      set 方法進行依賴注入時,在配置文件中用到的是 property標簽;如果需要注入的類中有有參構造器,那么必須實現無參構造器,因為有參構造器會覆蓋無參構造器(注意:菜鳥一般吧無參構造器和有參構造器都實現)

      注意:注入類中那個成員變量的類型 一般都設定為被注入類的一個接口,這樣有利于今后進行維護

      利用 property標簽實現依賴注入

        <property name="stu" ref="student01"></property>

          name:需要依賴注入的成員變量

          ref:需要依賴注入類的id屬性值

?

      

      圖解:創建A的實例,而且B是注入到A中的;B類中必須實現無參構造器,A中必須添加一個類型為B的成員變量,而且還必須為該成員變量實現set方法,在spring配置文件中配置A和B的bean,而且在A的bean中還要利用property標簽來實現B的依賴注入

    4.3.2?利用有參構造器完成依賴注入(掌握)

      這里的構造器是有參構造器,但是它的參數這是你需要注入的參數名,不包含其他的

?

      利用constructor-arg標簽實現依賴注入

        <constructor-arg index="0" ref="b1"/>

          index:有參構造器中參數的位置,從0開始

          ref:依賴注入類的id屬性值

      

      圖解:創建A的實例,而且B是注入到A中的;B類中必須實現無參構造器,A中必須添加一個類型為B的成員變量;為A添加一個有參構造器,而且該有參構造器的參數只是你要注入的那個成員變量,不包含其他的;而且該有參構造器任然會覆蓋無參構造器,所以如果想要使用無參構造器就必須先實現無參構造器;在spring的配置文件中配置A和B的bean,而且還需要用constructor-arg標簽實現B的依賴注入

?

    4.3.3?自動裝配(一般不用)

    注意:依賴注入一般都由注釋實現

?

源代碼鏈接:點擊前往

轉載于:https://www.cnblogs.com/NeverCtrl-C/p/6849543.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254606.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254606.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254606.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EntityFramework 插件之EntityFramework.Extended (批量處理)

接手了一個用EF來做的項目&#xff0c;由于項目中使用的原生處理&#xff0c;導致很多update都是采用先select 后 update的方式來實現&#xff0c;同時無法批量執行邏輯如&#xff1a;根據訂單類型統一更新狀態等。所以在經過了N多查找之后 發現了一個國外寫的擴展插件EntityFr…

一個傳值的問題”*”與”*”

1/********************************************************* 2* Desc:參數傳遞&#xff1a;使用引用傳遞指針和直接傳遞指針地址的區別 3* Author:charley 4* DateTime:2010-12-7 11:00 02***********************************************************/ 03#include <…

Classification分類halcon算子,持續更新

目錄ClassificationGaussian Mixture Models高斯混合模型add_class_train_data_gmmadd_sample_class_gmmclassify_class_gmmclear_class_gmmclear_samples_class_gmmcreate_class_gmmdeserialize_class_gmmevaluate_class_gmmget_class_train_data_gmmget_params_class_gmmget_…

spring boot 擴展之AutoConfigurationImportListener

最近閱讀spring boot源碼時發現&#xff0c;發現當spring使用ConfigurationClassParser加載使用Configuration注解類后&#xff0c;會使用AutoConfigurationImportSelector對加載的 Configuration注解的類進行一次過濾。當AutoConfigurationImportSelector過濾完成后會自動加載…

classpath: spring 中的查找方式

Spring可以通過指定classpath*:與classpath:前綴加路徑的方式從classpath加載文件,如bean的定義文件.classpath*:的出現是為了從多個jar文件中加載相同的文件.classpath:只能加載找到的第一個文件. 比如 resource1.jar中的package com.test.rs 有一個 jarAppcontext.xml 文件,內…

《高效程序員的45個習慣》-之一

敏捷開發是當下最流行的開發方法&#xff0c;它采用的是一種以人為核心、迭代、循序漸進的開發思想&#xff0c;值得你關注和學習。 最近我就閱讀了一本有關敏捷開發的書籍&#xff0c;《高效程序員的45個習慣》。 它以“舉反例”的方式來講述了敏捷開發中程序員應該運用的…

教你如何在 elasticsearch 中重建索引

序言 Elasticsearch 是一個實時的分布式搜索分析引擎。Teambition 使用 Elastisearch 作為搜索引擎&#xff0c;為用戶提供搜索服務&#xff0c;當我們決定存儲某種數據時&#xff0c;我們需要使用PUT /teambition創建索引&#xff0c;在創建索引的時候需要將數據結構完整確定下…

halcon控制算子Control,持續更新

目錄Controlassignassign_atbreakcasecatchcommentcontinueconvert_tuple_to_vector_1dconvert_vector_to_tupledefaultelseelseifendforendifendswitchendtryendwhileexecutable_expressionexitexport_defforglobalififelseimportinsertpar_joinrepeatreturnstopswitchthrowtr…

《CLR via C#》之線程處理——線程基礎

《CLR via C#》之線程處理——線程基礎 《CLR via C#》之線程處理——線程基礎windows為什么要支持線程線程開銷CPU發展趨勢CLR線程和Windows線程使用專用線程執行異步的計算限制操作線程調度和優先級windows為什么要支持線程 早期的操作系統只有一個執行線程&#xff0c;但同時…

《高效程序員的45個習慣》-之二

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之一。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

MIME Type的介紹

轉載自&#xff1a; http://www.cnblogs.com/jsean/articles/1610265.html 一、 首先&#xff0c;我們要了解瀏覽器是如何處理內容的。在瀏覽器中顯示的內容有 HTML、有 XML、有 GIF、還有 Flash ……那么&#xff0c;瀏覽器是如何區分它們&#xff0c;決定什么內容用什么形式來…

spring boot之從零開始開發自己的網站

概述 首先要感謝兩位大神&#xff0c;該項目的想法來源自tale和MyBlog。 做了一些改造&#xff0c;增加了一些功能和一些代碼的重構&#xff0c;并且更換了博客主題。 關于項目&#xff0c;對于開發的練手項目&#xff0c;能夠工程化&#xff0c;嚴謹一些。 關于文檔&#x…

halcon深度學習算子,持續更新

目錄Deep Learning 深度學習Classification&#xff1a;分類apply_dl_classifierclear_dl_classifierclear_dl_classifier_resultclear_dl_classifier_train_resultdeserialize_dl_classifierget_dl_classifier_paramget_dl_classifier_resultget_dl_classifier_train_resultre…

python day5--正則表達式

#----正則表達式 import re elink <a href"(.*)">(.*)</a> info <a href"http://www.baidu.com">baidu</a> cinfo re.findall(elink,info) print (cinfo) import re print(re.search (r^a,abc\neee)) #預期結果 ^匹配字符開…

WCF系列教程之WCF客戶端調用服務

1、創建WCF客戶端應用程序需要執行下列步驟 (1)、獲取服務終結點的服務協定、綁定以及地址信息 (2)、使用該信息創建WCF客戶端 (3)、調用操作 (4)、關閉WCF客戶端對象 二、操作實例 1、WCF服務層搭建:新建契約層、服務層、和WCF宿主,添加必須的引用(這里不會的參考本人前面的隨…

《高效程序員的45個習慣》-之三

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之二。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

負載均衡的那些事?

什么是負載均衡&#xff1f;1、負載&#xff1a;就是后端系統的承載能力。比如同等條件下&#xff0c;一個1核cpu-1G內存的機器的承載能力一般會比8核cpu-8G內存的機器要差&#xff1b;相同配置下&#xff0c;一個cpu利用率為80%的機器比30%的承載能力一般要差等等。2、均衡&am…

Develop內部函數,持續更新

Develop內部函數 目錄Develop內部函數dev_clear_objdev_clear_windowdev_close_inspect_ctrldev_close_tooldev_close_windowdev_disp_textdev_displaydev_error_vardev_get_exception_datadev_get_preferencesdev_get_systemdev_get_windowdev_inspect_ctrldev_map_pardev_map…

短信認證方案,用手機短信進行上網認證如何實現?

WFilter NGF的“Web認證”模塊&#xff0c;提供了一系列的上網認證解決方案。包括如下認證方式&#xff1a;本地用戶名密碼認證AD域用戶名密碼認證企業郵箱用戶名密碼認證Radius用戶名密碼認證微信WiFi認證Facebook Wifi認證除此&#xff0c;WFilter NGF還有一個“其他”的選項…

《高效程序員的45個習慣》-末篇

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之三。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…