1. 程式人生 > >Spring基礎--Spring(你必須要懂得基礎)

Spring基礎--Spring(你必須要懂得基礎)

1_Spring概述

作者: 風離紫竹[email protected]


2_IOC

作者: 風離紫竹[email protected]
1.IOC概述 ①含義:Iversion of Control反轉控制——反轉資源獲取的方向 ②傳統的獲取資源的方式 元件向當前所在的環境主動的去要資源 ActionContext.getContext().getSession(); ③IOC提倡的方式 由元件所在的環境負責將資源注入到元件中,元件被動接受即可 SessionAware介面→setSession() ④IOC是一種思想,最經典的實現是DI:Dependency Injection依賴注入 2.IOC容器細節 ①使用IOC容器建立物件 ②使用IOC容器在建立物件的同時,給物件的屬性賦值 ③在建立物件的過程中,實現元件物件之間的自動裝配 3.搭建Spring IOC容器需要的開發環境 ①匯入IOC容器需要的jar包 spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jar commons-logging-1.1.3.jar ②建立Spring配置檔案:Spring Bean Configuration File 4.IOC容器建立物件 ①IOC容器本身物件建立時,會將配置檔案中配置好的bean創建出來 ②預設是單例項的,只建立bean的一個物件 ③如果設定bean的scope屬性為prototype,那麼建立bean的物件就是多例項的,在獲取的時候建立,每次獲取物件都會建立新的 5.從IOC容器中獲取物件 ①根據bean的id獲取 ②根據bean的型別獲取:要求容器中指定型別的bean是唯一的 6.bean的後置處理器 ①在bean的初始化方法呼叫前後
執行操作的專門的物件 ②自定義後置處理器:org.springframework.beans.factory.config.BeanPostProcessor 7.屬性的裝配 ①手動裝配 ②自動裝配 8.使用註解配置bean ①宣告bean的註解 @Component 將當前類宣告為IOC容器中的一個普通的元件 @Controller 將當前類宣告為IOC容器中的一個控制器元件 @Service 將當前類宣告為IOC容器中的業務邏輯層元件 @Repository 將當前類宣告為IOC容器中的一個持久化層元件 Spring根據上述註解其實並不能分辨當前類是否真的是一個控制器或Dao,即使標記的類和註解不對應也沒有語法錯誤。但在實際工作中,肯定要將專門的註解標記在對應的類上面。 ②使用基於註解的bean的配置,需要額外匯入一個jar包:spring-aop-4.0.0.RELEASE.jar ③需要設定自動掃描的包
<
context:component-scanbase-package="com.atguigu.ioc.bean"/>
④使用註解後,預設按照類名首字母小寫作為id的值,也可以使用value屬性指定id,value屬性名也可以省略
註解 id值
@Component publicclassCommonComponent{ } commonComponent
@Controller(value="atguiguBookAction") publicclassBookAction { } atguiguBookAction
@Service("happyService") publicclassBookService { } happyService
⑤使用註解進行自動裝配:@Autowired註解 [1]首先檢測標記了@Autowired註解的屬性的型別 [2]根據型別進行裝配 [3]如果指定型別的bean不止一個,那麼根據需要被裝配的屬性的屬性名做id的值,查詢bean [4]如果根據id值還是沒有找到bean,可以使用@Qualifier註解手動指定要裝配的bean的id [5]如果設定@Autowired註解的required屬性為false,則不勉強裝配屬性,如果能夠裝配則裝配,如果不能裝配則不裝配。 9.泛型依賴注入



3_IOC補充

作者: 風離紫竹[email protected]
使用@Scope註解可將bean宣告為多例項的
@Scope(value="prototype")

4_AOP

作者: 風離紫竹[email protected]
1.概念:Aspect Oriented Programming 面向切面程式設計 2.作用:本質上來說是一種簡化程式碼的方式
  • 繼承機制
  • 封裝方法
  • 動態代理
  • ……
