PHP:五進位制轉換十三進位制
第五章 初識Spring框架
兩種方式
繼承介面和使用配置檔案
Spring 簡介 Rod Johnson提出
輕量級框架, Java EE的春天,當前主流框架
目標
使現有技術更加易用,推進編碼最佳實踐
內容
IoC容器
AOP實現
資料訪問支援
簡化JDBC/ORM 框架
宣告式事務
Web整合
schema:配置Spring框架的某些功能是需要用到的schema檔案,對於已經整合的IDE環境(如idea),這些檔案不需專門匯入。
Spring框架依賴的jar包:
jar包 | 說明 |
---|---|
spring-beans-5.2.2-RELEASE.jar | 包含spring框架管理Bean和配置檔案的基本功能 |
spring-core-5.2.2-RELEASE.jar | Spring核心jar包,是其他元件的基本核心,包含Spring的基本核心類 |
spring-context-5.2.2-RELEASE.jar | Spring核心的擴充套件包,包含大量的工具類 |
spring-expression-5.2.2-RELEASE.jar | Spring框架中一個強大的表示式解析語言,支援在執行時動態解析表示式給物件賦值等功能 |
Spring專案步驟:
- 新增依賴的jar包
- 編寫Spring配置檔案,在專案的classpath根路徑下建立applicationContext.xml
- 編寫測試程式碼通過Spring進行屬性注入。
Spring設計理念 Spring是面向Bean的程式設計
Spring 兩大核心技術
控制反轉(IoC:Inversion of Control ) /依賴注入(DI:Dependency Injection )
面向切面程式設計(AOP:Aspect Oriented Programming)
Spring的優點
低侵入式設計
獨立於各種應用伺服器
依賴注入特性將元件關係透明化,降低了耦合度
面向切面程式設計特性允許將通用任務進行集中式處理
與第三方框架的良好整合
控制反轉 / 依賴注入
將元件物件的控制權從程式碼本身轉移到外部容器
元件化的思想:分離關注點,使用介面,不再關注實現
依賴的注入:將元件的構建和使用分開
執行原理:被動接受spring注入
Spring會根據配置檔案中的資訊,自動建立對應的例項物件,並通過setter方法為其屬性賦值。
如何使用Spring實現“控制反轉”?
編寫HelloSpring類,輸出“Hello, Spring!”
字串“Spring”通過Spring注入到HelloSpring類中
步驟
新增Spring到專案中
編寫配置檔案
編寫程式碼獲取HelloSpring例項
設值注入
使用bean元素定義一個元件
id屬性:指定一個用來訪問的唯一名稱
name屬性:指定多個別名,名字之間使用逗號、分號或空格進行分隔
public class UserServiceImpl implements UserService {
private static final Logger log = Logger.getLogger(UserServiceImpl.class);
public boolean addNewUser(User user) {
log.info(“新增使用者 ” + user.getUsername());//記錄日誌
SqlSession sqlSession = null;
boolean flag = false;
//異常處理
try {
sqlSession = MyBatisUtil.createSqlSession();
if (sqlSession.getMapper(UserMapper.class).add(user) > 0)
flag = true;
sqlSession.commit(); //事務控制
} catch (Exception e) {
log.error("新增使用者 " + user.getUsername() + "失敗", e); //記錄日誌
sqlSession.rollback(); //事務控制
flag = false;
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
return flag;
}
}
Spring初始化執行環境實現的方式
一:ApplicationContext是一個介面,負責讀取Spring配置檔案,管理物件的載入、生成、維護Bean物件與Bean鍍錫之間的依賴關係,負責Bean的生命週期等。
-
ClassPathXmlApplicationContext
1.classpath:字首是不需要的,預設就是指專案的classpath路徑下面;
2.如果要使用絕對路徑,需要加上file:字首表示這是絕對路徑;
-
FileSystemXmlApplicationContext
1.沒有碟符的是專案工作路徑,即專案的根目錄;
2.有碟符表示的是檔案絕對路徑.
注意:如果要使用classpath路徑,需要字首classpath:
二:還可以通過BeanFactory介面及其Bean元件實施管理。
面向切面程式設計(AOP)
所謂面向切面程式設計,是一種通過預編譯和執行期動態代理的方式實現在不修改原始碼的情況下給程式動態新增功能的技術(簡單來說,只需要關心關聯元件的介面定義,不需要關心具體實現) 通過Spring框架靈活配置以替代具體實現。
- 通過代理物件來呼叫原物件的方法
- 代理物件方法前後都可插入程式碼,這些程式碼就是增強處理
AOP的目標:讓我們可以“專心做事”
AOP原理 依賴動態代理
- 將複雜的需求分解出不同方面,將散佈在系統中的公共功能集中解決
- 採用代理機制組裝起來執行,在不改變原程式的基礎上對程式碼段進行增強處理,增加新的功能
AOP相關術語
增強處理(Advice)
- 前置增強
- 後置增強
- 環繞增強、異常丟擲增強、最終增強等型別
切入點(Pointcut) 對連線點的特徵進行描述,可以使用正則表示式
連線點(Join Point) 程式執行的某個具體的執行點
切面(Aspect) 一個模組化的橫切邏輯(橫切關注點),可能會橫切多個物件
目標物件(Target object) 被一個或多個切面增強的物件
AOP代理(AOP proxy) 由AOP框架所建立的物件,實現執行增強處理方法等功能
織入(Weaving) 將增強處理連線到應用程式中的型別或物件上的過程
Advice(增強處理)
配置元素介紹
怎樣使用AOP
實現步驟
- 在專案中新增Spring AOP的jar檔案
- 編寫前置增強和後置增強實現日誌功能
- 編寫Spring配置檔案,對業務方法進行增強處理
- 編寫程式碼獲取帶有增強處理的業務物件
增強處理
public class UserServiceLogger {
private static Logger log=Logger.getLogger(UserServiceLogger.class);
public void before(JoinPoint jp) {
log.info("呼叫 " + jp.getTarget() + " 的 " + jp.getSignature().
getName() + " 方法。方法入參:" + Arrays.toString(jp.getArgs()));
}
public void afterReturning(JoinPoint jp, Object result) {
log.info("呼叫 " + jp.getTarget() + " 的 " + jp.getSignature().
getName() + " 方法。方法返回值:" + result);
}
}
定義切入點
切入點:簡單的說,就是連線點的查詢條件
<aop:config>
<aop:pointcut id="pointcut"
expression="execution(public void addNewUser(entity.User))"/>
</aop:config>
表示式匹配規則舉例
public * addNewUser(entity.User): “*”表示匹配所有型別的返回值。
public void (entity.User): “”表示匹配所有方法名。
public void addNewUser(..): “..”表示匹配所有引數個數和型別。
- com.service..(..):匹配com.service包下所有類的所有方法。
- com.service...(..):匹配com.service包及其子包下所有類的所有方法
織入增強處理
織入:在切入點插入增強處理
<aop:config>
<aop:pointcut id="pointcut"
expression="execution(public void addNewUser(entity.User))" />
<aop:aspect ref="userServiceLogger">
<aop:before method="before"
pointcut-ref="pointcut"></aop:before>
<aop:after-returning method="afterReturning"
pointcut-ref="pointcut" returning="result"/>
</aop:aspect>
</aop:config>