hibernate和spring添加切面配置是如何搞得,请各位大神指点我,谢谢啦
Spring整合Hibernate是一个比较大的问题,根据我的理解,概括来说有以下步骤:
1.Spring声明DataSource数据源的SpringBean实例;
2.Spring声明Hibernate的SessionFactory,Spring中有对Hibernate的SessionFactory类的封装类,通常只需要声明Spring中的Hibernate封装类即可,然后利用Spring容器的依赖注入,把数据源(dataSource)注入给同样是Spring Bean实例的SessionFactory对象,同时列出所有的持久化(PO)类。
3.把SessionFactory对象再注入给Dao方法,在Dao方法中利用SessionFactory实例对数据进行CRUD;
4.Dao类一般仅用于单一的CRUD,真正的业务逻辑实现通常被定义在Service类中,Dao类的实例通过Spring依赖注入被注入给Service类实例;
5.在真正的企业应用中,利用Spring对Hibernate进行事务管理也是十分重要的,而事务管理通常是利用Spring的面向切面编程(AOP)对Service类进行增强从而达到事务控制的目的。
以下是一个配置文件示例,我假定楼主已经有了Spring和Hibernate的基础:
<?xml version="1.0" encoding="GBK"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!--定义数据源bean,使用C3P0数据源实现,并注入数据源的必要信息-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close"
p:driverClass="oracle.jdbc.OracleDriver"
p:jdbcUrl="jdbc:oracle:thin:@localhost:1521:orcl"
p:user="scott"
p:password="tiger"
p:maxPoolSize="5"
p:minPoolSize="2"
p:initialPoolSize="2"
p:maxIdleTime="30"/>
<!--定义Hibernate的SessionFactory,SessionFactory需要依赖注入源,注入dataSource-->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
p:dataSource-ref="dataSource">
<!-- 指定持久化(PO)类-->
<property name="annotatedClasses">
<list>
<value>org.hrsystem.domain.Aoo</value>
</list>
</property>
<!-- 指定Hibernate的属性配置-->
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=false
hibernate.cache.use_second_level_cache=true
hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
</value>
</property>
</bean>
<!--把sessionFactory注入给employeeDao Bean实例-->
<bean id="employeeDao" class="org.hrsystem.dao.impl.EmployeeDaoImpl"
p:sessionFactory-ref="sessionFactory"/>
<!--把employeeDao注入给empManager Bean实例-->
<bean id="empManager" class="org.hrsystem.service.impl.EmpManagerImpl" p:employeeDao-ref="employeeDao"/>
<!--
以下是利用Spring的AOP对Hibernate进行事务控制
-->
<!-- 配置Hibernate的声明事务管理器,并依赖注入SessionFactory -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 配置事务增强Bean,依赖注入事务管理器 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 配置详细的事务定义,这些配置放在tx:attributes元素中 -->
<tx:attributes>
<!-- 定义对可以作为AOP切入点的所有方法都进行事务增强
name属性指定AOP切入点中需要进行事务增强的方法,
用*(通配符)指代所有方法,或get*指代所有以get开头的方法;
isolation属性指定隔离级别,用默认的隔离级别;
propagation属性指定事务的传播性,REQUIRED指如果调用该方法的线程处于事务中,
则直接调用;如果当前执行线程不处于事务环境中,则启动新的事务后执行该方法;
timeout事务超时的时间,以秒为单位;
-->
<tx:method name="*" isolation="DEFAULT"
propagation="REQUIRED" timeout="5"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 定义切入点,此时仅仅指定empManager实例作为需要增强的实例,
也可以使用Spring EL表达式来指定具有相同特征的一批类作为切入点 -->
<aop:pointcut id="myPoint"
expression="bean(empManager)"/>
<!-- 使用aop:advisor元素指定在myPoint切入点使用txAdvice进行事务增强处理 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPoint"/>
</aop:config>
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。