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>