javascript
【Spring】Spring第三天 - 声明式事务、常用注解、Ajax 复习
一.自動注入
1.在Spring 配置文件中對象名和ref=”id” . id 名相同,使用自動注入,可以不配置<property/>
2.兩種配置辦法
2.1 在<bean>中通過autowire=””配置,只對這個<bean>生效
2.2 在<beans>中通過default-autowire=””配置,表當當前文件中所有<bean>都是全局配置內容
3.autowire=”” 可取值
3.1 default: 默認值,根據全局default-autowire=””值.默認全局和局部都沒有配置情況下,相當于no
3.2 no: 不自動注入
3.3 byName: 通過名稱自動注入.在 Spring 容器中找類的 id
3.4 byType: 根據類型注入.
3.4.1 spring 容器中不可以出現兩個相同類型的<bean>
3.5 constructor: 根據構造方法注入.
3.5.1 提供對應參數的構造方法(構造方法參數中包含注入對象)
3.5.2 底層使用byName, 構造方法參數名和其他<bean>的id相同.
二. Spring 中加載 properties 文件
1. 在 src 下新建 xxx.properties 文件
2. 在spring 配置文件中先引入xmlns:context,在下面添加
2.1 如果需要記載多個配置文件逗號分割
3. 添加了屬性文件記載,并且在<beans>中開啟自動注入注意的地方
3.1 【注意】由于自動注入的優先級別較高,ref影響了bean的加載順序,所以SqlSessionFactoryBean 的id不能叫做sqlSessionFactory,否則,會由于錯誤的加載順序導致加載不到配置文件報錯
3.2 修改
3.2.1 把原來通過ref 引用替換成value 賦值,自動注入只能影響ref,不會影響value 賦值
4. 在被Spring 管理的類中通過@Value(“${key}”)取出 properties 中內容
4.1 添加注解掃描
4.2 在類中添加@Value,示例如下:
4.2.1 key 和變量名可以不相同
4.2.2 變量類型任意,只要保證 key 對應的 value 能轉換成這個類型就可以.
三.scope 屬性
1. <bean>的屬性
2. 作用:控制對象有效范圍(單例,多例等)
3. <bean/>標簽對應的對象默認是單例的.
3.1 無論獲取多少次,都是同一個對象
4. scope 可取值如下:
4.1 singleton 默認值,單例(常用)
4.2 prototype 多例,每次獲取重新實例化(常用)
4.3 request 每次請求重新實例化
4.4 session 每個會話對象內,對象是單例的.
4.5 application 在 application 對象內是單例
4.6 global session spring 推出的一個對象, 依賴于 spring-webmvc-portlet ,類似于 session
四.單例設計模式
1. 作用: 在應用程序有保證最多只能有一個實例.
2. 好處:
2.1 提升運行效率.
2.2 實現數據共享. 案例: application 對象
3. 懶漢式
3.1 對象只有被調用時才去創建.
3.2 示例代碼
3.3 由于添加了鎖,所以導致效率低.
4. 餓漢式
4.1 解決了懶漢式中多線程訪問可能出現同一個對象和效率低問題
五. 聲明式事務
1.編程式事務:
1.1 由程序員編程事務控制代碼.
1.2 OpenSessionInView 編程式事務
2.聲明式事務:
2.1 事務控制代碼已經由spring 寫好.程序員只需要聲明出哪些方法需要進行事務控制和如何進行事務控制.
3.聲明式事務都是針對于 ServiceImpl 類下方法的.
4.事務管理器基于通知(advice)的.
5.在spring 配置文件中配置聲明式事務
<context:property-placeholder location="classpath:db.properties,classpath:second.properties" /> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${jdbc.driver}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property> </bean> <!-- spring-jdbc.jar 中 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置聲明式事務 --> <tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes><!-- 哪些方法需要有事務控制 --><!-- 方法以ins 開頭事務管理 --><tx:method name="ins*" /><tx:method name="del*" /><tx:method name="upd*" /><tx:method name="*" /></tx:attributes> </tx:advice> <aop:config><!-- 切點范圍設置大一些 --><aop:pointcut expression="execution(* com.bjsxt.service.impl.*.*(..))" id="mypoint" /><aop:advisor advice-ref="txAdvice" pointcut-ref="mypoint" /> </aop:config>六.聲明式事務中屬性解釋
1. name=”” 哪些方法需要有事務控制
1.1 支持*通配符
2. readonly=”boolean” 是否是只讀事務.
2.1 如果為true,告訴數據庫此事務為只讀事務.數據庫層面的優化,會對性能有一定提升,所以,只要是(只進行)查詢操作的方法,建議使用此配置.
2.2 如果為false(默認值),事務需要提交的事務.建議在需要進行新增,刪除,修改的操作中使用此配置.
3. propagation 控制事務傳播行為.
3.1 當一個具有事務控制的方法被另一個有事務控制的方法調用后,需要如何管理事務(新建事務?在事務中執行?把事務掛起?報異常?)
3.2 REQUIRED (默認值): 如果當前有事務,就在事務中執行,如果當前沒有事務,新建一個事務.
3.3 SUPPORTS:如果當前有事務就在事務中執行,如果當前沒有事
務,就在非事務狀態下執行.
3.4 MANDATORY:必須在事務內部執行,如果當前有事務,就在事務中執行,如果沒有事務,報錯.
3.5 REQUIRES_NEW:必須在事務中執行,如果當前沒有事務,新建事務,如果當前有事務,把當前事務掛起.
3.6 NOT_SUPPORTED:必須在非事務下執行,如果當前沒有事務,正常執行,如果當前有事務,把當前事務掛起.
3.7 NEVER:必須在非事務狀態下執行,如果當前沒有事務,正常執行,如果當前有事務,報錯.
3.8 NESTED:必須在事務狀態下執行.如果沒有事務,新建事務,如果當前有事務,創建一個嵌套事務.
4. isolation=”” 事務隔離級別
4.1 在多線程或并發訪問下如何保證訪問到的數據具有完整性的.
4.2 臟讀:
4.2.1 一個 事務(A) 讀取到另一個 事務(B) 中未提交的數據,另一個事務中數據可能進行了改變,此時 A 事務讀取的數據可能和數據庫中數據是不一致的,此時認為數據是臟數據,讀取臟數據過程叫做臟讀.
4.3 不可重復讀:
4.3.1 主要針對的是某行數據.(或行中某列)
4.3.2 主要針對的操作是修改操作.
4.3.3 兩次讀取在同一個事務內
4.3.4 當 事務A 第一次讀取事務后,事務B 對事務A 讀取的數據進行修改, 事務A 中再次讀取的數據和之前讀取的數據不一致,過程不可重復讀.
4.4 幻讀:
4.4.1 主要針對的操作是新增或刪除
4.4.2 兩次事務的結果.
4.4.3 事務A 按照特定條件查詢出結果, 事務B 新增了一條符合條件的數據. 事務A 中查詢的數據和數據庫中的數據不一致的, 事務A 好像出現了幻覺,這種情況稱為幻讀.
4.5 DEFAULT: 默認值,由底層數據庫自動判斷應該使用什么隔離界別
4.6 READ_UNCOMMITTED: 可以讀取未提交數據,可能出現臟讀,不重復讀,幻讀.
4.6.1 效率最高.
4.7 READ_COMMITTED:只能讀取其他事務已提交數據.可以防止臟讀,可能出現不可重復讀和幻讀.
4.8 REPEATABLE_READ: 讀取的數據被添加鎖,防止其他事務修改此數據,可以防止不可重復讀.臟讀,可能出現幻讀.
4.9 SERIALIZABLE: 排隊操作,對整個表添加鎖.一個事務在操作數據時,另一個事務等待事務操作完成后才能操作這個表.
4.9.1 最安全的
4.9.2 效率最低的.
5. rollback-for=”異常類型全限定路徑”
5.1 當出現什么異常時需要進行回滾
5.2 建議:給定該屬性值.
5.2.1 手動拋異常一定要給該屬性值.
6. no-rollback-for=””
6.1 當出現什么異常時不滾回事務.
程序執行過程中,遇到錯誤需要處理時,不一定是返回null,還可以拋異常進行終止。
而且《代碼整潔之道》中推薦,用拋異常代替返回null值來處理。
七. Spring 中常用注解.
面試提問:你用過Spring的那些注解?
1. @Component 創建類對象,相當于配置<bean/>
2. @Service 與@Component 功能相同.
2.1 寫在ServiceImpl 類上.
3. @Repository 與@Component 功能相同.
3.1 寫在數據訪問層類上.
4. @Controller 與@Component 功能相同.
4.1 寫在控制器類上.
5. @Resource(不需要寫對象的get/set)
5.1 java 中的注解
5.2 默認按照byName 注入,如果沒有名稱對象,按照byType 注入
5.2.1 建議把對象名稱和 spring 容器中對象名相同
6. @Autowired(不需要寫對象的get/set)
6.1 spring 的注解
6.2 默認按照byType 注入.
7. @Value() 獲取 properties 文件中內容
8. @Pointcut() 定義切點
9. @Aspect() 定義切面類
10. @Before() 前置通知
11. @After 后置通知
12. @AfterReturning 后置通知,必須切點正確執行
13. @AfterThrowing 異常通知
14. @Arround 環繞通知
八. Ajax 復習
1. 標準請求響應時瀏覽器的動作(同步操作)
1.1 瀏覽器請求什么資源,跟隨顯示什么資源
2. ajax:異步請求.
2.1 局部刷新,通過異步請求,請求到服務器資源數據后,通過腳本修改頁面中部分內容.
3. ajax 由javascript 推出的.
3.1 由 jquery 對 js 中 ajax 代碼進行的封裝,達到使用方便的效果.
4. jquery 中 ajax 分類(簡化程度分為三個層級)
4.1 第一層級,較復雜:$.ajax({ 屬性名:值,屬性名:值})
4.1.1 是 jquery 中功能最全的.代碼寫起來相對最麻煩的.
4.1.2 示例代碼
4.2 第二層級,(簡化$.ajax)
4.2.1 $.get(url,data,success,dataType))
4.2.2 $.post(url,data,success,dataType)
4.3 第三層級,(簡化$.get())
4.3.1 $.getJSON(url,data,success). 相當于設置$.get 中dataType=”json”
4.3.2 $.getScript(url,data,success) 相當于設置$.get 中 dataType=”script”
5. 如果服務器返回數據是從表中取出.為了方便客戶端操作返回的數據,服務器端返回的數據設置成json
5.1 客戶端把 json 當作對象或數組操作.
6. json:數據格式.
6.1 JsonObject : json 對象,理解成 java 中對象
6.2 JsonArray: json 數組
[{“key1”:value1,”key2”:value2},{}]總結
以上是生活随笔為你收集整理的【Spring】Spring第三天 - 声明式事务、常用注解、Ajax 复习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Spring】Spring第二天 -
- 下一篇: 【SpringBoot】SpringBo