javascript
Spring【依赖注入】就是这么简单
前言
在Spring的第二篇中主要講解了Spring Core模塊的使用IOC容器創建對象的問題,Spring Core模塊主要是解決對象的創建和對象之間的依賴關系,因此本博文主要講解如何使用IOC容器來解決對象之間的依賴關系!
回顧以前對象依賴
我們來看一下我們以前關于對象依賴,是怎么的歷程
直接new對象
- 在最開始,我們是直接new對象給serice的userDao屬性賦值...
寫DaoFactory,用字符串來維護依賴關系
后來,我們發現service層緊緊耦合了dao層。我們就寫了DaoFactory,在service層只要通過字符串就能夠創建對應的dao層的對象了。
DaoFactory
- serivce
DaoFactory讀取配置文件
再后來,我們發現要修改Dao的實現類,還是得修改service層的源代碼呀..于是我們就在DaoFactory中讀取關于daoImpl的配置文件,根據配置文件來創建對象,這樣一來,創建的是哪個daoImpl對service層就是透明的
DaoFactory
```java
public class DaoFactory {
private UserDao userdao = null;private DaoFactory(){try{InputStream in = DaoFactory.class.getClassLoader().getResourceAsStream("dao.properties");Properties prop = new Properties();prop.load(in);String daoClassName = prop.getProperty("userdao");userdao = (UserDao)Class.forName(daoClassName).newInstance();}catch (Exception e) {throw new RuntimeException(e);} }private static final DaoFactory instance = new DaoFactory();public static DaoFactory getInstance(){return instance; }public UserDao createUserDao(){return userdao; }}
```
- service
Spring依賴注入
通過上面的歷程,我們可以清晰地發現:對象之間的依賴關系,其實就是給對象上的屬性賦值!因為對象上有其他對象的變量,因此存在了依賴...
Spring提供了好幾種的方式來給屬性賦值
- 1) 通過構造函數
- 2) 通過set方法給屬性注入值
- 3) p名稱空間
- 4)自動裝配(了解)
- 5) 注解
搭建測試環境
- UserService中使用userDao變量來維護與Dao層之間的依賴關系
UserAction中使用userService變量來維護與Service層之間的依賴關系
userDao
- userService
- userAnction
構造函數給屬性賦值
其實我們在講解創建帶參數的構造函數的時候已經講過了...我們還是來回顧一下唄..
我們測試service和dao的依賴關系就好了....在serice中加入一個構造函數,參數就是userDao
public UserService(UserDao userDao) {this.userDao = userDao;//看看有沒有拿到userDaoSystem.out.println(userDao);}applicationContext.xml配置文件
<!--創建userDao對象--><bean id="userDao" class="UserDao"/><!--創建userService對象--><bean id="userService" class="UserService"><!--要想在userService層中能夠引用到userDao,就必須先創建userDao對象--><constructor-arg index="0" name="userDao" type="UserDao" ref="userDao"></constructor-arg></bean>- 測試:可以成功獲取到userDao對象
通過set方法給屬性注入值
我們這里也是測試service和dao層的依賴關系就好了...在service層通過set方法來把userDao注入到UserService中
- 為UserService添加set方法
applicationContext.xml配置文件:通過property節點來給屬性賦值
- 引用類型使用ref屬性
- 基本類型使用value屬性
- 測試:
內部Bean
我們剛才是先創建userDao對象,再由userService對userDao對象進行引用...我們還有另一種思維:先創建userService,發現userService需要userDao的屬性,再創建userDao...我們來看看這種思維方式是怎么配置的:
applicationContext.xml配置文件:property節點內置bean節點
<!-- 1.創建userService,看到有userDao這個屬性 2.而userDao這個屬性又是一個對象 3.在property屬性下又內置了一個bean 4.創建userDao --><bean id="userService" class="UserService"><property name="userDao"><bean id="userDao" class="UserDao"/></property></bean>- 測試
我們發現這種思維方式和服務器訪問的執行順序是一樣的,但是如果userDao要多次被其他service使用的話,就要多次配置了...
p 名稱空間注入屬性值
p名稱控件這種方式其實就是set方法的一種優化,優化了配置而已...p名稱空間這個內容需要在Spring3版本以上才能使用...我們來看看:
applicationContext.xml配置文件:使用p名稱空間
<bean id="userDao" class="UserDao"/><!--不用寫property節點了,直接使用p名稱空間--><bean id="userService" class="UserService" p:userDao-ref="userDao"/>- 測試
自動裝配
Spring還提供了自動裝配的功能,能夠非常簡化我們的配置
自動裝載默認是不打開的,自動裝配常用的可分為兩種:
- 根據名字來裝配
- 根據類型類裝配
XML配置根據名字
applicationContext.xml配置文件:使用自動裝配,根據名字
<bean id="userDao" class="UserDao"/><!-- 1.通過名字來自動裝配 2.發現userService中有個叫userDao的屬性 3.看看IOC容器中沒有叫userDao的對象 4.如果有,就裝配進去 --><bean id="userService" class="UserService" autowire="byName"/>- 測試
XML配置根據類型
applicationContext.xml配置文件:使用自動裝配,根據類型
值得注意的是:如果使用了根據類型來自動裝配,那么在IOC容器中只能有一個這樣的類型,否則就會報錯!
<bean id="userDao" class="UserDao"/><!-- 1.通過名字來自動裝配 2.發現userService中有個叫userDao的屬性 3.看看IOC容器UserDao類型的對象 4.如果有,就裝配進去 --><bean id="userService" class="UserService" autowire="byType"/>- 測試:
我們這只是測試兩個對象之間的依賴關系,如果我們有很多對象,我們也可以使用默認自動分配
使用注解來實現自動裝配
@Autowired注解來實現自動裝配:
- 可以在構造器上修飾
- 也可以在setter方法上修飾
- **來自java的@Inject的和@AutoWired有相同的功能**
如果沒有匹配到bean,又為了避免異常的出現,我們可以使用required屬性上設置為false。【謹慎對待】
-
測試代碼
@Component public class UserService {private UserDao userDao ;@Autowired public void setUserDao(UserDao userDao) {this.userDao = userDao; } }
順利拿到userDao的引用
使用JavaConfig配置類實現對象依賴
在
- 第一種(測試不出來)
- 第二種(測試不出來)
- 如果我直接通過構造器傳入的話,那么報錯了
- 我測試中只有通過這種方法才能拿到userDao的引用。
當然了,最簡單直觀的方法還有一種:在UserService中加入setUser()方法,那么只要set進去就行了..
- UserService
- Config
最后
擴展閱讀:
- https://zhuanlan.zhihu.com/p/29426019
如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y
更多的文章可往:文章的目錄導航總結
以上是生活随笔為你收集整理的Spring【依赖注入】就是这么简单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORA-28002: the passw
- 下一篇: 论写题解的重要性