3.情景舉例 ①數學計算器介面
int add(int i,int j); int sub(int i,int j); int mul(int i, int j); int div(int i,int j);
②提供簡單實現 ③在簡單實現的基礎上讓每一個計算方法都能夠列印日誌 ④缺陷 [1]手動新增日誌繁瑣,重複 [2]統一修改不便 [3]對目標方法本來要實現的核心功能有干擾,使程式程式碼很臃腫,不易於開發維護 ⑤使用動態代理實現 [1]建立一個類,讓這個類能夠提供一個目標物件的代理物件 [2]在代理物件中列印日誌 4.AOP術語


5.在Spring中使用AOP實現日誌功能 ①Spring中可以使用註解或XML檔案配置的方式實現AOP。 ②匯入jar包   com.springsource.net.sf.cglib -2.2.0.jar   com.springsource.org.aopalliance-1.0.0 .jar   com.springsource.org.aspectj.weaver-1.6.8 .RELEASE.jar   commons-logging-1.1.3. jar   spring-aop-4.0.0.RELEASE.jar   spring-aspects-4.0.0.RELEASE.jar   spring-beans-4.0.0.RELEASE.jar   spring-context-4.0.0.RELEASE.jar   spring-core-4.0.0.RELEASE.jar   spring-expression-4.0.0.RELEASE. jar ③開啟基於註解的AOP功能
<aop:aspectj-autoproxy/>
④宣告一個切面類,並把這個切面類加入到IOC容器中
@Aspect//表示這是一個切面類 @Component//加入IOC容器 publicclassLogAspect { }
⑤在切面類中宣告通知方法 [1]前置通知:@Before [2]返回通知:@AfterReturning [3]異常通知:@AfterThrowing [4]後置通知:@After [5]環繞通知:@Around ⑥被代理的物件也需要加入IOC容器 6.切入點表示式 ①最詳細
execution(public int com.atguigu.aop.target.EazyImpl.add(int,int))
②最模糊
execution(* *.*(..))
7.統一宣告切入點表示式
@Pointcut(value="execution(public int com.atguigu.aop.target.EazyImpl.add(int,int))") publicvoidmyPointCut(){}
8.通知方法的細節 ①在前置通知中獲取目標方法的方法名和引數列表 [1]在通知方法中宣告一個JoinPoint型別的形參 [2]呼叫JoinPoint物件的getSignature()方法獲取目標方法的簽名 [3]呼叫JoinPoint物件的getArgs()方法獲取目標方法的實際引數列表 ②在返回通知中獲取方法的返回值 [1]在@AfterReturning註解中新增returning屬性
@AfterReturning(value="myPointCut()",returning="result")
[2]在返回通知的通知方法中宣告一個形參,形參名和returning屬性的值一致
showReturnLog(JoinPoint joinPoint, Objectresult)
③在異常通知中獲取異常物件 [1]在@ AfterThrowing註解中新增throwing屬性
@AfterThrowing(value="myPointCut()",throwing="throwable")
[2]在異常通知的通知方法中宣告一個形參,形參名和throwing屬性值一致
showExceptinLog(JoinPoint joinPoint, Throwablethrowable)
9.真正放在IOC容器中的物件是代理物件,而並不是目標物件本身 10.切面的優先順序 對於同一個代理物件,可以同時有多個切面共同對它進行代理。 可以通過@Order (value=50)註解來進行設定,值越小優先順序越高

5_JdbcTemplate

作者: 風離紫竹[email protected]
1.Spring提供的一個操作資料庫的技術,是對Jdbc的封裝。語法風格非常接近DBUtils。 2.配置環境 ①匯入jar包 [1]IOC容器需要的jar包 [2]MySQL驅動、C3P0jar包 [3]JdbcTemplate需要的jar包 ②在IOC容器中配置資料來源 ③在IOC容器中配置JdbcTemplate物件的bean,並將資料來源物件裝配到JdbcTemplate物件中

6_宣告式事務

