考虑到接口编程以及分层的问题,我们将面向数据与服务分开操作。
具体操作如下,接着上一篇文章往下走。
第五步,我们实现注解功能,在spring的配置文件applicationContext.xml中添加如下代码:
<!-- 此方法除了具有<context:annotation-config />的功能之外,
还具有自动将带有@component,@service,@Repository等注解的对象注册到spring容器中的功能。
这种方法 所产生的的处理那些注解的处理器工具,会处理所有绑定到容器上面的bean,不管是通过xml手动注册的还是通过scanning扫描注册的
当<context:annotation-config />和 <context:component-scan>同时存在的时候,前者会被忽略。-->
<context:component-scan base-package="com.ssh.dao.impl"/>
第六步,配置事务管理器,进行统一管理事务,依旧是在applicationContext.xml中配置,如下:
<!-- 配置事务管理器,统一管理sessionFactory的事务 -->
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 启用事务注解 -->
<tx:annotation-driven transaction-manager="txManager"/>
第七步,我们对项目进行分层管理,新建如下包:
第八步,按照分层结构来实现相关代码,如下:
PersonDao接口的代码:
package com.ssh.dao;
import com.ssh.po.Person;
public interface PersonDao {
//添加
public void save(Person person);
}
PersonDaoImpl对象的代码:
package com.ssh.dao.impl;
import javax.annotation.Resource;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;
import com.ssh.dao.PersonDao;
import com.ssh.po.Person;
@Transactional
public class PersonDaoImpl implements PersonDao {
// 用@Resource注解方式进行依赖注入
@Resource
private SessionFactory sessionFactory;
@Override
public void save(Person person) {
/**
* 以前我们通过sessionFactory对象得到session,是通过sessionFactory.openSession()得到的,
* 但在此,我们需要注意一点,因为Spring会自动地帮我们管理事务,就是说它会自动地帮我们管理session对象,
* 所以这时我们只须通过sessionFactory.getCurrentSession()从Spring容器里面得到当前
* 被Spring容器管理的session对象。
*/
// 建议使用persist()方法,和JTA规范保持一致,与save()作用一样
sessionFactory.getCurrentSession().persist(person);
}
}
接下来是服务层。
PersonService接口的代码:
package com.ssh.service;
import com.ssh.po.Person;
public interface PersonService {
//添加
public void save(Person person);
}
PersonServiceImpl对象的代码:
package com.ssh.service.impl;
import com.ssh.dao.PersonDao;
import com.ssh.po.Person;
import com.ssh.service.PersonService;
public class PersonServiceImpl implements PersonService {
private PersonDao personDao;
public PersonDao getPersonDao() {
return personDao;
}
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
@Override
public void save(Person person) {
personDao.save(person);
}
}
第九步,我们需要在spring的配置文件applicationContext.xml中配置相关dao和service的bean:
<!-- 配置dao层对象 -->
<bean id="personDaoImpl" class="com.ssh.dao.impl.PersonDaoImpl" />
<!-- 配置service层对象-->
<bean id="personServiceImpl" class="com.ssh.service.impl.PersonServiceImpl">
<property name="personDao" ref="personDaoImpl" />
</bean>
第十步,在TestSSH中进行测试,其代码如下:
package com.ssh.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ssh.po.Person;
import com.ssh.service.PersonService;
public class TestSSH {
public static void main(String[] args) {
//获取applicationContext
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
// TestPojo testPojo = (TestPojo) ac.getBean("testPojo");
// System.out.println(testPojo.getName());
//得到PersonServiceImpl
PersonService personService = (PersonService) ac.getBean("personServiceImpl");
//此处测试hibernate
Person person = new Person("李斯", "upload/photo2");
personService.save(person);
}
}
第十一步,如果测试成功,为如下结果:
数据库中将存在如下数据: