前面我们模拟了一下用spring创建dao对象的案例并测试.也就是原来我们数据持久层的代码,我们下面深入一下,我们以前是在表示层就直接调用了下面的数据持久层,但是现在咱们需要业务逻辑层.所以我们用service这层来实现一下业务逻辑层的代码
首先我们还是用原来的传统方式做一下.我们在上面案例的基础上实现
在src下创建一个service的包,里面定义一个UserService接口
package service;
public interface UserService {
void addUser();
void deleteUser();
}
同样的我们在service这个包下面创建一个子目录impl,里面创一个UserServiceImpl类来实现上面的UserService接口
package service.impl;
import dao.UserDao;
import dao.impl.UserDaoImpl;
import service.UserService;
public class UserServiceImpl implements UserService {
/*
* 注意:咱们Service是做业务逻辑处理
* 和数据库相关的东西我们还是要调用dao的.所以下面的adduser和deleteUser
* 原则上判断验证完了之后,还需要调用dao中的方法
* 所以我们需要先有dao的对象
*/
/*
* 我们以前是这么写的:
*/
UserDao dao = new UserDaoImpl();
@Override
public void addUser() {
dao.addUser();
}
@Override
public void deleteUser() {
dao.deleteUser();
}
}
下面我们来测试一样:在Tset类中
package test;
import service.UserService;
import service.impl.UserServiceImpl;
public class Test {
public static void main(String[] args) {
//Service 的测试
UserService service = new UserServiceImpl();
service.addUser();
service.deleteUser();
//输出结果
//添加用户
//删除用户
}
}
上面是我们原来的写法.我想大家应该都明白.下面我们通过spring来实现工厂创建和管理.首先我们看UserServiceImpl这个现实类.里面还是手动创建UserDao的实现类对象.首先这里我们就不能再这么干啦.那我们如何让UserServiceImol得到UserDao的实现类对象呢?这里我们有两种方式,一个是通过构造器给它传入一个,一个就是setter方法.我们来修改一下UserServiceImpl这个类
package service.impl;
import dao.UserDao;
import service.UserService;
public class UserServiceImpl implements UserService {
private UserDao dao;
//构造器
/*public UserServiceImpl(UserDao dao) {
super();
this.dao = dao;
}*/
//set方法 我们这里选择这种
public void setDao(UserDao dao) {
this.dao = dao;
}
@Override
public void addUser() {
dao.addUser();
}
@Override
public void deleteUser() {
dao.deleteUser();
}
}
这样我们只要得到UserDao这个接口的实现类对象,然后传入到上面的setter方法中就可以了.但是我们现在还不能和上面的测试一样,得到UserServeiceImpl的实现类对象就调用UserService中的方法,因为UserServeiceImpl还需要传入一个UserDao的实现类对象.现在我们还没有传入UserDao的实现类对象,会出现空指针异常.
我们下面来继续配置一下applicationContext.xml配置文件,因为我们要通过容器创建UserService的实现类对象.同事我们一块解决在用容器创建对象的同时向里面传入对象的成员属性的问题
<?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标签代表配置管理一个对象,这里我们要用bean来创建和管理UserDao的对象
id:这个对象的唯一标识
class:类的完全限定名称
-->
<bean id="userdao" class="dao.impl.UserDaoImpl"></bean>
<!-- 测试类中首先要得到一个UserService的实现类对象 我们做如下配置-->
<bean id="userservice" class="service.impl.UserServiceImpl">
<!--property中的参数,就是给属性来赋值的
name:属性的名称 这里就是UserServiceImpl中的成员属性dao(虽然咱们写的是dao,但是它内部调用的是setter方法赋值的)
value:值 只赋值简单类型的值 比如字符串,123等等 这里我们就不能用value了
ref:引用的意思 赋的值是一个对象 给dao赋一个实现类对象
我们浏览整个配置文件,发现上面已经配置了这样一个UserDao对象,所以我就可以将上面的bean的id值传进来
-->
<property name="dao" ref="userdao"></property>
</bean>
</beans>
我们再来测试一下:
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.UserService;
public class Test {
public static void main(String[] args) {
//得到容器对象
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext.xml");
//得到UserService的实现类对象
UserService service = ac.getBean("userservice", UserService.class);
service.addUser();
service.deleteUser();
}
}
我们看下结果
十月 26, 2018 10:52:44 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7e6cbb7a: startup date [Fri Oct 26 22:52:44 CST 2018]; root of context hierarchy
十月 26, 2018 10:52:44 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
添加用户
删除用户
回顾上面我们配置配置文件的时候传入成员变量的方式,其实就是实现了依赖注入.在创建对象的时候,将对象依赖的内容进行赋值就是所谓的依赖注入.