javascript
Spring-Bean的依赖注入分析-01
###我們先通過一個例子弄明白為什么要使用依賴注入###
1.創建業務層UserService接口及UserServiceImpl實現類(接口代碼省略)
public class UserServiceImpl implements UserService {@Overridepublic void sava() {ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");UserDao userDao1 = (UserDao) app.getBean("userDao");userDao1.save();} }2.創建DAO層的UserDao接口及UserDaoImpl實現類(接口代碼省略)
public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("save running...");} }3.配置spring的applicationContext.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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="userDao" class="com.hao.dao.impl.UserDaoImpl"/><bean id="userService" class="com.hao.service.impl.UserServiceImpl"/> </beans> //告訴spring容器類的位置,使用bean將service類和dao類配置到spring配置文件中, //id為唯一性標識,外部可以通過getBean("id");從spring容器中獲取對象4.Controller層進行測試
public class UserController {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");UserService service = (UserService) context.getBean("userService");service.sava();} } //加載spring配置文件,創建spring容器 //通過getBean方法獲取從spring容器中對象分析:目前UserSerivce實例和UserDao實例都存在spring容器當中,當前的做法是外部從spring容器獲得UserService實例和UserDao實例,然后在程序中完成調用
思考:我們在Controller層用的是service,不管Dao是怎么獲取的,我們想那么能不能在spring容器內部就完成service調用Dao的操作呢?
(因為UserService和UserDao都在spring的容器中,而最終程序直接使用的是UserService,所以可以在spring容器中,將UserDao設置到UserService內部)
===================================================
然后實現以上問題就是使用依賴注入了
依賴注入:它是spring框架核心IOC的具體實現
在編寫程序時,通過控制反轉,把對象的創建交給了spring,但是代碼中不可能出現沒有依賴的情況。IOC解耦只是降低他們的依賴關系,但不會消除,例如:業務層仍會調用持久層的方法
那這種業務層和持久層的依賴關系,在使用spring之后,就讓Spring來維護了。
簡單的說:就是坐等框架把持久層對象傳入業務層,而不用我們自己去獲取
=========================================================================================================================================================
接下來就是dao注入給service了
1.構造方法
2.set方法
演示set方法注入
(1)創建UserDao接口以及UserDaoImpl實現類
(2)創建UserService接口以及UserServiceImpl實現類
注意:這里使用了在UserServiceImplt中添加了UserDao屬性,因為使用set方法進行注入,所以實現屬性的set方法
(3)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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="userDao" class="com.hao.dao.impl.UserDaoImpl"/><bean id="userService" class="com.hao.service.impl.UserServiceImpl">//這里面的name屬性值是set方法名去掉set三個字和U變小寫,ref屬性是引入dao中bean實例的id標識符,這里是第一個bean標簽中的id<property name="userDao" ref="userDao"></property></bean> </beans>(4)Controller前端測試
public class UserController {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");UserService service = (UserService) context.getBean("userService");service.sava();} }結果:save running . . .
這樣就實現了set注入
進階點:
接下來我們來思考一個問題,如果我把Controller前端代碼改成如下
我們不從容器中獲取UserService對象了,自己new了一個UserService對象,然后調用方法,這樣會出現什么情況呢
我們發現出現了空指針異常,然后定位到代碼錯誤處
16行出現了userDao報了空,那么也就是第8行空,那這是什么原因呢?
原因是:我們的UserService對象不是從容器中獲取的,而是自己new出來的,那么UserDao是在spring容器中注入給UserService的,你不從spring容器中獲取UserService對象,那么就會出現UserDao為空的異常
下一篇博客我們講通過p命名空間注入,簡化操作
總結
以上是生活随笔為你收集整理的Spring-Bean的依赖注入分析-01的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring配置文件-Bean实例化的三
- 下一篇: spring-bean依赖注入-02(通