1. 程式人生 > >記錄一次spring以構造器方式進行依賴注入的錯誤

記錄一次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的思想在哪兒放著呢。