1. 程式人生 > >Spring框架介紹和IoC容器中Bean配置(Spring框架)

Spring框架介紹和IoC容器中Bean配置(Spring框架)

Spring框架整理第一發,Spring框架介紹,HelloWorld,IoC容器介紹,Bean配置 Spring概述      ①Spring為簡化企業級開發而生,使用Spring,JavaBean就可以實現很多以前要靠EJB才能實現的功能。同樣的功能,在EJB中要通過繁瑣的配置和複雜的程式碼才能夠實現,而在Spring中卻非常的優雅和簡潔。      ②Spring是一個開源的IoC(DI)和AOP容器框架。      ③Spring的優良特性      [1]非侵入式:基於Spring開發的應用中的物件可以不依賴於Spring的API      [2]依賴注入:DI——Dependency Injection,反轉控制(IoC)最經典的實現。      [3]面向切面程式設計:Aspect Oriented Programming——AOP      [4]容器:Spring是一個容器,因為它包含並且管理應用物件的生命週期      [5]元件化:Spring實現了使用簡單的元件配置組合成一個複雜的應用。在 Spring 中可以使用XML和Java註解組合這些物件。      [6]一站式:在IoC和AOP的基礎上可以整合各種企業應用的開源框架和優秀的第三方類庫(實際上Spring 自身也提供了表述層的SpringMVC和持久層的Spring JDBC)。

小結:Spring框架完全改變了我們以往獲取物件的方式,專案中所有的物件都由Spring框架統一管理,我們在需要的時候只需要從容器中拿,不需要自己建立。同時Spring框架提供的宣告式事務也給我們事務管理帶來了極大的方便。同時從上圖可以看出Spring框架是分模組的這樣我們在使用的時候就可以自行組裝。

Spring-HelloWorld

     ①匯入核心包(CoreContainer)        
spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jar
  還有一個依賴的日誌包 commons-logging-1.1.3.jar
     ②準備一個JavaBean
