很多天没有更新Blog,平时虽然工作不忙,但是回到家我是不想写东西,今天周末例外。前三章已经说了Hibernate的0配置过程,现在该轮到Spring了。我们的项目里,一般将spring作为service bean的容器,这样的用法会有3个地方会和spring的配置有关系。
1. 利用xml配置来注册service bean到spring中。
2. 利用spring的xml来定义数据库Connnection,hibernate Session等信息。
3. 利用spring的xml来管理servcice方法的事务。
其中第二条,只要在一个总的地方配置一次就可以了,所以把这部分信息做0配置处理也没什么意义,反正项目中肯定会有一个applicationContext.xml的文件,配在那里就可以了,也不会使得文件变大很多。
对于第三条来说,由于spring是支持正则表达式的方式来对一系列类和一系列的方法进行事务配置,所以只要我们定好类的命名规范,方法的命名规范,这些信息也是只需要在总的配置文件里面配置一次就可以的。
比如:
定下类的命名规范是所有leeon.service包下所有名字叫xxxxxxService的类
定下方法的命名规范是,所有getXXXX,listXXXXX,findXXXX,queryXXXX,validXXXX的方法,事务配置成supports,其余的配置成required。
我这里说一下另一种方式来配置事务,就是利用Spring提供的@Transactional标记。启动这类的事务配置方式,需要在applicationContext文件中加入这样一段话
接下来我们就可以在service bean上面使用annotation了。@Transactional可以配置在接口上,也可以配置在实现类上,可以配置在接口方法上,也可以配置在实现类的方法上,优先级是实现类方法 > 接口方法 > 实现类 > 接口类。我们的项目中一般都会对service bean建一个接口,所以一般我将这个标签配置在接口的类和接口的方法上。类上给出一个默认的配置,一般是查询用的配置,再在具体的部分方法上配置写数据库方法的事务。
[code]
@Transactional(readOnly = true, propagation = Propagation. NEVER)
public interface ILessonService {
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void saveOrUpdateLesson(Lesson lesson) throws Exception;
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void removeLesson(Long[] ids) throws Exception;
public List<Map<String, String>> listLesson(PageInfo pager, OrderInfo order, Map<String, Object> filter) throws Exception;
public Lesson loadLesson(Long id) throws Exception;
public List<Map<String, String>> listLessonByStudent(Long studentId, PageInfo pager, OrderInfo order, Map<String, Object> filter) throws Exception;
public List<String> listLessonNoByStudentNotSelected(Long studentId) throws Exception;
public Long findLessonByNo(String no) throws LessonNotExistException, Exception;
}
[/code]
这样一看,大家都会立刻明白事务的配置情况,很清楚。接下就剩下一个地方要大量使用spring xml配置文件,就是将service bean注册到spring容器的地方。
其实,网上已经有一个spring的annotation包,可以解决这个问题,让spring实现0 xml配置,但是这个包需要jdk1.6来支持,我们的项目还跑在jdk1.5上,所以我只好再次自己去扩展spring。不过如果能用jdk1.6,我肯定还是会选择这个spring的annotation包的。
1. 利用xml配置来注册service bean到spring中。
2. 利用spring的xml来定义数据库Connnection,hibernate Session等信息。
3. 利用spring的xml来管理servcice方法的事务。
其中第二条,只要在一个总的地方配置一次就可以了,所以把这部分信息做0配置处理也没什么意义,反正项目中肯定会有一个applicationContext.xml的文件,配在那里就可以了,也不会使得文件变大很多。
对于第三条来说,由于spring是支持正则表达式的方式来对一系列类和一系列的方法进行事务配置,所以只要我们定好类的命名规范,方法的命名规范,这些信息也是只需要在总的配置文件里面配置一次就可以的。
比如:
定下类的命名规范是所有leeon.service包下所有名字叫xxxxxxService的类
定下方法的命名规范是,所有getXXXX,listXXXXX,findXXXX,queryXXXX,validXXXX的方法,事务配置成supports,其余的配置成required。
我这里说一下另一种方式来配置事务,就是利用Spring提供的@Transactional标记。启动这类的事务配置方式,需要在applicationContext文件中加入这样一段话
<tx:annotation-driven/>
接下来我们就可以在service bean上面使用annotation了。@Transactional可以配置在接口上,也可以配置在实现类上,可以配置在接口方法上,也可以配置在实现类的方法上,优先级是实现类方法 > 接口方法 > 实现类 > 接口类。我们的项目中一般都会对service bean建一个接口,所以一般我将这个标签配置在接口的类和接口的方法上。类上给出一个默认的配置,一般是查询用的配置,再在具体的部分方法上配置写数据库方法的事务。
[code]
@Transactional(readOnly = true, propagation = Propagation. NEVER)
public interface ILessonService {
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void saveOrUpdateLesson(Lesson lesson) throws Exception;
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void removeLesson(Long[] ids) throws Exception;
public List<Map<String, String>> listLesson(PageInfo pager, OrderInfo order, Map<String, Object> filter) throws Exception;
public Lesson loadLesson(Long id) throws Exception;
public List<Map<String, String>> listLessonByStudent(Long studentId, PageInfo pager, OrderInfo order, Map<String, Object> filter) throws Exception;
public List<String> listLessonNoByStudentNotSelected(Long studentId) throws Exception;
public Long findLessonByNo(String no) throws LessonNotExistException, Exception;
}
[/code]
这样一看,大家都会立刻明白事务的配置情况,很清楚。接下就剩下一个地方要大量使用spring xml配置文件,就是将service bean注册到spring容器的地方。
其实,网上已经有一个spring的annotation包,可以解决这个问题,让spring实现0 xml配置,但是这个包需要jdk1.6来支持,我们的项目还跑在jdk1.5上,所以我只好再次自己去扩展spring。不过如果能用jdk1.6,我肯定还是会选择这个spring的annotation包的。