一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 詳析Spring中依賴注入的三種方式

詳析Spring中依賴注入的三種方式

2020-06-17 12:40daisy JAVA教程

在開發的過程中突然對Spring的依賴注入幾種方式出現混交,打算做個簡單的小結,方便大家和自己以后參考借鑒,如有總結不對的地方,請大家不吝指教!下面來一起看看吧。

前言

平常的java開發中,程序員在某個類中需要依賴其它類的方法,則通常是new一個依賴類再調用類實例的方法,這種開發存在的問題是new的類實例不好統一管理,spring提出了依賴注入的思想,即依賴類不由程序員實例化,而是通過spring容器幫我們new指定實例并且將實例注入到需要該對象的類中。依賴注入的另一種說法是“控制反轉”,通俗的理解是:平常我們new一個實例,這個實例的控制權是我們程序員,而控制反轉是指new實例工作不由我們程序員來做而是交給spring容器來做。

在Spring中依賴注入有四種方式

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

     2、構造函數注入

     3、接口注入(這個現在基本不用)

     4、注解注入(@Autowire)

下面對set方法注入,構造函數注入,以及注解注入的用法舉例說明。

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

UserDao.java

?
1
2
3
4
5
public class UserDao{
 public void inserUser(User user){
  //具體邏輯省略
 }
}

UserService.java

?
1
2
3
public Interface UserService{
 void inserUser(User user);
}

UserServiceImpl.java

?
1
2
3
4
5
6
7
8
9
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配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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 ">
 <!--省略一些無關的配置書寫-->
 <bean id="userDao" class="UserDao"></bean>
 <bean id="userService" class="UserServiceImpl">
 <property name="userDao" ref="userDao">
 </bean>
 </beans>

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

2、構造函數注入

User.java

?
1
2
3
4
5
6
7
8
9
10
public class User{
 //為了簡便,就寫兩個屬性
 private String name;
 private Integer age;
 //關于name,age的getter/setter方法省略
 public User(String name,int age){
  this.name = name;
  this.age = age;
 }
}

現在通過Spring配置文件來注入這User這個對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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 ">
 <!--省略一些無關的配置書寫-->
 <bean id="user" class="User">
  <!--構造函數參數的下標從0開始(避免出現多個構造函數具有相同的參數個數)-->
  <constructor-arg type="java.lang.String" index="0" value="zhangsan"/>
  <constructor-arg type="java.lang.Integer" index="1" value="20>
 </bean>
 </beans>

以上就可以將屬性值注入到User對象中。當然如果想以set方法注入的例子話,其實也一樣。就是在UserServiceImpl需要構造函數,形參就是userDao了,就不需要setter方法了。

那么關于其Spring的配置文件的書寫應該改成這樣

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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 ">
 <!--省略一些無關的配置書寫-->
 <bean id="userDao" class="UserDao"></bean>
 <bean id="userService class="UserServiceImpl">
  <!--構造函數參數的下標從0開始(避免出現多個構造函數具有相同的參數個數)-->
  <constructor-arg index="0" ref="userDao">
 </bean>
 </beans>

這樣也能實現上面set方法注入達到的效果

3、注解注入

我沒試過在這些類上不加@Component,@Service,@Controller等直接@Autowire,是否能成功注入,不過養成一個比較好的編程習慣,建議在相應的層次加上相應的注解。如下例子中UserDao屬于Modul層,在Spring中可以用@Component注解

UserDao.java

?
1
2
3
4
5
6
@Component
public class UserDao{
 public void inserUser(User user){
  //具體邏輯省略
 }
}

UserService.java

?
1
2
3
public Interface UserService{
 void inserUser(User user);
}

UserServiceImpl.java

?
1
2
3
4
5
6
7
8
9
//引入相應的Spring包
@Service
public class UserServiceImpl implements UserService{
 @Autowire
 private UserDao userDao;
 public void insertUser(User user){
  userDao.insert(user);
 }
}

Spring對應的配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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 ">
 <!--省略一些無關的配置書寫-->
 <!--*代表對所有的包進行掃描,在實際開發中可以根據涉及到注解組件的包進行掃描-->
 <context:component-scan base-package="*">
<!-- 開啟組件掃描 -->
</context:component-scan>
<context:annotation-config>
<!--開啟注解處理器-->
</context:annotation-config>
 
 <bean id="userDao" class="UserDao"></bean>
 <bean id="userService" class="UserServiceImpl"/>
 </beans>

不過在開發過程中既開啟了set方法注入,有開啟了注解注入的話,Spring會首選set注入的,所以不忘了提供相應的set方法的,否則會出現失敗。

