Spring(一)-IOC

一、Spring定義

Spring是一個開源框架,為簡化企業級開發應用而生,使用Spring可以使簡單的JavaBean實現以前只有EJB才能實現的功能,它是一個IOC(DI)(依賴注入)和AOP(面向切面編程)容器框架。

  • 一站式:在IOC和AOP基礎上可以整合各種企業應用的開源框架和第三方類庫。

二、環境搭建

  • 1、新建工程
  • 2、導入五個必備jar包
    commons-logging-1.1.1.jar
    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

三、Spring具體應用

1、IOC&DI

Paste_Image.png
  • IOC前生
    1) 分離接口與實現
Paste_Image.png

2)工廠設計模式

Paste_Image.png

3)反轉控制

Paste_Image.png

2、IOC中Bean的配置

  • 1、基于xml文件
    創建HelloWorld類,包含一個name對象和一個hello()方法。
    創建SpringBean配置文件,命名為applicationContext.xnl,并配置內容。
<!--
    id:標識容器中的bean,id唯一
    class:bean的全類名,通過反射的方式在IOC容器中創建bean,所以要求bean中必須帶有無參的構造器
-->
<bean id="helloWorld" class="com.bean.HelloWorld">
      <property name="name" value="Spring"></property>
</bean>
//創建Spring的IOC容器對象
//ApplicationContext 代表IOC容器
//ClassPathXmlApplicationContext:ApplicationContext 接口的實現類,該實現類從類路徑下加載配置文件
ApplicationContext ctx=new ClassPathXmlApplicationContext("appllicationContext.xml");
//從IOC容器中獲取Bean實例
//利用id定位IOC容器中的bean,還可以同類型HelloWorld.class來獲得,此時IOC容器中bean必須只有一個
HelloWorld helloWorld=(HelloWorld)ctx.getBean("helloWorld");
//調用類中方法
helloWorld.hello();
Paste_Image.png
Paste_Image.png
  • 2、配置方式:通過全類名(反射)、通過工廠方法(靜態工廠方法&實例工廠方法)、FactoryBean

  • 3、IOC的依賴注入
    1)屬性注入

<bean id="helloWorld" class="com.bean.HelloWorld">
      <property name="name" value="Spring"></property>
</bean>

2)構造器注入

<bean id="car" class="com.bean.Car">
      <constructor-arg value="Audi"></constructor-arg>
      <constructor-arg value="ShangHai"></constructor-arg>
</bean>

當存在重載構造器時,可以再constructor-arg中添加位置(index)或者類型(type)來進行區分
外部bean的引入:

<bean id="person" class="com.bean.Person">
      <property name="name" value="Tom"></property>
      <property name="age" value="24"></property>
      <property name="car" reg="car"></property>
</bean>

Paste_Image.png

Paste_Image.png

3)工廠方法注入(很少使用,不推薦)
注意:

  • a、內部bean不能被外部引用,只能在內部使用。
  • b、級聯屬性:bean支持為級聯屬性賦值,但必須初始化后才能進行賦值。和struts2不同
  • c、集合屬性:
<bean id="person2" class="com.bean.Person">
      <property name="name" value="Mike"></property>
      <property name="age" value="23"></property>
      <property name="cars" >
             <list>
                  <ref bean="car"/>
                  <ref bean="car1"/>
                  <ref bean="car2"/> 
            </list>
      </property>
</bean>
Paste_Image.png

Paste_Image.png
<!--配置properties屬性,如連接數據庫-->
<bean id="dataSource" class="class.bean.DataSource>
      <property name="properties">
              <props>
                       <prop key="user">root</prop>
                       <prop key="password">123456</prop>
                       <prop key="jdbcUrl">jdbc:mysql:///test</prop> 
                       <prop key="driverClass">com.mysql.jdbc.Driver</prop>
             </props>
      </property>
</bean>

配置獨立的集合bean,當多個bean都需要用到這個集合時,可以直接進行引用,需要導入util命名空間:

<uti-list>
     <ref bean="car"/>
     <ref bean="car2"/>
</uti-list>
  • 通過p命名空間未bean賦值,需要先導入p命名空間
<bean id="person3" class="com.bean.person" p:name="Jack" p:age="34" p:car-ref="cars"   ></bean>
  • 4、自動裝配