publicclassBook { privateStringtitle; privateStringauthor; privatedoubleprice;     無參/有參構造器
    get/set方法
 }
     ③編寫配置檔案             applicationContext.xml(使用set方法注入),這個檔案需要放到類路徑下,方便測試。 <bean id="book" class="com.java.bean.Book">     <property name="title" value="明天會更好"></property> </bean>      ④測試(使用Junit4測試) package com.java.bean; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class IOCTest {     @Test     public void test() {         //獲取ioc容器         ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");         //根據id獲取到bean物件         Object bean = ioc.getBean("book");         System.out.println(bean);     } }  HelloWorld分析:      ①注意:要匯入依賴包 commons-logging-1.1.3.jar
                  準備一個JavaBean類      ②配置檔案的編寫             <bean>標籤  id任意設定,用於從容器中獲取元件,一般為類名小寫                                  class全類名             <property>子標籤設定物件的屬性(Spring框架會根據這個配置幫你建立物件)               它是使用set方法注入      ③測試               通過ClassPathXmlApplicationContext獲取IoC容器物件,然後就可以根據設定的id名獲取對應的bean

IoC容器和Bean配置

IoC和DI

①IoC(Inversion of Control):控制反轉。     傳統的資源獲取方式:由開發人員手動建立資源,並管理資源。這種方式,當專案中的資源比較多的時候,建立,管理就會顯得異常複雜。並且各種資源的建立方式不盡相同,開發人員學習各種建立資源的方式的成本也會大大增加。     控制反轉,讓這種主動建立資源的方式變成被動,所有的資源獲取只需要被動的獲取就行。開發人員在需要某資源的時候,只需要根據一定的規則從容器中獲取即可。     Spring框架的IoC容器的設計就是基於這種模式,由IoC容器管理所有資源,資源建立,資源釋放,全部由IoC容器管理,開發人員即用即取,而不用考慮其他事情。 ②DI(Dependency Injection):依賴注入。      IoC的另一種表述方式:即元件以一些預先定義好的方式(例如:setter 方法)接受來自於容器的資源注入。相對於IoC而言,這種表述更直接。 ③IoC容器在Spring中的實現      [1]在通過IoC容器讀取Bean的例項之前,需要先將IoC容器本身例項化。      [2]Spring提供了IoC容器的兩種實現方式           BeanFactory:IoC容器的基本實現,是Spring內部的基礎設施,是面向Spring本身的,不是提供給開發人員使用的。           ApplicationContext:BeanFactory的子介面,提供了更多高階特性。面向Spring的使用者,幾乎所有場合都使用ApplicationContext而不是底層的BeanFactory。 ④ApplicationContext的主要實現類      ClassPathXmlApplicationContext:對應類路徑下的XML格式的配置檔案(HelloWorld使用此方式獲取IoC容器的例項)      FileSystemXmlApplicationContext:對應檔案系統中的XML格式的配置檔案      在初始化時就建立單例的bean,也可以通過配置的方式指定建立的Bean是多例項的。(IoC容器預設單例) ⑤ConfigurableApplicationContext      是ApplicationContext的子介面,包含一些擴充套件方法      refresh()和close()讓ApplicationContext具有啟動、關閉和重新整理上下文的能力。 ⑥WebApplicationContext      專門為WEB應用而準備的,它允許從相對於WEB根目錄的路徑中完成初始化工作

Bean配置

IoC容器Bean配置3種方式:      ①基於XML檔案進行配置(在XML檔案中使用bean標籤進行配置)      ②基於註解進行配置(利用在類和屬性的相應位置加上註解完成配置)      ③基於java進行配置(利用幾個特殊的註解)(不常用) IoC容器的作用:控制反轉(依賴注入),用於管理使用者的所要使用元件和元件之間的關係。 使用ioc容器,ioc容器會依據你所配置的要求生成物件,根據要求裝配物件之間的關係,ioc容器在初始化的時候,會自動根據要求建立物件並裝配物件之間的關係,使用者在需要的時候只需要在容器中取就行了。 依賴注入的方式主要有三種:   ①介面注入   ②使用構造器注入   ③使用set方法注入   ②③比較常用 XML配置元件: 使用bean標籤進行配置   ①使用set方法注入(設定要求建立的物件的屬性)(這裡的屬性名是類的set方法後邊的名字)     <bean id="book01" class="com.atguigu.beans.Book">         <!-- 利用property標籤給bean屬性賦值 -->         <property name="author" value="鹽田七生"></property>         <property name="title" value="羅馬人的故事"></property>         <property name="price" value="34.5"></property>     </bean>     使用property給屬性賦值也可以使用ref引用容器中的其他bean 當需要修改元件的屬性時,也可以使用property標籤   <property name="屬性名" value="屬性值"></property> ② 使用構造器注入,可以使用name/index精確定位每個引數進行賦值
<constructor-arg name="引數名" value="引數值"></constructior-arg>
     不使用name/index,Spring框架底層演算法會依次進行匹配,若不匹配,會報異常。 <bean id="book03" class="com.atguigu.beans.Book">     <constructor-arg value="平凡的世界"></constructor-arg>     <constructor-arg value="10.9" ></constructor-arg>     <constructor-arg value="路遙"></constructor-arg> </bean>      使用name對每個引數精確賦值 name指定引數名 <bean id="book04" class="com.atguigu.beans.Book">    <constructor-arg value="平凡的世界" name="title"></constructor-arg>    <constructor-arg value="10.9" name="price" ></constructor-arg>    <constructor-arg value="路遙" name="author"></constructor-arg> </bean>      使用index對每個引數進行賦值,index指定被賦值的引數索引 <bean id="book03" class="com.atguigu.beans.Book">      <constructor-arg value="10.9" index="1"></constructor-arg>
     <constructor-arg value="平凡的世界" index="0"></constructor-arg>      <constructor-arg value="路遙" index="2"></constructor-arg> </bean>      當呼叫引數個數相同但某些型別相容的構造器時,可以使用type指定型別來呼叫     <!-- 使用type精確呼叫引數個數相同,但是某些型別相容的構造器,自定義型別需要使用全類名,java.lang包下的不用寫全類名 -->     <bean id="book05" class="com.atguigu.beans.Book">         <constructor-arg value="平凡的世界" index="0"></constructor-arg>         <constructor-arg value="12" index="1" type="double"></constructor-arg>         <constructor-arg value="路遙" index="2"></constructor-arg>     </bean> IoC容器建立元件預設是單例的,可以使用scope指定其他模式 元件建立模式:
prototype 多例項 request 元件在一次請求內有效 session 元件在一次回話內有效 singleton 單例項  例:指定建立的方式是多例項的。 <bean id="book01" class="com.atguigu.beans.Book" scope="prototype">         <!-- 利用property標籤給bean屬性賦值 -->         <property name="author" value="鹽田七生"></property>         <property name="title" value="羅馬人的故事"></property>         <property name="price" value="34.5"></property> </bean> 小結:在使用構造器注入的時候,若要精確呼叫,直接使用name屬性指定引數名更為方便。

配置集合元件

     使用list標籤,map標籤,props標籤(配置properties集合元件)常用於配置資料庫連線      集合中的值可以是內部bean,可以是基本資料型別,可以是一個引用      List集合屬性賦值 <!-- 給List集合屬性賦值 -->     <bean id="book07" class="com.atguigu.beans.Book">         <property name="title" value="追風箏的人"/>         <property name="price" value="20"/>         <property name="freeBook">             <bean p:title="免費書籍" class="com.atguigu.beans.Book"></bean>         </property>         <property name="list">             <!-- 給List集合屬性賦值 -->             <list>                 <!-- 可以是內部bean -->                 <bean p:title="內部Bean" class="com.atguigu.beans.Book"></bean>                 <!-- 可以是String字串 -->                 <value>String字串</value>                 <!-- 可以是一個引用 -->                 <ref bean="book01"/>             </list>         </property>     </bean>       map集合屬性賦值 <!-- 給Map集合屬性賦值 -->     <bean id="book08" class="com.atguigu.beans.Book">         <property name="title" value="明朝那些事"></property>         <property name="map">             <map>                 <entry key="免費書籍" value-ref="book01"></entry>                 <entry key="2">                     <bean p:title="鹿鼎記(內部bean)" class="com.atguigu.beans.Book"></bean>                 </entry>                 <entry key="3" value="String字串"></entry>             </map>         </property>     </bean>     properties集合屬性賦值     <!-- 利用props標籤,prop標籤給Properties集合屬性賦值 -->     <bean id="book09" class="com.atguigu.beans.Book" p:title="魯濱遜漂流記">         <property name="properties">             <props>                 <prop key="url">jdbc:mysql//localhost:8080/test</prop>                 <prop key="root">root</prop>                 <prop key="password">123456</prop>             </props>         </property>     </bean>      util名稱空間的使用     <!-- 通過util名稱空間建立一個通用的List -->     <util:list id="list01">         <bean p:title="資料之巔" class="com.atguigu.beans.Book"></bean>         <value>String字串</value>         <ref bean="book01"/>     </util:list>     <!-- 通過util名稱空間建立一個通用的map -->     <util:map id="map01">         <entry key="i1" value="字串"></entry>         <entry key="i2" value-ref="book01"></entry>         <entry key="i3">             <bean p:title="溫州一家人" class="com.atguigu.beans.Book"></bean>         </entry>     </util:map>     <!-- 通過util名稱空間建立一個通用properties -->     <util:properties id="properties01">         <prop key="url">jdbc:mysql//127.0.0.1:8080/test</prop>         <prop key="root">root</prop>         <prop key="password">123456</prop>     </util:properties>     <!-- 建立一個bean呼叫上邊的通用的List,Map,Properties -->     <bean id="book10" class="com.atguigu.beans.Book">         <property name="title" value="集合大雜燴"></property>         <property name="map" ref="map01"></property>         <property name="list" ref="list01"></property>         <property name="properties" ref="properties01"></property>     </bean> 使用其他方式配置IoC元件
使用p標籤給元件的屬性賦值(set方法注入)   ①新增p名稱空間(xmlns:p="http://www.springframework.org/schema/p")   ②使用p標籤進行賦值
使用p標籤給元件的屬性賦值,同時使用ref引用容器中另一個bean元件 <bean p:title="平凡的世界2"  p:author="路遙" p:price="23" p:sales="100" id="book01" class="com.atguigu.beans.Book"/> <bean p:title="平凡的世界1" p:author="路遙" p:price="23" p:sales="100" p:freeBook-ref="book01" id="book02" class="com.atguigu.beans.Book"/>

獲取bean元件

    方式①:使用id獲取     ApplicationContext ioc = new ClassPathXmlApplicationContext("ioc.xml");     @Test     public void test5() {         Object bean = ioc.getBean("book05");         System.out.println(bean);     }      方式②:使用型別獲取     /**      * 通過型別獲取bean,若ioc.xml中有同類型的多個bean會報no unique異常      * 這時只能通過id獲取      * org.springframework.beans.factory.NoUniqueBeanDefinitionException:      *  No qualifying bean of type [com.atguigu.bean.Book] is defined:      *  expected single matching bean but found 2: book,book02      */     @Test     public void test2() {         Book bean = ioc.getBean(Book.class);         System.out.println(bean);     }


基於註解配置元件(最常用的方式)

1.給需要新增到IoC容器中的類加註解 2.匯入aop包(spring-aop-4.0.0.RELEASE.jar 3.配置自動掃描加了註解的類
示例: 使用註解配置的元件:      ①預設id是類名首字母小寫      ②註解的value屬性可以設定新的id @Repository public class BookDao { }      使用註解的value屬性設定新的id @Repository(value="bd") public class BookDao { }      @Service註解和@Autowired註解 @Service public class BookService {     @Autowired     private BookDaobookDao; }      @Autowired註解:框架自動在IoC容器中查詢對應的元件給屬性賦值。預設是required=true,意思是必須裝配上,若裝配不上,報錯。可以設定required=false設定此屬性的裝配不是必須的。
進行裝配的時候嘗試的方式:  1.型別  2.屬性名作為id  [email protected] 的value值  自動裝配時這三種方式都會進行嘗試 框架裝配步驟:  利用@Autowired對BookDao進行裝配  首先根據型別進行裝配,找到就裝配,找不到報錯。  若同種型別找到多個,再按照屬性名作為id找到指定的,找不到報錯,若根據id找不到,在看@Qualifier註解。 無論怎麼找最後找到唯一的一個就返回,所有方式都嘗試了,還沒有找到就報錯 注意:@Qualifier註解要加到屬性名上,或者set方法處(@Autowired與這個註解要如影隨行)
@Qualifier註解使用方式 方式1: @Service public class BookService {     //這個註解預設是true意思是必須裝配上,false為若找不到可以不裝配,這樣找不到就不會報錯了     @Autowired(required=false)     @Qualifier("bookDao")     private BookDao bookDao2; 方式2:     @Autowired     public void setBookDao(@Qualifier("bookDao")BookDao bookDao2) {         this.bookDao = bookDao2;     } @Controller @Controller public class BookServlet {     @Autowired     private BookService bookService; } 在配置檔案中配置自動掃描加了註解的類 配置時常用的標籤和屬性介紹:
<context:component-scan base-package=""></ context:component-scan> base-package設定要掃描的基包,框架會掃描這個包路徑下的所有類 use-default-filters="true" 預設 :全部掃描 use-default-filters="false" 全不掃描
子標籤①: <context:exclude-filter type="annotation" expression=""/> 基於註解配置不掃描的類 <context:exclude-filter type="assignable" expression=""/>基於型別配置不掃描的類
子標籤②: <context:include-filter type="annotation" expression=""/> 基於註解配置要掃描的類 <context:include-filter type="assignable" expression=""/> 基於型別配置要掃描的類
示例: <context:component-scan base-package="com.myframe">     <!-- 設定不掃描的註解 -->     <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>     <!-- 型別是全類名 -->     <context:exclude-filter type="assignable" expression="com.myframe.service.BookService"/> -->      </context:component-scan> <context:component-scan base-package="com.myframe" use-default-filters="false">      <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>      <context:include-filter type="assignable" expression="com.myframe.service.BookService"/> </context:component-scan>

相關推薦

Spring框架介紹IoC容器Bean配置Spring框架

Spring框架整理第一發,Spring框架介紹,HelloWorld,IoC容器介紹,Bean配置 Spring概述      ①Spring為簡化企業級開發而生,使用Spring,JavaBean就可以實現很多以前要靠EJB才能實現的功能。同樣的功能,在EJB中要通過

Spring 學習——IOC 容器 Bean 的生命週期

IOC 容器中 Bean 的生命週期方法 •Spring IOC 容器可以管理 Bean 的生命週期, Spring 允許在 Bean 生命週期的特定點執行定製的任務. •Spring IOC 容器對 Bean 的生命週期進行管理的過程: –通過構造器或工廠方法建立 Bean 例項

JAVAWEB開發之Spring詳解之——Spring的入門以及IOC容器裝配Bean(xml註解的方式)、Spring整合web開發、整合Junit4測試

public class BeanFactory{    public UserService getUserService(){         // 反射+配置檔案        return Class.forName(類名).newInStance();     } } xml、pro

SpringIOC 容器 Bean 之間的關係

一、在 Spring IOC 容器中 Bean 之間存在繼承和依賴關係。 需要注意的是,這個繼承和依賴指的是 bean 的配置之間的關係,而不是指實際意義上類與類之間的繼承與依賴,它們不是一個概念。

Spring擴充套件:替換IOC容器Bean元件 -- @Replace註解

## 1、背景:     工作中是否有這樣的場景?一個軟體系統會同時有多個不同版本部署,比如我現在做的IM系統,同時又作為公司的技術輸出給其他銀行,不同的銀行有自己的業務實現(比如登陸驗證、使用者資訊查詢等); 又或者你的工程裡依賴了公司的二方包A,A又依賴了B...這些jar包

spring_(10)IOC容器Bean的生命週期

SpringIOC容器可以管理Bean的生命週期,Spring允許在Bean生命週期的特定點執行定製的任務 SpringIOC容器對Bean的生命週期進行管理的過程: 通過構造器或工廠方法建立Bean例項 為Bean的屬性設定值和對其他Bean的引

4. IOC容器的依賴注入原始碼解讀

一、基本概念 1.當Spring IoC容器完成了Bean定義資源的定位、載入和解析註冊以後,IoC容器中已經管理類Bean定義的相關資料,但是此時IoC容器還沒有對所管理的Bean進行依賴注入,依賴注入在以下兩種情況發生: (1)使用者第一次通過getBean

java 非阻塞演算法在併發容器的實現ConcurrentLinkedQueue原始碼

簡介 非阻塞演算法在更細粒度的層面協調爭用,它比傳統的鎖有更高的併發性。隨著非阻塞演算法在 Java 中的應用越來越廣泛,java.concurrent 包中用非阻塞演算法實現的併發容器也越來越多,ConcurrentLinkedQueue 就是其中的一個重要

Caffe搭建:常見問題解決辦法ubuntu使用遇到問題持續更新

嚴正宣告: 在linux下面使用命令列操作時,一定要懂得命令列的意思,然後再執行,要不然在不知道接下來會發生什麼的情況下輸入一通命令,linux很有可能崩掉。 因為在linux下面,使用sudo以及root許可權時,是可以對任意一個檔案進行操作處理的,即使是正在使用的系統檔案。 caffe中出現下

const在CC++編譯的區別實現機制

我們都知道在程式中用const,如果是變數,這表示該變數的值不能被修改,,,但是看下面一段C程式碼: 注意在用C編譯, #include <stdio.h> #include <stdlib.h> int main() { const i

Hadoop Hbase 的安裝與配置 單機模式

(一定要看最後我趟過的坑,如果安裝過程有問題,可參考最後我列出的問題及解決方法) 下載Hadoop安裝包 這裡安裝版本:hadoop-1.0.4.tar.gz 在安裝Hadoop之前,伺服器上一定要有安裝的jdk jdk安裝方式之一:在官網上下載Linux下的rpm

精通Spring+4.x++企業開發與實踐之IoC容器裝配Bean

Spring配置概述 Spring屬性注入 JavaBean關於屬性命名的特殊規範 Spring配置檔案中的<property></property>元素所指定的屬性名和Bean實現類的Setter方法滿足Sun JavaBean的屬性命名規範:xxx的屬性對應的

Spring 學習四 Bean 按條件注入到 IOC 容器

繼承Condition 介面,在 bean 添加註解 @Conditional Condition 介面原始碼 @FunctionalInterface public interface Condition { /** * Determine if

獲取IOC容器bean的兩種方式idclass的區別

// ClassPathXmlApplicationContext: 是 ApplicationContext的實現類,從類路徑下來載入配置檔案 ApplicationContext ctx=new ClassPathXmlApplicationContext("a

spring容器啟動之我見(四、獲取容器獲取容器bean)

1.我們經常會發現在我們的service中有註解而在dao上沒有註解 看圖 因為我們在spring容器初始化bean的時候,是把service當做一個bean ,而dao並不是一個bean,這是個人理解,如果有錯誤,歡迎大家指出。 2. 那我們總結一下那些算是spri

Spring動態管理IoC容器Bean

以下為工具類,此工具類需要在Spring中註冊。有動態獲取Bean的方法,也有把Bean動態交給IoC容器管理的方法。可直接copy複用:實現介面: org.springframework.context.ApplicationContextAware 實現該介面的setA

Spring原始碼解析-getBean如何獲取Ioc容器bean

在Spring框架中,主要是要IOC容器和AOP切面兩塊,然而從IOC容器中如何獲取bean也對我們而言也是可以來學習解析的。 一、解讀getBean的背景   在工作中,一次通過從IOC容器中獲取通過繼承FactoryBean介面的類,發現在對

springboot 普通類獲取spring IOC容器Bean

我們知道如果我們要在一個類使用spring提供的bean物件,我們需要把這個類注入到spring容器中,交給spring容器進行管理,但是在實際當中,我們往往會碰到在一個普通的Java類中,想直接使用spring提供的其他物件或者說有一些不需要交給spring管理,但是需

一起寫框架-Ioc內核容器的實現-對象的調用-@Bean註解註入容器的對象十二

擴展 lac iter component cts block 根據 spa urn 實現功能 現實需求中,有一些類似無法加入掃描組件註解的。如jdk裏面的類。 那麽框架必須要支持將沒有組件註解標識的類也可以有一個方式註入到容器裏面。 那麽,我們通過類似Spring的@

Spring容器Bean的生命周期

pub run down xsd 信息 ini exc rop throw Spring生命周期分為以下步驟: 1.instantiate bean 對象實例化 2.populate properties 封裝屬性 3.如果Bean實現BeanNameAware執行setB