天天看點

Spring學習之裝配Spring學習之裝配

Spring學習之裝配

建立應用對象之間協作關系的行為通常稱為裝配(wiring),也是DI的本質。

三種裝配機制

  1. 在XML中進行顯式配置;
  2. 在Java中進行顯式配置;
  3. 隐式的bean發現機制和自動裝配;

自動裝配

  • 1. 元件掃描:

    @component 注解為元件(可以用@Named(“beanID”)替代,但是建議使用前者,更直覺的表明是做什麼的)

    @componentScan注解啟用了元件掃描

    可以使用值設定掃描的基礎包:

    #1. 直接給定包名:

    @componentScan(“system”)

    @componentScan(basePackages=“system”)

    @componentScan(basePackages=({“system”,‘video’})

    #2. 指定為包中所含的類或者接口(推薦建一個空的接口作為定位,避免因代碼重構,移動了相關類而導緻掃描出問題)

    @componentScan(basePackageClasses=({“position.class”,“test.class”})

    2. 自動裝配:

    @Autowired(required=false)

    required=false表示如果沒有比對的bean就不裝配,但是需要注意在代碼中進行null 檢查,否則抛出NullPointerException

通過Java代碼裝配

  • 盡管自動裝配式最推薦的,但有時不得不用顯示裝配,例如引用第三方元件,

    JavaConfig_相較于XML更強大,類型安全,對重構友好。

    應與業務邏輯代碼分開,避免侵入業務代碼

  • @Configuration注解

    标注于類上,标明這個類是一個注解類

  • 聲明bean

    @Bean注解

    标注于方法上,标明這個方法傳回一個對象,該對象為sprin應用上下文中的bean,方法體傳回最終産生bean執行個體的邏輯

    裝配bean

    引用建立bean的方法

  • @Bean

    public A a()

    {return new A(b());}

    看起來是通過調用b()方法得到b,實際上spring會攔截調用,并直接傳回該方法所建立的bean,而不是每次都調用。

    使用構造器方法裝備

  • @Bean

    public A a(b)

    {return new A(b);}

XML裝配

​​

  • ​​聲明bean

    < bean id=“id” class=“package.A” />

    裝配bean

    < constructor-arg>元素

    < bean id=“id” class=“package.A” >

    < constructor-arg ref=“b” />

    < /bean>

    構造器注入:

    非引用類型如String等值類型,使用value取代ref

    可以使用list和set裝配數組,差別是set會去掉重複值

    屬性注入:

    使用property

    使用Spring3.0所引入的c-命名空間

    < bean id=“id” class=“package.A” >

    < c:cd-ref=“b” />

    < /bean>

    不能裝配數組