Spring基础学习笔记(五)

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管理的运行结果就是一样的

猜你喜欢

转载自blog.csdn.net/qq_37438795/article/details/85224194