記錄一次spring以構造器方式進行依賴注入的錯誤
自己的程式碼如下:(MVC模式)
這是主測試類:
package com.gzz.spring04_DI; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestUserController { private UserController userController; public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/gzz/spring04_DI/applicationContext.xml"); UserController userController = new UserController(); userController.login(); } } |
下面是Controller
package com.gzz.spring04_DI; public class UserController { private UserService userService; public void login() { userService.login(); } public UserController() { super(); } public UserController(UserService userService) { super(); System.out.println("我是UserController帶引數的構造方法,我被執行了"); this.userService = userService; } } |
下面是Service
package com.gzz.spring04_DI; public class UserService { private UserDao userDao; public void login() { userDao.login(); } public UserService () { } public UserService (UserDao userDao) { System.out.println("UserService帶引數的構造器"); this.userDao=userDao; } } |
下面是dao
package com.gzz.spring04_DI; public class UserDao { public void login() { System.out.println("登入成功"); } } |
我的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-4.3.xsd"> <bean name="usercontroller" class="com.gzz.spring04_DI.UserController"> <constructor-arg name="userservice" ref="userservice" ></constructor-arg> </bean> <bean name="userservice" class="com.gzz.spring04_DI.UserService" > <constructor-arg name="userdao" ref="userdao" ></constructor-arg> </bean> <bean name="userdao" class="com.gzz.spring04_DI.UserDao"></bean> </beans> |
大家知道我的錯在哪裡麼?
我在以構造器依賴注入時寫的name是:
但是我宣告依賴關係的時候是:
這就相當於spring根據你要宣告的要去依賴別的類的那個類竟然在建立的時候找不到。
這個錯誤等同於在xml配置中配置了一個bean,<bean name=”userController” class=”....”>
。但是在test類中得到spring為你提供的物件userController時你卻用了這樣的接收語句:
UserController userController = (UserController) applicationContext.getBean("usercontroller");
spring可是大小寫敏感的,它可不認識usercontroller,它的記憶體中可只有叫userController名字的對應包對應類下的物件。
同樣,我們可以猜想一下,當spring要給你依賴注入的物件時(以構造方法的形式注入),首先要去你的那個類下找到你的宣告好的那個物件,只不過現在是在棧裡的一個變數,它的值是null,還沒有new,也就是意味著沒有掛載任何具體物件的記憶體,那如果這時候你給spring說我要找到的變數是a,但是spring找找找,沒有a,只有最相似的A,spring是大小寫敏感的,那麼這時候是不是就要(開發spring的人)給spring提供錯誤的描述好讓別人看我的spring更智慧,還能給你錯誤的提示(實則程式的健壯性好)。但我實在是看不懂他給的錯誤提示,可能現在spring還沒有進化到哪個程度(還不夠智慧)。
另外一個與上一個錯誤比起裡無關緊要的錯誤就是我在test裡面建立的是自己的物件。一定要用spring創造好的物件啊,不然spring沒辦法管理你建立的物件。這就是控制反轉IoC。
交給spring去做,然後調調裡面的方法搭搭積木。但spring是別人寫的,畢竟不是自己的,自己不可能對他那麼熟悉。那開發spring的人肯定不會犯這樣的錯誤,畢竟開發spring的思想在哪兒放著呢。