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);
}
}
运行结果
容易出现的问题
扫描二维码关注公众号,回复:
4708892 查看本文章
空指针异常
原因:不该new的地方new了
set方法也许没写
代码修改处
所以是userService没有采用依赖注入的方式(没有交给spring管理),而是通过new出来的(自己管理)
但是new的userService并不是空指针异常的所在
真正报空指针异常的地方是
如果都是自己管理的话,运行就和spring管理的运行结果就是一样的