Paste_Image.png
<bean id="car" class="com.bean.Car" p:brand="Aodi" p:price="30000"></bean>
<bean id="adress" class="com.bean.Ardress" p:city="BeiJing" p:street="HongQi"></bean>
<!--byName自動裝配是根據bean的名字和當前bean的setter方法的屬性名進行自動裝配,當bean的id變成car1是就無法裝配car;
byType根據bean的類型和當前bean屬性的類型進行自動裝配,若此時IOC容器中有兩個以上的類型匹配bean,則會拋出異常。
-->
<bean id="person" class="com.bean.Person" p:name="Tom" autowire="byName"></bean>
  • 5、自動裝配的缺點
Paste_Image.png
  • 6、bean的繼承
<bean id="adress" class="com.bean.Adress" p:city="BeiJing" p:street="Dazhogn"></bean>
<bean id="adress2" parent="adress" p:street="Dazhogn"></bean>

Paste_Image.png

當某一個bean沒有指定的class屬性時,他必須是一個抽象bean,否則會報錯。

  • 7、bean的作用域
<!--
      使用bean的scope屬性來配置bean的作用域
      singleton:默認值。容器初始時創建bean實例,在整個容器的生命周期中只創建這一個bean,單例的。
      prototype:原型的。容器初始化時不創建bean實例,在每次請求時都創建一個新的bean,并返回。
-->
<bean id="car" class="com.bean.Car">
      <constructor-arg value="Audi"></constructor-arg>
      <constructor-arg value="ShangHai"></constructor-arg>
</bean>
  • 8、bean外部屬性文件
    原因:在配置文件里 配置bean時,有時需要在bean的配置里混入系統部署的細節信息(例如:文件路徑,數據源配置信息等)。而這些部署細節實際上需要和bean的配置分離。
    已導入數據源為例:
    首先導入c3p0-0.9.1.2.jar包和mysql驅動包
    新建一個文件db.properties,寫入要進行導入的屬性
user=root
password=123456
jdbcUrl=jdbc:mysql:///test
driverClass=com.mysql.jdbc.Driver
<!--導入屬性文件-->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="class.bean.DataSource>
      <property name="properties">
              <props>
                       <prop key="user" value=${user}></prop>
                       <prop key="password" value=${password}></prop>
                       <prop key="jdbcUrl" value=${jdbcUrl}></prop> 
                       <prop key="driverClass" value=${driverClass}></prop>
             </props>
      </property>
</bean>
  • 9、Spring表達式語言SpEL:
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
<bean id="car" class="com.bean.Car">
      <property name="brand" value="Audi"></property>
      <property name="price" value="300000"></property>
      <!--tyrePerimeter表示輪胎周長,使用SpEL引用類的靜態屬性-->
      <property name="tyrePerimeter" value="#{T(java.lang.Math).PI*80}></property>
</bean>

<bean id="preson" class="com.bean.Person">
      <!--使用SpEl引用其他bean-->
      <property name="car" value="#{car}"></property>
      <!--使用SpEL引用其他bean的屬性-->
      <property name="city" value="#{adress.city}"></property>
      <!--使用SpEL的運算符-->
      <property name="info" value="#{car.price>300000 ? '金領':'白領'}></property>
</bean>
  • 10、bean的生命周期(視頻10)
Paste_Image.png
Paste_Image.png
public class Car(){
      public Car(){
            System.out.println("Car Constructor.....");
      }
      private String brand;
      public void setBrand(){
            System.out.println("serBrand...");
            this.brand=brand;
      }
      public void init(){
            System.out,println("init...");
      }
      public xoid destory(){
            System.out.println("destory...");
      }
}
<bean id="car" class="com.bean.Car"
       init-method="init"
       destory-method="destory">
      <property name="brand" value="Audi"></property>
</bean>
<!--
      實現BeanPostProcessor接口,并具體提供
      Object postProcessBeforeInitialization(Object bean,String beanName):init-method之前調用
      Object postProcessAfterInitialization(Object bean,String beanName):init-method之后調用
      的實現
      bean:bean實例本身
      beanName:IOC容器中配置的bean的名字
      返回值:實際返回給用戶的bean,可以通過以上兩個方法修改返回的bean,甚至返回一個新的bean
-->
<bean class="com.bean.MyBeanPostProcessor"></bean>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容