最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring依賴注入的三種方式小結(jié)

 更新時(shí)間:2017年08月16日 10:59:59   作者:飛揚(yáng)小初  
本篇文章主要介紹了Spring依賴注入的三種方式小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

Spring的主要特性包括IOC和DI,其中DI是IOC的基礎(chǔ)。在以前的Spring使用過程中大部分都是使用XML配置文件顯式配置spring組件,導(dǎo)致大量的XML配置文件以及冗余的XML配置代碼。閱讀《Spring in Action》后總結(jié)Spring的DI功能的三種主要裝配方式以及混合裝配方式

根據(jù)注解自動(dòng)裝配

Spring中有非常豐富的注解,通過這些注解可以方便地配置Spring容器,使得Spring容器可以自動(dòng)識別相關(guān)Bean并做自動(dòng)注入裝配。

使用注解

  • @Component注解:標(biāo)注一個(gè)類,標(biāo)識此類為一個(gè)Java Bean。
  • @Configuration注解:標(biāo)注一個(gè)類,標(biāo)識此類為一個(gè)Java配置類
  • @ComponentScan注解:標(biāo)注一個(gè)類,用以配置掃描的包名稱

示例代碼

這里使用一個(gè)最簡單的例子來展示自動(dòng)裝配的配置,代碼結(jié)構(gòu)如圖所示。

ActionConfig類用于做全局配置,我們知道,一名騎士一般都會(huì)有一匹馬,所以這里Horse和Knight類作為Java Bean被Spring容器創(chuàng)建,并將Horse類的一個(gè)bean注入到Knight中。所以在Horse和Knight中必須使用@Component注解進(jìn)行修飾。

Knight代碼:

package entities;

import org.springframework.stereotype.Component;

/**
 * Created by Administrator on 2017/8/3 0003.
 */
@Component
public class Knight {
  private Horse horse;

  Knight(Horse horse){
    this.horse = horse;
  }

  public void ride(){
    horse.bark();
  }
}

Horse代碼:

package entities;

import org.springframework.stereotype.Component;

/**
 * Created by Administrator on 2017/8/3 0003.
 */
@Component
public class Horse {
  void bark(){
    System.out.println("Horse!!!!");
  }
}

ActionConfig代碼:

package config;

import entities.Knight;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * Created by Administrator on 2017/8/3 0003.
 */
@Configuration
@ComponentScan(basePackageClasses = {Knight.class})
public class ActionConfig {
}

這里的ComponentScan注解內(nèi)的屬性用以注明Knight類所在的包為掃描的基礎(chǔ)包。凡是這個(gè)基礎(chǔ)包及其子包內(nèi)的標(biāo)注了@Component的類都將被視為Java Bean,這些Bean被Spring容器創(chuàng)建和管理。

Java配置類裝配

從自動(dòng)裝配的代碼中,可以看出自動(dòng)裝配是非常簡單方便的。Java配置類進(jìn)行裝配的方式是采用對配置類中的方法進(jìn)行注解標(biāo)注,實(shí)現(xiàn)bean的創(chuàng)建和管理。

還是采用以上的例子,現(xiàn)在我們將上面的自動(dòng)裝配改成Java配置類進(jìn)行裝配。

首先,刪掉Knight和Horse中的@Component注解,刪掉ActionConfig中的@ComponentScn注解,因?yàn)檫@些注解都是自動(dòng)裝配才需要的。

package entities;


/**
 * Created by Administrator on 2017/8/3 0003.
 */
public class Knight {
  private Horse horse;

  public Knight(Horse horse){
    this.horse = horse;
  }

  public void ride(){
    horse.bark();
  }
}


package entities;

/**
 * Created by Administrator on 2017/8/3 0003.
 */
public class Horse {
  void bark(){
    System.out.println("Horse!!!!");
  }
}

ActionConfig類:

package config;

import entities.Horse;
import entities.Knight;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by Administrator on 2017/8/3 0003.
 */
@Configuration
public class ActionConfig {
  @Bean
  public Knight getKnight(){
    return new Knight(getHorse());
  }
  @Bean
  public Horse getHorse(){
    return new Horse();
  }
}

通過@Bean注解對相關(guān)的方法進(jìn)行修飾,Spring就可以知道調(diào)用這些方法來構(gòu)建相應(yīng)的bean,并注入到依賴的對象中。

XML配置文件裝配

使用XML配置文件來裝配組件是最為繁瑣的,需要對各個(gè)bean做一一配置,特別是需要配置構(gòu)造器或者setter的參數(shù)。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

</beans>

以上是一個(gè)空的XML配置文件,看一下就知道,XML真實(shí)復(fù)雜啊...

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  <bean id="knight" class="entities.Knight">
    <constructor-arg ref="horse"></constructor-arg>
  </bean>
  
  <bean id="horse" class="entities.Horse"></bean>
</beans>

通過配置兩個(gè)bean元素,并且通過constructor-arg元素來配置構(gòu)造函數(shù)注入的bean,達(dá)到依賴注入的目的。

導(dǎo)入和混合配置

有時(shí)候單純的XML配置或者Java配置不滿足我們的需求怎么辦呢?Spring支持混合配置的方式來管理bean,通過Java和XML配置的混合,達(dá)到你想要的效果。

Java配置中引用Java配置

在配置類中使用@Import注解進(jìn)行引入另一個(gè)Java配置類。

package config;

import entities.Horse;
import entities.Knight;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * Created by Administrator on 2017/8/3 0003.
 */
@Configuration
@Import(BeautyConfig.class)
public class ActionConfig {
  @Bean
  public Knight getKnight(){
    return new Knight(getHorse());
  }
  @Bean(name = "horse")
  public Horse getHorse(){
    return new Horse();
  }
}

