spring目的:为了实现程序之间的解耦,实现new操作。因此,spring就是一个大工厂。
spring可以实现,dao层与service层的解耦,service层与factory的解耦。传统的方式在构造方法中new对象。
spring将工厂模式需要的类型class(具体的类)、识别号id都放在配置文件中,初始化时候找到spring的配置文件,读取参数,创建对象。
spring创建的对象是单例的。
例如:
domain对象:
public class Department {
private Long id;
private String name;
//get set 方法,构造方法
}
dao接口:
public interface IDepartmentDAO {
public void save(Department department);
public void update(Department department);
}
dao实现:
public class DepartmentDAOHibImpl implements IDepartmentDAO {
@Override
public void save(Department department) {
System.out.println("save department use hibernate ...");
}
@Override
public void update(Department department) {
System.out.println("update deparment use hibernate");
}
}
public class DepartmentDAOJdbcImpl implements IDepartmentDAO{
@Override
public void save(Department department) {
System.out.println("save department use jdbc...");
}
@Override
public void update(Department department) {
System.out.println("update department use jdbc....");
}
}
service层:
public class DepartmentServiceImpl {
private IDepartmentDAO DAO;
//在配置文件中,告诉service要使用那个dao
public void setDAO(IDepartmentDAO dAO) {
DAO = dAO;
}
/**
* 构造方法中初始化
*/
/*public DepartmentServiceImpl() {
//DAO = new DepartmentDAOJdbcImpl();//传统方式 第一种方式
//初始化spring 第二种方式,这种方式没有实现service层与factory层的解耦
Resource resource = new ClassPathResource("application.xml");
BeanFactory factory = new XmlBeanFactory(resource);
DAO = factory.getBean("departmentDAOJdbc", IDepartmentDAO.class);
}*/
public void save(){
System.out.println("save department and excute other service");
DAO.save(new Department(1l, "username"));
}
public void update(){
System.out.println("update department and excute other service");
DAO.update(new Department(2l, "password"));
}
}
配置文件:application.xml
<bean id="departmentDAOHib" class="com.Liaq.cd.DepartmentDAOHibImpl"/>
<bean id="departmentDAOJdbc" class="com.Liaq.cd.DepartmentDAOJdbcImpl"/>
<bean id="departmentService" class="com.Liaq.cd.DepartmentServiceImpl">
<property name="DAO" ref="departmentDAOHib"></property>
</bean>
junit4测试:
public class TestSpring {
@Test
public void test(){//查看spring代理dao
//初始化spring
Resource resource = new ClassPathResource("application.xml");
BeanFactory factory = new XmlBeanFactory(resource);
//从工厂中得到bean
// IDepartmentDAO departmentDAO = (IDepartmentDAO) factory.getBean("departmentDAOHib");
IDepartmentDAO departmentDAO = factory.getBean("departmentDAOJdbc", IDepartmentDAO.class);
departmentDAO.save(new Department());
}
@Test
public void testService(){//spring 代理service层
Resource resource = new ClassPathResource("application.xml");
BeanFactory factory = new XmlBeanFactory(resource);
//得到spring的bean
DepartmentServiceImpl departmentService = (DepartmentServiceImpl) factory.getBean("departmentService");
departmentService.save();
}
}