作者: 風離紫竹[email protected]
1.程式設計式事務
//1.獲取Connection物件 Connection conn = JDBCUtils.getConnection(); try { //2.開啟事務:取消自動提交 conn.setAutoCommit(false); //3.執行資料庫操作 chain.doFilter(req,resp); //4.提交事務 conn.commit(); }catch(Exception e) { //5.回滾事務 conn.rollBack(); }finally{ //6.釋放資源 }
2.宣告式事務 ①基本原理:AOP [1]前置通知:開啟事務 [2]返回通知:提交事務 [3]異常通知:回滾事務 [4]後置通知:釋放資源 ②事務管理器


③匯入jar包 [1]IOC容器需要的jar包 [2]AOP需要的jar包 [3]JdbcTemplate操作需要的jar包 [5]MySQL驅動和C3P0 ④配置 [1]配置資料來源 [2]配置JdbcTemplate,並裝配資料來源 [3]配置事務管理器,並裝配資料來源
<beanid="dataSourceTransactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <propertyname="dataSource"ref="dataSource"/> </bean>
[4]開啟基於註解的宣告式事務功能
<tx:annotation-driventransaction-manager="dataSourceTransactionManager"/>
如果事務管理器的bean的id正好是transaction-manager的預設值transactionManager,則可以省略 [5]在事務方法上加@Transactional註解 3.情景舉例 ①匯入SQL檔案:declaration_transaction.sql ②資料庫操作 [1]根據isbn的值查詢書的價格 [2]根據isbn的值減少書的庫存,假設每次都只買1本書 [3]根據使用者名稱減少使用者賬戶中的餘額,減少的額度就是書的價格 4.事務屬性的設定 ①事務的傳播行為 [1]一個事務執行在另一個有事務的方法中,那麼當前方法是開啟新事務還是在原有的事務中執行。 [2]設定事務方法在呼叫其他事務方法時,自己的事務如何傳播給被呼叫的方法。 [3]設定方式
@Transactional(propagation=Propagation.REQUIRES_NEW)
②事務的隔離級別
isolation=Isolation.READ_COMMITTED
③事務根據什麼異常不進行回滾
noRollbackFor=ArithmeticException.class
④事務的超時屬性 [1]資料庫事務在執行過程中,會佔用資料庫資源,所以如果某一個事務執行的時間太長,那麼就會導致資源被長時間佔用,影響其他事務執行。 [2]可以通過設定超時屬性,將超時沒有執行完的事務回滾。
timeout=3
⑤事務的只讀屬性 資料庫會對事務進行優化,如果是一個查詢操作,那麼資料庫可以有針對性的進行優化。我們可以通過設定事務屬性,告訴資料庫當前操作是一個只讀操作,便於資料庫進行優化。
readOnly=true
5.基於XML的宣告式事務
<!-- 配置基於XML的宣告式事務 --> <!-- 宣告切入點表示式 --> <aop:config> <aop:pointcutexpression="execution(* com.atguigu.tx.component.BookService.doCash(String, String))" id="txPointCut"/> <!-- 將事務切入點和事務建議的配置關聯起來 --> <aop:advisoradvice-ref="bookTransaction"pointcut-ref="txPointCut"/> </aop:config> <!-- 設定事務屬性 --> <tx:adviceid="bookTransaction"transaction-manager="dataSourceTransactionManager"> <tx:attributes> <tx:methodname="doCash" propagation="REQUIRED" isolation="READ_COMMITTED" read-only="false" no-rollback-for="java.lang.ArithmeticException" timeout="3" /> <!-- 將某一類方法統一設定為只讀 --> <tx:methodname="get*"read-only="true"/> <tx:methodname="find*"read-only="true"/> <tx:methodname="query*"read-only="true"/> </tx:attributes> </tx:advice>

7_整合Hibernate

作者: 風離紫竹[email protected]
1.整合目標



