spring通俗演繹

學框架不學spring都很差意思跟別人說本身懂框架,並且如今好多java方面的工做要求熟練spring/myBaits等主流框架,本身學 spring也有一段時間了,作一篇博客整理下本身的思路,技術嗎,不沉澱下來終究沒法轉化成本身的東西,之因此寫的通俗一點,權且是對本身渣比的調侃吧。java

  從spring的兩大思想開始:1.IOC; 2.AOPspring

  IOC(inversion of control),控制反轉,這裏的控制是指控制對象的建立,衆所周知,java中是經過new關鍵字來建立對象的,有些僅僅使用一次的對象反覆建立,造 成了資源的浪費,若是將對象的建立交付給容器,不只能省去大量資源使對象複用,更能省去某些麻煩(反覆new對象形成的麻煩應該不僅資源浪費,猜想)。個 人感受,設計模式的重要想法就是專門弄一項技術來處理某些專門的需求,正是對象資源的管理催生了ioc,將對象管理交給容器來管理,須要對象時候從容器裏 面拿一個就好,是否是很方便,哈哈。所謂容器,實現起來就是由jvm建立和管理一塊專門放對象的內存,容器的啓動,初始化,銷燬特性歸納起來就是生命周 期,spring正是在容器的生命週期內完成對象的管理的。下面是new對象方式和ioc方式處理對象的對照:編程

  

public class Car{ public car(){ //汽車初始化時候也要初始化發動機 Egnine eg=new Egnine(); } } //使用時候 Car car=new Car();
使用ioc方式,把對象的關係寫在xml文件中,這樣汽車一初始化的時候,引擎也隨之初始化,就是把它們的建立關係寫在另一個擅長邏輯關係管理的文件中,這種文件名字叫xml.
這樣作的另一個好處就是,若是一個car須要兩個引擎,把xml改掉以後原來代碼照樣跑,有個高大上的名字叫-解耦,須要什麼在bean的配置文件裏面嵌套一些bean做爲參數,這種
方式稱之爲注入. Step 1 <bean id="Car" class="cn.usct.Car">   <constructor-arg ref="eg"></constructor-arg> </bean> <bean id="eg" class="cn.usct.Egnine"></bean> Car和Egnine的代碼照常(ioc只提供對象管理,但對象是什麼樣子仍是靠.java文件裏的類) Step 2 Car c=ApplicationContext.get("Car");

spring3和spring2.5的一大區別就是經過id的getBean()方法還須要用a.class做爲第二個參數設計模式

第一個spring使用:數組

1.建立項目,導入jar包,項目結構:「src」用於存放java文件;「lib」用於存放jar文件;「resources」用於存放配置文件框架

2.寫接口和實現類dom

3.jvm

    1. //一、讀取配置文件實例化一個IoC容器  
    2.              ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");  
    3.              //二、從容器中獲取Bean,注意此處徹底「面向接口編程,而不是面向實現」  
    4.               HelloApi helloApi = context.getBean("hello", HelloApi.class);  
    5.               //三、執行業務邏輯  
    6.               helloApi.sayHello();

最經常使用API:Object getBean(String name) 根據名稱返回一個Bean,客戶端須要本身進行類型轉換;ide

 

二,獲取bean的方式(四種)測試

id,類(car.class),名字+類

三,實例化

1.<constructor-args index="0" value="hello!"/> 爲一個參數的構造方法提供了字符串類型參數

2.普通工廠實例化

  1. package cn.javass.spring.chapter2;  
  2. public class HelloApiInstanceFactory {  
  3. public HelloApi newInstance(String message) {  
  4.           return new HelloImpl2(message);  
  5.    }  
  6. }

  xml

  

    1. <!—1、定義實例工廠Bean -->  
    2. <bean id="beanInstanceFactory"  
    3. class="cn.javass.spring.chapter2.HelloApiInstanceFactory"/>  
    4. <!—2、使用實例工廠Bean建立Bean -->  
    5. <bean id="bean4"  
    6. factory-bean="beanInstanceFactory"  
    7.      factory-method="newInstance">  
    8.  <constructor-arg index="0" value="Hello Spring!"></constructor-arg>  
    9. </bean>

  測試代碼

    1. BeanFactory beanFactory =  
    2. new ClassPathXmlApplicationContext("chapter2/instantiatingBean.xml");  
    3.        HelloApi bean4 = beanFactory.getBean("bean4", HelloApi.class);  
    4.        bean4.sayHello();

四,注入

1.

構造方法注入:index,name,type

