日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring-Bean的依赖注入分析-01

發布時間:2024/10/5 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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實現類

public class UserDaoImpl implements UserDao {@Overridepublic void save1() {System.out.println("save running...");} }

(2)創建UserService接口以及UserServiceImpl實現類
注意:這里使用了在UserServiceImplt中添加了UserDao屬性,因為使用set方法進行注入,所以實現屬性的set方法

public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void sava() {userDao.save1();} }

(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前端代碼改成如下

public class UserController {public static void main(String[] args) { // ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); // UserService service = (UserService) context.getBean("userService"); // service.sava();UserService userService=new UserServiceImpl();userService.sava();} }

我們不從容器中獲取UserService對象了,自己new了一個UserService對象,然后調用方法,這樣會出現什么情況呢

我們發現出現了空指針異常,然后定位到代碼錯誤處

16行出現了userDao報了空,那么也就是第8行空,那這是什么原因呢?
原因是:我們的UserService對象不是從容器中獲取的,而是自己new出來的,那么UserDao是在spring容器中注入給UserService的,你不從spring容器中獲取UserService對象,那么就會出現UserDao為空的異常


下一篇博客我們講通過p命名空間注入,簡化操作

總結

以上是生活随笔為你收集整理的Spring-Bean的依赖注入分析-01的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。