欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳析Spring中依賴(lài)注入的三種方式

 更新時(shí)間:2016年09月23日 09:57:22   投稿:daisy  
在開(kāi)發(fā)的過(guò)程中突然對(duì)Spring的依賴(lài)注入幾種方式出現(xiàn)混交,打算做個(gè)簡(jiǎn)單的小結(jié),方便大家和自己以后參考借鑒,如有總結(jié)不對(duì)的地方,請(qǐng)大家不吝指教!下面來(lái)一起看看吧。

前言

平常的java開(kāi)發(fā)中,程序員在某個(gè)類(lèi)中需要依賴(lài)其它類(lèi)的方法,則通常是new一個(gè)依賴(lài)類(lèi)再調(diào)用類(lèi)實(shí)例的方法,這種開(kāi)發(fā)存在的問(wèn)題是new的類(lèi)實(shí)例不好統(tǒng)一管理,spring提出了依賴(lài)注入的思想,即依賴(lài)類(lèi)不由程序員實(shí)例化,而是通過(guò)spring容器幫我們new指定實(shí)例并且將實(shí)例注入到需要該對(duì)象的類(lèi)中。依賴(lài)注入的另一種說(shuō)法是“控制反轉(zhuǎn)”,通俗的理解是:平常我們new一個(gè)實(shí)例,這個(gè)實(shí)例的控制權(quán)是我們程序員,而控制反轉(zhuǎn)是指new實(shí)例工作不由我們程序員來(lái)做而是交給spring容器來(lái)做。

在Spring中依賴(lài)注入有四種方式

     1、set注入(通常也叫屬性注入)

     2、構(gòu)造函數(shù)注入

     3、接口注入(這個(gè)現(xiàn)在基本不用)

     4、注解注入(@Autowire)

下面對(duì)set方法注入,構(gòu)造函數(shù)注入,以及注解注入的用法舉例說(shuō)明。

1、set方法注入(屬性注入)

UserDao.java

public class UserDao{
 public void inserUser(User user){
  //具體邏輯省略
 }
}

UserService.java

public Interface UserService{
 void inserUser(User user);
}

UserServiceImpl.java

public class UserServiceImpl implements UserService{
 private UserDao userDao;
 public void setUserDao(UserDao userDao){
  this.userDao = userDao;
 }
 public void insertUser(User user){
  userDao.insert(user);
 }
}

Spring配置文件

<?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:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-2.5.xsd ">
 <!--省略一些無(wú)關(guān)的配置書(shū)寫(xiě)-->
 <bean id="userDao" class="UserDao"></bean>
 <bean id="userService" class="UserServiceImpl">
 <property name="userDao" ref="userDao">
 </bean>
 </beans>

以上就可以把userDao注入到UserServiceImpl中

2、構(gòu)造函數(shù)注入

User.java

public class User{
 //為了簡(jiǎn)便,就寫(xiě)兩個(gè)屬性
 private String name;
 private Integer age;
 //關(guān)于name,age的getter/setter方法省略
 public User(String name,int age){
  this.name = name;
  this.age = age;
 }
}

現(xiàn)在通過(guò)Spring配置文件來(lái)注入這User這個(gè)對(duì)象

<?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:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-2.5.xsd ">
 <!--省略一些無(wú)關(guān)的配置書(shū)寫(xiě)-->
 <bean id="user" class="User">
  <!--構(gòu)造函數(shù)參數(shù)的下標(biāo)從0開(kāi)始(避免出現(xiàn)多個(gè)構(gòu)造函數(shù)具有相同的參數(shù)個(gè)數(shù))-->
  <constructor-arg type="java.lang.String" index="0" value="zhangsan"/>
  <constructor-arg type="java.lang.Integer" index="1" value="20>
 </bean>
 </beans>

以上就可以將屬性值注入到User對(duì)象中。當(dāng)然如果想以set方法注入的例子話,其實(shí)也一樣。就是在UserServiceImpl需要構(gòu)造函數(shù),形參就是userDao了,就不需要setter方法了。

那么關(guān)于其Spring的配置文件的書(shū)寫(xiě)應(yīng)該改成這樣

<?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:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-2.5.xsd ">
 <!--省略一些無(wú)關(guān)的配置書(shū)寫(xiě)-->
 <bean id="userDao" class="UserDao"></bean>
 <bean id="userService class="UserServiceImpl">
  <!--構(gòu)造函數(shù)參數(shù)的下標(biāo)從0開(kāi)始(避免出現(xiàn)多個(gè)構(gòu)造函數(shù)具有相同的參數(shù)個(gè)數(shù))-->
  <constructor-arg index="0" ref="userDao">
 </bean>
 </beans>

這樣也能實(shí)現(xiàn)上面set方法注入達(dá)到的效果

3、注解注入

我沒(méi)試過(guò)在這些類(lèi)上不加@Component,@Service,@Controller等直接@Autowire,是否能成功注入,不過(guò)養(yǎng)成一個(gè)比較好的編程習(xí)慣,建議在相應(yīng)的層次加上相應(yīng)的注解。如下例子中UserDao屬于Modul層,在Spring中可以用@Component注解

UserDao.java

@Component
public class UserDao{
 public void inserUser(User user){
  //具體邏輯省略
 }
}

UserService.java

public Interface UserService{
 void inserUser(User user);
}

UserServiceImpl.java

