天天看點

Spring基礎學習筆記(五)dao-service-action依賴注入(三層小整合)

目錄

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>
           
Spring基礎學習筆記(五)dao-service-action依賴注入(三層小整合)

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);

	}

}
           

運作結果

Spring基礎學習筆記(五)dao-service-action依賴注入(三層小整合)

容易出現的問題

空指針異常

  原因:不該new的地方new了

             set方法也許沒寫

Spring基礎學習筆記(五)dao-service-action依賴注入(三層小整合)

代碼修改處 

Spring基礎學習筆記(五)dao-service-action依賴注入(三層小整合)
Spring基礎學習筆記(五)dao-service-action依賴注入(三層小整合)

是以是userService沒有采用依賴注入的方式(沒有交給spring管理),而是通過new出來的(自己管理)

但是new的userService并不是空指針異常的所在

真正報空指針異常的地方是

Spring基礎學習筆記(五)dao-service-action依賴注入(三層小整合)

如果都是自己管理的話,運作就和spring管理的運作結果就是一樣的

繼續閱讀