通過比較,注解注入要比其余注入要方便的多,代碼和配置文件也寫的少,在開發的過程中還是建議使用注解注入。

總結

以上就是關于Spring中依賴注入的幾種方式的全部介紹,希望能對大家的學習或者工作帶來一定的幫助,如果有疑問大家也可以留言交流,謝謝大家對服務器之家的支持。

延伸 · 閱讀

精彩推薦
  • JAVA教程java調用中國天氣網api獲得天氣預報信息的方法

    java調用中國天氣網api獲得天氣預報信息的方法

    這篇文章主要介紹了java調用中國天氣網api獲得天氣預報信息的方法,可實現調用溫度、風力風向及近期天氣狀況等功能,具有一定參考借鑒價值,需要的朋友可...

    愷哥3382019-12-26
  • JAVA教程Java多線程和并發基礎面試題(問答形式)

    Java多線程和并發基礎面試題(問答形式)

    多線程和并發問題是Java技術面試中面試官比較喜歡問的問題之一。在這里,從面試的角度列出了大部分重要的問題,感興趣的小伙伴們可以參考一下 ...

    java教程網1972020-05-15
  • JAVA教程簡述mybatis大于小于的轉義

    簡述mybatis大于小于的轉義

    這篇文章主要介紹了mybatis大于小于的轉義以及xml中常用轉義字符,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    河岸飛流4312020-06-12
  • JAVA教程SpringMVC+MyBatis聲明式事務管理

    SpringMVC+MyBatis聲明式事務管理

    在最近的一個項目中,采用springMVC、mybatis,MySQL、tomcat,事務管理對于企業應用來說是至關重要的,即使出現異常情況,它也可以保證數據的一致性。Sprin...

    hebedich2262020-01-03
  • JAVA教程Java中使用JDBC操作數據庫簡單實例

    Java中使用JDBC操作數據庫簡單實例

    這篇文章主要介紹了Java中使用JDBC操作數據庫簡單實例,本文以Mysql為例介紹使用Java JDBC操作數據庫的6個步驟,需要的朋友可以參考下 ...

    junjie2072019-12-24
  • JAVA教程小議Java中@param注解與@see注解的作用

    小議Java中@param注解與@see注解的作用

    這篇文章主要介紹了Java中@param注解與@see注解的作用,注解的功能類似于通常代碼中的注釋,需要的朋友可以參考下 ...

    爪哇小博1492020-03-13
  • JAVA教程java貪吃蛇極速版

    java貪吃蛇極速版

    這篇文章主要為大家分享了java貪吃蛇極速版,貪吃蛇經典手機游戲,既簡單又耐玩,本文用java來實現下貪吃蛇小游戲,感興趣的小伙伴可以參考下 ...

    July1512020-03-12
  • JAVA教程Java中使用數組實現棧數據結構實例

    Java中使用數組實現棧數據結構實例

    這篇文章主要介紹了Java中使用數組實現棧數據結構實例,本文先是講解了實現棧至少應該包括以下幾個方法等知識,然后給出代碼實例,需要的朋友可以參考下...

    junjie1632019-12-08
主站蜘蛛池模板: 欧美日韩中文国产一区二区三区 | 国产综合久久久久久 | 欧美精选欧美极品 | 91亚洲一区二区在线观看不卡 | gayxxx视频| 国产日产欧产精品精品软件 | 久久免费看少妇高潮A片特爽 | 天天做天天爱天天一爽一毛片 | chinese真实incest| 四虎成人影院网址 | 成人福利网站含羞草 | 欧美影院一区二区 | 91九色在线视频 | 色综合天天综合中文网 | jux629三浦理惠子在线播放 | 大又大又粗又爽女人毛片 | 欧美香蕉人人人人人人爱 | 私人影院在线免费观看 | 国产一级在线观看视频 | 羞羞色男人的天堂伊人久久 | 第一福利在线视频 | 亚洲国产高清视频 | 午夜dj免费视频观看社区 | 东方影视欧美天天影院 | 欧美人shou交在线播放 | 手机免费在线视频 | 黑人操日本妞 | 激情影院免费 | а天堂中文最新版在线官网视频 | 四虎1515hh.com| 日本xxxxx69hd日本 | 99热这里只有精品免费 | 国产精品高清在线 | 日本一区二区在线不卡 | 亚洲国产三级在线观看 | 国产成人久久精品一区二区三区 | 国产v日韩v欧美v精品专区 | 亚洲视频一区二区在线观看 | 国产剧情一区二区三区 | 国产成人精品系列在线观看 | 亚洲国产综合网 |