//引入相應(yīng)的Spring包
@Service
public class UserServiceImpl implements UserService{
 @Autowire
 private UserDao userDao;
 public void insertUser(User user){
  userDao.insert(user);
 }
}

Spring對(duì)應(yīng)的配置文件

<?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:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-2.5.xsd ">
 <!--省略一些無(wú)關(guān)的配置書(shū)寫(xiě)-->
 <!--*代表對(duì)所有的包進(jìn)行掃描,在實(shí)際開(kāi)發(fā)中可以根據(jù)涉及到注解組件的包進(jìn)行掃描-->
 <context:component-scan base-package="*">
<!-- 開(kāi)啟組件掃描 -->
</context:component-scan>
<context:annotation-config>
<!--開(kāi)啟注解處理器-->
</context:annotation-config>

 <bean id="userDao" class="UserDao"></bean>
 <bean id="userService" class="UserServiceImpl"/>
 </beans>

不過(guò)在開(kāi)發(fā)過(guò)程中既開(kāi)啟了set方法注入,有開(kāi)啟了注解注入的話,Spring會(huì)首選set注入的,所以不忘了提供相應(yīng)的set方法的,否則會(huì)出現(xiàn)失敗。

通過(guò)比較,注解注入要比其余注入要方便的多,代碼和配置文件也寫(xiě)的少,在開(kāi)發(fā)的過(guò)程中還是建議使用注解注入。

總結(jié)

以上就是關(guān)于Spring中依賴(lài)注入的幾種方式的全部介紹,希望能對(duì)大家的學(xué)習(xí)或者工作帶來(lái)一定的幫助,如果有疑問(wèn)大家也可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Java數(shù)據(jù)導(dǎo)出功能之導(dǎo)出Excel文件實(shí)例

    Java數(shù)據(jù)導(dǎo)出功能之導(dǎo)出Excel文件實(shí)例

    這篇文章主要介紹了Java數(shù)據(jù)導(dǎo)出功能之導(dǎo)出Excel文件實(shí)例,本文給出了jar包的下載地址,并給出了導(dǎo)出Excel文件代碼實(shí)例,需要的朋友可以參考下
    2015-06-06
  • 從0開(kāi)始學(xué)習(xí)大數(shù)據(jù)之java spark編程入門(mén)與項(xiàng)目實(shí)踐

    從0開(kāi)始學(xué)習(xí)大數(shù)據(jù)之java spark編程入門(mén)與項(xiàng)目實(shí)踐

    這篇文章主要介紹了從0開(kāi)始學(xué)習(xí)大數(shù)據(jù)之java spark編程入門(mén)與項(xiàng)目實(shí)踐,結(jié)合具體入門(mén)項(xiàng)目分析了大數(shù)據(jù)java spark編程項(xiàng)目建立、調(diào)試、輸出等相關(guān)步驟及操作技巧,需要的朋友可以參考下
    2019-11-11
  • Java基礎(chǔ)知識(shí)之注解、元注解

    Java基礎(chǔ)知識(shí)之注解、元注解

    ava 注解,從名字上看是注釋,解釋。但功能卻不僅僅是注釋那么簡(jiǎn)單,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)知識(shí)之注解、元注解的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • mybatis 加載配置文件的方法(兩種方式)

    mybatis 加載配置文件的方法(兩種方式)

    這篇文章主要介紹了mybatis 加載配置文件的方法,通過(guò)實(shí)例代碼給大家介紹了mybatis 加載配置文件的兩種方式,需要的朋友可以參考下
    2017-12-12
  • 淺談常用字符串與集合類(lèi)轉(zhuǎn)換的工具類(lèi)

    淺談常用字符串與集合類(lèi)轉(zhuǎn)換的工具類(lèi)

    下面小編就為大家?guī)?lái)一篇淺談常用字符串與集合類(lèi)轉(zhuǎn)換的工具類(lèi)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • 詳解SSM框架下結(jié)合log4j、slf4j打印日志

    詳解SSM框架下結(jié)合log4j、slf4j打印日志

    本篇文章主要介紹了詳解SSM框架下結(jié)合log4j、slf4j打印日志,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • springboot實(shí)現(xiàn)rabbitmq的隊(duì)列初始化和綁定

    springboot實(shí)現(xiàn)rabbitmq的隊(duì)列初始化和綁定

    這篇文章主要介紹了springboot實(shí)現(xiàn)rabbitmq的隊(duì)列初始化和綁定,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • springBoot?啟動(dòng)指定配置文件環(huán)境多種方案(最新推薦)

    springBoot?啟動(dòng)指定配置文件環(huán)境多種方案(最新推薦)

    springBoot?啟動(dòng)指定配置文件環(huán)境理論上是有多種方案的,一般都是結(jié)合我們的實(shí)際業(yè)務(wù)選擇不同的方案,比如,有pom.xml文件指定、maven命令行指定、配置文件指定、啟動(dòng)jar包時(shí)指定等方案,今天我們一一分享一下,需要的朋友可以參考下
    2023-09-09
  • PowerJob LockService方法工作流程源碼解讀

    PowerJob LockService方法工作流程源碼解讀

    這篇文章主要為大家介紹了PowerJob LockService方法工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Spring?BOOT?AOP基礎(chǔ)應(yīng)用教程

    Spring?BOOT?AOP基礎(chǔ)應(yīng)用教程

    這篇文章主要介紹了Spring?BOOT?AOP的使用,文章從相關(guān)問(wèn)題展開(kāi)全文內(nèi)容詳情,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07

最新評(píng)論