BeautyConfig代碼:

package config;

import entities.Beauty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by Administrator on 2017/8/3 0003.
 */
@Configuration
public class BeautyConfig {
  @Bean
  Beauty getBeauty(){
    return new Beauty();
  }
}

在Main中,只需要通過ActionConfig就可以獲取到所有的上下文對象。

package main;

import config.ActionConfig;
import entities.Beauty;
import entities.Knight;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
 * Created by Administrator on 2017/8/3 0003.
 */
public class Main {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ActionConfig.class);
    Knight knight = context.getBean(Knight.class);
    knight.ride();
    Beauty beauty = context.getBean(Beauty.class);
    beauty.sleep();
  }
}

這里簡單使用Import引入了另一個(gè)配置的Java文件,就實(shí)現(xiàn)了將多個(gè)bean分別配置到多個(gè)Java配置類中。

Java配置中引入XML配置

在Java中引入xml配置的基本方法與引入Java代碼配置類似,只需要將@Import改為@ImportResource,配上xml的文件地址即可。

@ImportResource("classpath:spring.xml")

以上,就是Java配置spring依賴注入的方法。

XML配置中引入XML配置

同理,在XML配置中引入XML也需要使用Import,但是在XML中是import標(biāo)簽,通過使用import標(biāo)簽導(dǎo)入另一個(gè)xml文件。

這里我新建了一個(gè)another.xml的文件,用以作為另一個(gè)配置文件示例。在原有的spring.xml中加入以下代碼:

<import resource="another.xml"></import>

這樣就簡單導(dǎo)入了anoter.xml配置文件。

XML配置中引入Java配置

乍看之下,在XML中似乎沒有標(biāo)簽可以導(dǎo)入Java配置類的,不過任何Java配置類都是一個(gè)bean,所以可以通過配置bean標(biāo)簽來導(dǎo)入Java配置類!

<bean class="config.BeautyConfig"></bean>

通過在XML中配置這個(gè)Java配置類的bean,就直接導(dǎo)入了在Java配置類中的所有bean,真是神奇!

以下是配置XML的全部代碼:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  <import resource="another.xml"></import>
  <bean class="config.BeautyConfig"></bean>
  <bean id="knight" class="entities.Knight">
    <constructor-arg ref="horse"></constructor-arg>
  </bean>

  <bean id="horse" class="entities.Horse"></bean>
</beans>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)多線程下載和斷點(diǎn)續(xù)傳

    Java實(shí)現(xiàn)多線程下載和斷點(diǎn)續(xù)傳

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多線程下載和斷點(diǎn)續(xù)傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 解決struts2 攔截器修改request的parameters參數(shù)失敗的問題

    解決struts2 攔截器修改request的parameters參數(shù)失敗的問題

    這篇文章主要介紹了解決struts2 攔截器修改request的parameters參數(shù)失敗的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java 中動(dòng)態(tài)代理(JDK,cglib)實(shí)例代碼

    java 中動(dòng)態(tài)代理(JDK,cglib)實(shí)例代碼

    這篇文章主要介紹了java 中動(dòng)態(tài)代理,這里介紹了JDK 動(dòng)態(tài)代理與 cglib 動(dòng)態(tài)代理的相關(guān)資料
    2017-04-04
  • spring boot idea maven依賴找不到問題處理方法

    spring boot idea maven依賴找不到問題處理方法

    這篇文章主要介紹了spring boot idea 偶爾maven依賴找不到問題,這里總結(jié)了幾種處理方法,方便嘗試排查,對spring boot idea  maven依賴找不到問題感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • Spring?main方法中如何調(diào)用Dao層和Service層的方法

    Spring?main方法中如何調(diào)用Dao層和Service層的方法

    這篇文章主要介紹了Spring?main方法中調(diào)用Dao層和Service層的方法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringSecurity自定義登錄界面

    SpringSecurity自定義登錄界面

    這篇文章主要為大家詳細(xì)介紹了SpringSecurity自定義登錄界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Java構(gòu)建菜單樹的實(shí)現(xiàn)示例

    Java構(gòu)建菜單樹的實(shí)現(xiàn)示例

    本文主要介紹了Java構(gòu)建菜單樹的實(shí)現(xiàn)示例,像一級菜單,二級菜單,三級菜單甚至更多層級的菜單,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • java字符串反轉(zhuǎn)的7種方法

    java字符串反轉(zhuǎn)的7種方法

    本文主要介紹了java字符串反轉(zhuǎn)的7種方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java POI讀取excel中數(shù)值精度損失問題解決

    Java POI讀取excel中數(shù)值精度損失問題解決

    這篇文章主要介紹了Java POI讀取excel中數(shù)值精度損失問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java中synchronized的幾種使用方法

    Java中synchronized的幾種使用方法

    本文主要介紹了Java中synchronized的幾種使用方法,synchronized可用于修飾普通方法、靜態(tài)方法和代碼塊,下面詳細(xì)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05

最新評論

松原市| 金山区| 独山县| 班玛县| 县级市| 大冶市| 庄河市| 方城县| 灵石县| 常山县| 昂仁县| 阿城市| 浮梁县| 南充市| 广安市| 贞丰县| 靖边县| 达州市| 洪湖市| 钟祥市| 阜新市| 宣武区| 称多县| 荆州市| 镶黄旗| 安阳县| 日土县| 新津县| 长汀县| 萨嘎县| 晋中市| 武定县| 寿光市| 青海省| 深圳市| 苗栗市| 宜都市| 伊宁市| 周宁县| 三亚市| 阜南县|