  1. <!-- 經過構造器參數索引方式依賴注入 -->  
  2. <bean id="byIndex" class="cn.javass.spring.chapter3.HelloImpl3">  
  3. <constructor-arg index="0" value="Hello World!"/>  
  4.     <constructor-arg index="1" value="1"/>  
  5. </bean>  
  6. <!-- 經過構造器參數類型方式依賴注入 -->  
  7. <bean id="byType" class="cn.javass.spring.chapter3.HelloImpl3">  
  8.    <constructor-arg type="java.lang.String" value="Hello World!"/>  
  9.    <constructor-arg type="int" value="2"/>  
  10. </bean>  
  11. <!-- 經過構造器參數名稱方式依賴注入 -->  
  12. <bean id="byName" class="cn.javass.spring.chapter3.HelloImpl3">  
  13.    <constructor-arg name="message" value="Hello World!"/>  
  14.    <constructor-arg name="index" value="3"/>  
  15. </bean>

不建議使用name注入

2.

2.1注入普通屬性

setter方法注入

1.類文件

    1. package cn.javass.spring.chapter3;  
    2. import cn.javass.spring.chapter2.helloworld.HelloApi;  
    3. public class HelloImpl4 implements HelloApi {  
    4.     private String message;  
    5.     private int index;  
    6. //setter方法  
    7.     public void setMessage(String message) {  
    8.         this.message = message;  
    9.     }  
    10.     public void setIndex(int index) {  
    11.         this.index = index;  
    12.     }  
    13.     @Override  
    14.     public void sayHello() {  
    15.         System.out.println(index + ":" + message);  
    16.     }  
    17. }

2.配置bean,主要是property

    1. <!-- 經過setter方式進行依賴注入 -->  
    2.     <bean id="bean" class="cn.javass.spring.chapter3.HelloImpl4">  
    3.         <property name="message" value="Hello World!"/>  
    4.         <property name="index">  
    5.             <value>1</value>  
    6.         </property>  
    7.     </bean> 

2.2注入集合

1類

  1. package cn.javass.spring.chapter3.bean;  
  2. import java.util.List;  
  3. public class ListTestBean {  
  4.     private List<String> values;  
  5.     public List<String> getValues() {  
  6.         return values;  
  7.     }  
  8.     public void setValues(List<String> values) {  
  9.         this.values = values;  
  10.     }  
  11. }

2注入

    1. <bean id="listBean" class="cn.javass.spring.chapter3.bean.ListTestBean">  
    2.     <property name="values">  
    3.         <list>  
    4.             <value>1</value>  
    5.             <value>2</value>  
    6.             <value>3</value>  
    7.         </list>  
    8.    </property>  
    9. </bean>

3測試

  1. @Test  
  2. public void testListInject() {  
  3.    BeanFactory beanFactory =  
  4. new ClassPathXmlApplicationContext("chapter3/listInject.xml");  
  5. ListTestBean listBean = beanFactory.getBean("listBean", ListTestBean.class);  
  6. System.out.println(listBean.getValues().size());  
  7. Assert.assertEquals(3, listBean.getValues().size());  
  8. }

Assert.assertEquals();方法判斷先後兩個值是否相等

set集合類型與之相同

3

注入其餘bean

  1. <bean id="bean2" class="cn.javass.spring.chapter3.bean.HelloApiDecorator">  
  2.     <property name="helloApi"><ref bean=" helloApi"/></property>  
  3. </bean>

 

注入總結

1、構造器注入:

1)常量值

簡寫:<constructor-arg index="0" value="常量"/>

全寫:<constructor-arg index="0"><value>常量</value></constructor-arg>

2)引用

簡寫:<constructor-arg index="0" ref="引用"/>

全寫:<constructor-arg index="0"><ref bean="引用"/></constructor-arg>

 

2、setter注入:      

       1)常量值

        簡寫:<property name="message" value="常量"/>

        全寫:<property name="message"><value>常量</value></ property>

       2)引用

        簡寫:<property name="message" ref="引用"/>

        全寫:<property name="message"><ref bean="引用"/></ property>

       3)數組:<array>沒有簡寫形式

       4)列表:<list>沒有簡寫形式

       5)集合:<set>沒有簡寫形式

       6)字典

          簡寫:<map>

             <entry key="鍵常量" value="值常量"/>

             <entry key-ref="鍵引用" value-ref="值引用"/>

            </map>

         全寫:<map>

             <entry><key><value>鍵常量</value></key><value>值常量</value></entry>

             <entry><key><ref bean="鍵引用"/></key><ref bean="值引用"/></entry>

           </map>

       7)Properties:沒有簡寫形式

ps:null值注入

<property name="name"></null></>

(原理篇)

還有一個問題,ioc是如何實現的?

 個人理解是依靠反射,基於dom解析器的解析原理,當讀到一個id時候,按照符合ioc的dtd,class裏面理應是這個bean的實現類,本質上仍是經過new來建立而且返回,只是spring默認的是單例模式,那麼建立以前先加判斷 if(instance==null){建立}

相關文章
相關標籤/搜索