3.Spring為SessionFactory介面提供了一個可以被配置為bean的實現類:org.springframework.orm.hibernate4.LocalSessionFactoryBean 4.事務管理器:org.springframework.orm.hibernate4.HibernateTransactionManager 5.在Dao中獲取Session物件 ①factory .openSession() 開啟新的會話,返回一個新建立的Session物件 ②factory .getCurrentSession() 從當前執行緒上獲取Session物件,保證多個數據庫操作在同一個事務中 注意:在Spring和Hibernate整合環境下,當前方法必須執行在宣告式事務中才能夠通過getCurrentSession()獲取到Session物件。
publicSession getSession() { //測試Dao的方法時,使用openSession() returnfactory.openSession(); //執行在事務方法中時,使用getCurrentSession() //return factory.getCurrentSession(); }

8_整合Struts2

作者: 風離紫竹[email protected]
1.在Web應用中使用Spring ①建立IOC容器物件 ②Web應用工作階段:初始化階段→請求響應階段→解除安裝前清理 ③在Web應用初始化階段將IOC容器物件創建出來,並儲存到application域中。 ④在ServletContextListener監聽器中執行如下操作 [1]建立IOC容器物件 [2]將IOC容器物件儲存到application域中 2.整合Struts2 ①匯入jar包 [1]Spring需要的jar包 IOC容器需要的jar包 Web應用相關的jar包
spring-web-4.0.0.RELEASE.jar spring-webmvc-4.0.0.RELEASE.jar
[2]Struts2需要的jar包 [3]Struts2提供的一個用於整合Spring的外掛jar包
LibrarySupport\struts-2.3.15.3\lib
struts2-spring-plugin-2.3.15.3.jar
②配置Spring提供的一個專門用於建立IOC容器物件的監聽器
<!-- 配置Web應用的初始化引數,指定Spring配置檔案的位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 配置載入IOC容器的監聽器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
③匯入Struts2自身的配置檔案,配置核心Filter ④將Struts2的Action類設定為多例項方式建立
@Scope(value="prototype")
⑤Struts2整合Spring後,Action類的物件交給IOC容器建立,那麼在class屬性中,就可以使用Action類的bean的id

9_CRUD練習

作者: 風離紫竹[email protected]
1.功能描述 [1]顯示員工列表,要求顯示員工列表時顯示部門名稱 [2]新增員工,在新增介面顯示所有部門列表,供選擇 [3]更新員工,在更新介面顯示所有部門列表,供選擇,並且初始狀態下顯示當前員工現在的部門 [4]刪除員工 [5]以上所有增刪改操作執行完成後都回到列表頁面 2.專案結構 ①實體類 Employee Department ②元件 持久化層:HibernateDao/HibernateDaoImpl Tips:在使用openSession()方式單獨測試Dao方法時,update()和delete()方法需要工作在事務中才有效 業務邏輯層:EmployeeService/EmployeeServiceImpl 表示層:EmployeeAction


③頁面 index.jsp:顯示“前往員工列表”超連結 showEmpList.jsp:顯示員工列表 addUI.jsp:顯示新增員工資訊的表單介面 editUI.jsp:顯示編輯員工資訊的表單介面 ④配置檔案 Spring配置檔案 Hibernate配置檔案:cfg/hbm Struts2配置檔案 web.xml配置檔案 jdbc.properties屬性檔案 ★配置檔案可以專門建立一個Source Folder來儲存,原始碼目錄中的內容經過專案編譯後會被儲存到類路徑下 ⑤jar包 [1]MySQL和資料庫連線池 [2]Spring IOC容器 AOP jdbc web [3]Hibernate [4]Struts2:整合Spring時需要用到的外掛 3.實現步驟 ①建立資料庫:ssh_crud0917 ②匯入所需要的jar包 ③使用Spring的IOC容器建立資料來源物件 4.OpenSessionInViewFilter 作用:將Hibernate的Session的開啟時間延長到JSP頁面執行完成。 配置
<!-- 配置OpenSessionInViewFilter --> <filter> <filter-name>OpenSessionInView</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInView</filter-name>

相關推薦

Struts2基礎--Struts2(必須懂得基礎)

1.輸入驗證 ①概念:針對使用者在表單中輸入的資料進行檢查 ②分類 [1]客戶端驗證:JavaScript [2]伺服器端驗證:Servlet/Action (1)宣告式驗證:通過在配置檔案中指定驗證規則來檢查使用者輸入資料 (2)程式設計式驗證:通過編寫程式碼來檢查使用者輸入資料 2.

Spring基礎--Spring(必須懂得基礎)

1_Spring概述 作者: 風離紫竹[email protected] 2_IOC 作者: 風離紫竹[email protected] 1.IOC概述 ①含義:Iversion of Control反轉控制——反轉資源獲取的方向 ②傳統的

Android基礎篇之Android快速入門--必須知道的基礎

1. Activity的理解: 2. Intent的理解 關於IntentFilter 3. Intent的使用:(建立、攜帶資料、讀取資料) 1.建立:      顯式意圖: Intent intent = new Inten

Java基礎總結篇--JavaSE必須知道的基礎

一、集合:就像是一種容器。用於儲存、獲取、操作物件的容器。 1. 陣列的弊端 ①陣列的長度不可變     ②陣列沒有提供可以檢視有效元素個數的方法 2. 集合的特點 ①集合的長度是可變的 ②集合可以儲存任意型別的物件 ③集合只能儲存物件 3. 集合框架 java.util.Co

大資料工作中必須知道的基礎命令集錦

以下是個人在工作中總結的一些簡單的命令,有linux也有hadoop叢集命令的操作,精力有限,肯定還有很多命令沒有總結到,歡迎留言,我會定期新增新的內容 檢視當前目錄是什麼命令?怎麼表示當前path pwd ./ 切換到上一次和上一層目錄?切換到當前使用者的目錄。 c

高效能Spark作業基礎必須知道的調優原則及建議

在大資料計算領域,Spark已經成為了越來越流行、越來越受歡迎的計算平臺之一。Spark的功能涵蓋了大資料領域的離線批處理、SQL類處理、流式/實時計算、機器學習、圖計算等各種不同型別的計算操作,應用範圍與前景非常廣泛。在美團點評,已經有很多同學在各種專案中嘗試使用Spark。大多數同學(包括筆者在內),最初

想做OTT-TV/IPTV網絡IP電視直播運營商-必須知道的事

OTT-TV IPTV 網絡IP電視、直播 廣播電教系統需求: – 整套系統穩定、可靠; – 支持主從設備堆疊部署,單臺設備最大支持127臺從機; – 支持RTSP/RTMP/HLS等標準的流媒體格式; – 可基於標

入坑/轉型人工智能必須弄懂的20個問題

編程程序 wrap 解決 back 1.5 應用層 答案 adding 轉型 一、前言昨晚做了一期關於《如何系統學習人工智能》的線上公開課,一個半小時,嗓子都冒煙了,看來這個行當還真不是一般人能做的來的。關於如何系統學習人工智能,線上回答了大家關於人工智能相關的很多問題,在

德到課堂---必須懂的十大職場生存法則

活著 空間 可能 你會 是個 坐標 能說 孤單 得到 德到領袖與你分享:你必須要懂的十大職場生存法則在職場中,總需要有一些生存規則,那麽什麽樣的生存法則才適用呢,今天就來分享一下你必須要懂的十大職場中的生存規律。 01十大職場生存規律 第一:男女搭檔幹活不累。  在辦公室裏

關於備份,必須了解的內容

二周 增量 進行 允許 文件 例如 簡便 價值 發現 冷備份:也被稱為離線備份,是指在關閉應用並且應用不能更新的狀況下進行的數據的完整備份 手動備份:要備份到其它磁盤上(避免本地故障,數據丟失) 自動備份:首次完整備份,以後備份為增量備份(例如:一個月備份一次,第一周為完整

Python 必須知道的 Flask

Flask介紹 Flask 是一個輕量級的 web 開發框架, 使用 Python 開發, 上手簡單。 安裝 Flask pip install Flask 第一個 Flask 程式 1、編寫 app.py 檔案內容如下: #encoding: utf-8 # 匯入Flas

Python工作好找嗎? 必須懂這6個祕訣工作就沒問題

隨著人工智慧時代的到來,Python的需求也變的越來越大了。從目前各大IT招聘網上顯示招聘需求是非常大,而且薪資基本都在10k起,高的可達40-50k 一、那找Python工作一般需要什麼要求呢?1、熟悉python編碼規範,良好的程式設計習慣;2、熟悉python基本資料型別的操作;3、熟悉python各

web前端之響應式佈局,必須知道的

一、前言 響應式Web設計可以讓一個網站同時適配多種裝置和多個螢幕,可以讓網站的佈局和功能隨使用者的使用環境(螢幕大小、輸入方式、裝置/瀏覽器能力)而變化。本文主要介紹一些響應式佈局容易忽略但又很重要的知識點。 二、視口 移動前端中常說的 viewport (視口)就是瀏覽器中用於呈現網

關於Http協議,必須知道的

轉自:https://segmentfault.com/a/1190000016751071      引言 HTTP協議是Hyper Text Transfer Protocol(超文字傳輸協議)的縮寫,是用於從全球資訊網伺服器傳輸超文字到本地瀏覽器的傳送協議。HT

學習web前端前必須知道這些,讓少走很多彎路

IT行業是所有行業中能力要求最高的,相應的薪水待遇也是讓人羨慕。想要勝任一份高薪的工作並不那麼容易,新手甚至0基礎的小白想要踏入這一行業需要了解些什麼呢?   在之前的幾年IT行業一度超越了掙錢最多的金融行業,因為如果說在中國所有行業中,給人打工的話,做軟體開發這塊應該是工資提升的最顯著最快的,

Java併發程式設計---必須懂得概念和思想

其實併發程式設計並沒有我們想的那麼難,很多的時候我們在思考的時候是因為沒有get到併發程式設計的點,很多時候我們都是稀裡糊塗的去學習併發程式設計的,根本很難弄明白併發程式設計要注意什麼,在這個期間我覺得自己走了很多的彎路,現在分享一下我對於併發程式設計的一些理解: (1)為什

安卓專案實戰之與UI那點事:圖片適配必須了解的知識點

1,mipmap和drawable的區別 在Android4.2以上的版本中,提供了對mipmaps的支援,如果你用Andorid Studio開發Android程式會發現Android Studio自動幫你建立了幾個mipmaps資料夾,很多人每次新建一個工程的時候,總是先把mipma

知曉功率型肖特基二極體,這幾點必須清楚

    肖特基二極體又稱晶體二極體,簡稱肖特基二極體,另外,還有早期的真空電子二極體;它是一種具有單向傳導電流的電子器件。在電子元件當中,一種具有兩個電極的裝置,只允許電流由單一方向流過。許多的使用是應用其整流的功能。而變容二極體則用來當作電子式的可調電容器。     &nb

必須了解的九個大資料技術

Hadoop是大資料領域最流行的技術,但也並不是唯一。還有很多其他技術可用於解決大資料問題。除了Apache Hadoop外,另外9個大資料技術也是必須要了解的。   1.Apache Flink   是一個高效、分散式、基於Java實現的通用大資料分析引擎,它具

Python工作好找嗎?必須懂這6個祕訣工作就沒問題

隨著人工智慧時代的到來,Python的需求也變的越來越大了。從目前各大IT招聘網上顯示招聘需求是非常大,而且薪資基本都在10k起,高的可達40-50k 一、那找Python工作一般需要什麼要求呢? 1、熟悉python編碼規範,良好的程式設計習慣; 2、熟悉p