spring:主jar,两个日志包,aop,cglib,juit包
spring可以替hibernate生成session工厂:
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">//先创建session工厂的代理对象
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!--配置事务管理器
<bean id ="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">(也可说是事务管理器)
<property name=""sessionFactory" ref bean="sessionFactory">//通过注入工厂,来生成一个全局性的事务(事务是工厂生成的)
</bean>
<!--事务的传播特性-->//给某些方法增加一个全局性的事务,如add,deteler,modify,
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUWED"/>
<tx:method name="del*" propagation="REQUERD"/>
<tx:method name="modify*" propagation="REQUERD"/>
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
//哪些类的哪些方法需要用到事务
<aop:config>//不需要配置切面,
<aop:pointcut id="allManagerMethod" expression="execution(* com.manager.*.*(..))">//给包下所有类的所有方法增加事务的传播特性
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice">//只有符合point-cut-ref下包的类的方法才会给增删改方法织入事务。
</aop:config>
利用面向切面的方式,给业务层的实现类创建代理对象,如userManager,logManager,在创建的时候不是对象本身,都是代理对象,当调用代理对象的增删改方法时,会调用切面的invoke方法,并在执行增删改方法之前织入advice(这个advice就是事务的传播特性,但会判断是否存在事务运行),然后创建一个全局性的事务。当执行另外一个业务的增删改方法时,若有一个全局性的事务,便不会创建事务,会利用之前的全局性的事务。不同线程也会共享一个事务。 注:此时的同步会放在事务上,这样就把安全级别降到事务上,实现了安全性和效率性的统一。在ThreadLocalMap中不会进行同步,这样也提高的效率。
由于加载数据不用事务,所以在业务层中不会对session进行关闭,为了不造成懒加载异常,通过懒加载过滤器去关闭session。(spring自动提供了一个懒加载的filter)
注:配置sessionFactory的另外一种办法:即不用读取cfg文件,通过spring配置即可:
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost/xiaobai?characterEncoding=utf8"></property>
<property name="username" value="root"></property>
<property name="password" value="102627"></property>
</bean>
<!-- 配置SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.connection.characterEncoding">utf8</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>fgb.entity.user.User</value>
<value>fgb.entity.article.Article</value>
<value>fgb.entity.article.Comment</value>
<value>fgb.entity.article.ArticleClick</value>
<value>fgb.entity.album.Album</value>
<value>fgb.entity.album.Photo</value>
<value>fgb.entity.video.VideoSet</value>
<value>fgb.entity.video.Video</value>
<value>fgb.entity.aboutme.AboutMe</value>
<value>fgb.entity.noteleft.NoteLeft</value>
<value>fgb.entity.noteleft.NoteLeftPraise</value>
<value>fgb.entity.noteleft.NoteLeftReply</value>
<value>fgb.entity.noteleft.NoteLeftReply2</value>
<value>fgb.entity.music.MusicList</value>
<value>fgb.entity.music.Music</value>
</list>
</property>
</bean>