1. 程式人生 > >Spring中註解bean和事務?有哪些相關的註解?踩坑

Spring中註解bean和事務?有哪些相關的註解?踩坑

  1. <context:component-scanbase-package="org.example"/>
  2. 然後可以用@Component、@Controller、@Service、@Repository註解來標註需要由Spring IoC容器進行物件託管的類。這幾個註解沒有本質區別,只不過@Controller通常用於控制器,@Service通常用於業務邏輯類,@Repository通常用於倉儲類(例如我們的DAO實現類),普通的類用@Component來標註。
  3. <!-- 自動掃描元件,這裡要把web下面的 controller去除,他們是在spring-mvc.xml中配置的,如果不去除會影響事務管理的。 -->
    <context:component-scan base-package="com.cfcmms">
    <context:exclude-filter type="annotation"
    expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
 在主容器中(applicationContext.xml),將Controller的註解打消掉


<!-- 自動掃描元件,這裡要把web下面的 controller去除,他們是在spring-mvc.xml中配置的,如果不去除會影響事務管理的。 --> <context:component-scan base-package="com.cfcmms"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>

2 而在springMVC配置檔案中將Service註解給去掉


<!-- 把標記了@Controller註解的類轉換為bean --> <context:component-scan base-package="com.cfcmms.**.controller"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan>


為spring的context是父子容器,所以會產生衝突,Controller會進步前輩行掃描裝配,而此時的Service還沒有進行事務的加強處
理懲罰,獲得的將是原樣的Service(沒有經過事務加強處理懲罰,故而沒有事務處理懲罰才能)
,最後才是applicationContext.xml中的掃描裝置進行事務處理
這個用的是 hibernate5 的sessionFactory 配置的session事務
<!-- 配置一個事務管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>


<!-- 事務管理 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 定義以下開頭的方法名都是隻讀的模式 -->
<tx:method name="select*" read-only="true" />
<tx:method name="count*" read-only="true" />
<tx:method name="get*" read-only="true" />
<tx:method name="query*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="load*" read-only="true" />
<!-- 其他所有方法都使用事務 -->
<tx:method name="*" propagation="REQUIRED" read-only="false"
rollback-for="Exception" />
</tx:attributes>
</tx:advice>


<!-- 事務 aop 配置 -->
<aop:config>
<!-- 定義一個切入點 -->
<aop:pointcut id="serviceMethods"
expression="execution(* com.cfcmms..*.service.*Service.*(..))" />
<!-- 對切入點和事務的通知,進行適配 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"
order="2" />
<!-- 多資料來源切換 -->
<aop:aspect ref="dataSourceAspect" order="1">
<aop:before method="intercept" pointcut-ref="serviceMethods" />
</aop:aspect>
</aop:config>


<!-- 啟用對事務註解的支援 -->
<tx:annotation-driven transaction-manager="transactionManager" />
153、Spring支援的事務管理型別有哪些?你在專案中使用哪種方式?答:Spring支援程式設計式事務管理和宣告式事務管理。許多Spring框架的使用者選擇宣告式事務管理,因為這種方式和應用程式的關聯較少,因此更加符合輕量級容器的概念。宣告式事務管理要優於程式設計式事務管理,儘管在靈活性方面它弱於程式設計式事務管理,因為程式設計式事務允許你通過程式碼控制業務。事務分為全域性事務和區域性事務。全域性事務由應用伺服器管理,需要底層伺服器JTA支援(如WebLogic、WildFly等)。區域性事務和底層採用的持久化方案有關,例如使用JDBC進行持久化時,需要使用Connetion物件來操作事務;而採用Hibernate進行持久化時,需要使用Session物件來操作事務。Spring提供瞭如下所示的事務管理器。事務管理器實現類 目標物件DataSourceTransactionManager 注入DataSourceHibernateTransactionManager 注入SessionFactoryJdoTransactionManager 管理JDO事務JtaTransactionManager 使用JTA管理事務PersistenceBrokerTransactionManager 管理Apache的OJB事務這些事務的父介面都是PlatformTransactionManager。Spring的事務管理機制是一種典型的策略模式,PlatformTransactionManager代表事務管理介面,該介面定義了三個方法,該介面並不知道底層如何管理事務,但是它的實現類必須提供getTransaction()方法(開啟事務)、commit()方法(提交事務)、rollback()方法(回滾事務)的多型實現,這樣就可以用不同的實現類代表不同的事務管理策略。使用JTA全域性事務策略時,需要底層應用伺服器支援,而不同的應用伺服器所提供的JTA全域性事務可能存在細節上的差異,因此實際配置全域性事務管理器是可能需要使用JtaTransactionManager的子類,如:WebLogicJtaTransactionManager(Oracle的WebLogic伺服器提供)、UowJtaTransactionManager(IBM的WebSphere伺服器提供)等。

相關推薦

Spring註解bean事務哪些相關註解

<context:component-scanbase-package="org.example"/>然後可以用@Component、@Controller、@Service、@Repository註解來標註需要由Spring IoC容器進行物件託管的類。這幾個註

spring xml配置beancontext:component-scan掃描註解註冊bean的區別

本文啟動spring容器用的是dubbo的main方法 1.xml配置bean: 2.<context:component-scan>掃描註解註冊bean: 測試猜測結果: 前者啟動spring容器時建立bean

