目錄
dao-service-action依賴注入(三層小整合)
User
UserDao
UserService
UserAction
配置檔案(bean.xml)
MainTest(測試類)
運作結果
容易出現的問題
空指針異常
dao-service-action依賴注入(三層小整合)
步驟: user->dao->service->action->bean.xml
User
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}
UserDao
public class UserDao {
public void save(User user) {
user.setId(100);
System.out.println("dao:" + user);
}
}
UserService
public class UserService {
// 原來
// private UserDao userDao = new UserDao();
// spring,userDao執行個體化交給spring來管理
// 要與bean.xml中userService中配置注入的name一緻
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save(User user) {
System.out.println("service:" + user);
userDao.save(user);
}
}
UserAction
public class UserAction {
// 原來
// private UserService userService = new UserService();
// spring,userService執行個體化交給spring來管理
private UserService userService;
// 不交給spring管理
private User user;
// 依賴注入
public void setUserService(UserService userService) {
this.userService = userService;
}
public String save() {
System.out.println("action:" + user);
userService.save(user);
return "reload";
}
public void setUser(User user) {
this.user = user;
}
}
配置檔案(bean.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="cn.mytest.spring.day1.g_di.UserDao" />
<bean id="userService" class="cn.mytest.spring.day1.g_di.UserService" >
<!-- 把上面由spring執行個體化之後的userDao注入到UserService的屬性userDao裡面 -->
<!-- property屬性注入 name=目前類的屬性名 -->
<!-- ref="" value=""隻能同時使用一個, -->
<!-- value注入簡單屬性如字元串,數組, -->
<!-- ref引用,注入對象,填寫是bean的id -->
<!-- public void setUserDAO(UserDao userDAO) { 方法的 本質叫屬性 -->
<!-- property name="userDAO"找目前類setUserDAO,把ref裡面引入的<bean id="userDao"記憶體位址傳入set方法的參數裡面 -->
<property name="userDao" ref="userDao"/>
</bean>
<!-- 以同樣的思路配置UserAction:添加多例 -->
<bean id="userAction" class="cn.mytest.spring.day1.g_di.UserAction" scope="prototype" >
<!-- private UserService userService = new UserService(); -->
<property name="userService" ref="userService"/>
</bean>
</beans>
MainTest(測試類)
// 改變junit運作的類,spring接管了junit
@RunWith(SpringJUnit4ClassRunner.class)
// 加載spring的配置檔案的方式
// 1.spring測試用: 1.從目前包加載配置檔案,隻需要寫配置檔案名稱
// 從目前包擷取spring配置檔案
@ContextConfiguration("bean.xml")
// 2.做web項目時用
// classpath:代碼編譯後的路徑
// java工程:spring/bin
// web工程:shopping/src/main/webapp/WEB-INF/classes
// 從目前包找
// @ContextConfiguration("classpath:cn/mytest/spring/day1/d_test/bean.xml")
// @ContextConfiguration("classpath:applicationContext.xml")
// @ContextConfiguration("/applicationContext.xml")從classpath找
// 3.文檔,什麼都不寫,做測試使用
// 預設找目前類名(加載預設檔案名的配置檔案)-Context.xml:MainTest-Context.xml
// @ContextConfiguration
public class MainTest {
// 注解的spring測試方式 注解注入
@Autowired
UserAction userAction;
@Test
public void testName() throws Exception {
User user = new User();
user.setName("xxx");
userAction.setUser(user);
String result = userAction.save();
System.out.println("傳回視圖名稱:" + result);
}
}
運作結果
容易出現的問題
空指針異常
原因:不該new的地方new了
set方法也許沒寫
代碼修改處
是以是userService沒有采用依賴注入的方式(沒有交給spring管理),而是通過new出來的(自己管理)
但是new的userService并不是空指針異常的所在
真正報空指針異常的地方是
如果都是自己管理的話,運作就和spring管理的運作結果就是一樣的