Spring如何使用註解來配置Bean哪些相關註解

首先需要在Spring配置檔案中增加如下配置:<context:component-scan base-package="org.example"/>然後可以用@Component、@Con

Spring通過變數import標籤來控制載入哪些bean

  需求:根據設定變數,來載入某個spring的bean的配置檔案,這個配置檔案中,有某些使用的bean。在一些情況下,不希望這些bean被初始化和載入進context中,也不需要被外面訪問到。   在spring中,我們通過placeholder類可以讀取配置檔案,裡面可以設定引數,而在配置檔案或容器中使

事務哪些特性?spring事務管理幾種方式實現,如何實現?spring 常用的兩種事務配置方式以及事務的傳播性、隔離級別

事務有哪些特性?             1.原子性:一個事務中所有對資料庫的操作是一個不可分割的操作序列,要麼全做要麼全不做            2.一致性:資料不會因為事務的執行而遭到破壞            3.隔離性:一個事物的執行,不受其他事務的干擾,即併發執

spring <bean>的id name 的區分

lifecycle 文件中 空格 當前 基本類 分號 推薦 第一個 沖突 1. id 和name 屬性作用上一樣,推薦使用id; 2. id取值要求嚴格些,必須滿足XML的命名規範。id是唯一的,配置文件中不允許出現兩個id相同的<bean>。 3. name取

springBean的idname的區別

spring中的Bean的id和name的區別 2017年10月01日 18:23:59 冰河家園 閱讀數:296 標籤: spring 更多 個人分類: spring Spring中Bean的命名 1、每個Bean可以有一個id屬性,並可以根據該id在IoC容器中查詢該Bean

易學筆記-第2章:springBean/2.6 環境引數佔位符

第2章:spring中的Bean/2.6 環境引數和佔位符/2.6.1 環境引數/2.6.1.1 概念 概念與設定 指的是為了區分不同的環境而設定的引數,比如開發環境和生產環境   第2章:spring中的Bean/2.6 環境引數和佔

Spring的@Bean註解在方法上的作用

首先我們看一下這個註解的類 import org.springframework.context.annotation.Bean;   @Bean("dd")     public User getControllBean(){  &

SpringBean容器都哪些

最近正在重讀《Spring In Action》一書,把裡面的知識點再回顧一遍。 BeanFactory是一個頂層介面,是最基本的Bean容器。Spring使用BeanFactory來生成,配置和管理Bean。 ApplicationContext是BeanFactory的子類,它比B

如何讓serveltFilter注入到spring容器或者在servlet呼叫springbean

在應用中一般普通的JavaPojo都是由Spring來管理的,所以使用autowire註解來進行注入不會產生問題,但是有兩個東西是例外的,一個是 Filter,一個是Servlet,這兩樣東西都是由Servlet容器來維護管理的,所以如果想和其他的Bean一

通過註解的方式在spring註冊bean

1.首先你得讓spring容器知道你編寫的類是使用了註解方式 在sessionFactory的屬性packageToScan中寫上你的使用了註解類的包名  注意:如果你是使用的list,在value之間一定不要有空格,否者容器不能掃描到類。 2.幾種有必要知道的註解含義 @

spring建立bean物件時多例單例的區別

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w

單例模式,惡漢式懶漢式哪些區別。各使用在哪裡?為什麼說推薦使用惡漢式

餓漢式:        public class Singleton{            private static Singleton singleton = new Singleton ();            private Singleton (){}  

[每日一問]---Java支援的資料型別哪些?什麼是自動裝箱拆箱?

Java支援的資料型別包括兩種:基本資料型別、引用型別 1)基本資料型別有8種: byte、short、int、long、float、double、boolean、char 2)引用型別: 如S

JavaScript的布林值falsetrue哪些

在JavaScript中,false型別有: 1.undefined 2.‘ ’ //空字串 3.null 4.false 5.NaN //值NaN是一個數值,表示一個不能產生正常結果的運算

對象在類的存儲方式哪些

執行文件 結構 交換 文件中 用戶 lan 邏輯 長度 由於 對象類型和整型、字符串等類型一樣,也是PHP中的一種數據類型。都是在程序中用於存儲不同類型數據使用的,在程序運行時它的每部分內容都要先加載到內存中再被使用。那麽對象類型的數據在內存中是如何分配的呢?先來了解一下內

Spring 的IOCDI

註入 機制 容器 返回 其他 工作 一個 請求 功能 IOC是一種叫做“控制反轉”的設計思想。 1、較淺的層次——從名字上解析 “控制”就是指對 對象的創建、維護、銷毀等生命周期的控制,這個過程一般是由我們的程序去主動控制的,如使用new關鍵字去創建一個對象(創建),在使用

半夜思考之查漏補缺 , Spring Bean 繼承機制

size 完全 font 區別 nbsp spring 多態 實例 ont 這裏的繼承 , 不是 Java 中的繼承 , 下面就總結下 Bean繼承與Java繼承的區別: Spring 中的子類 Bean 和父 Bean 可以是不同類型 , 但是 Java

SpringBean配置

jdbc 子節點 drive 互訪 app 互訪問 style car 註意 IOC&DI概述 OPC(Inversion of Control):其思想是反轉資源獲取的方向。傳統的資源查找方式要求組件向容器發起請求查找資源。作為回應,容器適時的返回資源。而應用