1. 程式人生 > >Spring_02---Spring註解開發、AOP操作等

Spring_02---Spring註解開發、AOP操作等

一、Spring註解開發

1)註解建立物件

建立物件有四個註解,四個註解功能暫時相同,都為建立物件
	(1)@Component
	(2)@Controller
	(3)@Service
	(4)@Repository

步驟:
	1)導包
	2)建立類,建立方法。
	3)在類上添加註解。
	4)建立配置檔案,引入約束
	5)開啟註解掃描
	
程式碼示例:

	//註解類建立物件
	@Component(value="bookDao")   //此行程式碼相當於 <bean id="user" class=""></bean>
	public class BookDao {
		public void add(){
			System.out.println("BookDao.add()");
		}
	}
	
	xml:
	<!-- 開啟註解掃描
		掃描範圍:掃描 (指定包裡的)類、方法、屬性上面是否有註解。
		base-package:指定包     指定多個包時 包名用逗號隔開即可
	 -->
	<context:component-scan base-package="user"></context:component-scan>

2)註解注入屬性

注入屬性有兩個註解:
	1)Autowired :根據屬性型別自動裝配
	2)Resource:指定註解。


示例:將dao作為屬性注入到service中
	步驟:	
		1)建立service和dao類,建立方法,在類上添加註解。
		2)在配置檔案中開啟註解掃描。
		3)在service類中定義dao屬性
		4)在屬性上添加註解

程式碼:
@Component(value="bookService")   //註解類建立物件
public class BookService {
	
	@Resource(name="bookDao")   //註解屬性
	private BookDao bookDao;
	
	public void test(){
		bookDao.add();
	}
}

3)xml和註解方式的混合使用

- 建立物件使用配置檔案,
- 注入屬性使用註解

1.2 scope註解講解 ---- 指明建立物件單例項還是多例項。

@scope註解屬性值講解

1.singleton:單例模式。

2.prototype:多例模式

3.request
  1)request表示該針對每一次HTTP請求都會產生一個新的bean,
	2)同時該bean僅在當前HTTP request內有效,
4.session
	1)session作用域表示該針對每一次HTTP請求都會產生一個新的bean,
	2)同時該bean僅在當前HTTP session內有效

二、AOP概念

1 aop:面向切面(方面)程式設計,擴充套件功能不修改原始碼實現

2  AOP採取橫向抽取機制,取代了傳統縱向繼承體系重複性程式碼

3 aop底層使用動態代理實現
(1)第一種情況,有介面情況,使用動態代理建立介面實現類代理物件
(2)第二種情況,沒有介面情況,使用動態代理建立類的子類代理物件

AOP原理畫圖分析

在這裡插入圖片描述

2.2 AOP操作術語

1)Pointcut(切入點):所謂切入點是指我們要對哪些Joinpoint進行攔截的定義.

2)Advice(通知/增強):所謂通知是指攔截到Joinpoint之後所要做的事情就是通知.通知分為前置通知,後置通知,異常通知,最終通知,環繞通知(切面要完成的功能)

3)Aspect(切面): 是切入點和通知(引介)的結合

4)Joinpoint(連線點): 類裡面可以被增強的方法,這些方法稱為連線點

5)Introduction(引介):引介是一種特殊的通知在不修改類程式碼的前提下, Introduction可以在執行期為類動態地新增一些方法或Field.

6)Target(目標物件):代理的目標物件(要增強的類)

7)Weaving(織入):是把增強應用到目標的過程.(把advice 應用到 target的過程)

8)Proxy(代理):一個類被AOP織入增強後,就產生一個結果代理類

在這裡插入圖片描述

2.3 execution表示式

作用:使用execution表示式配置切入點

切入點:實際增強的方法

標準格式:execution(<訪問修飾符>?<返回型別><方法名>(<引數>)<異常>)

常用格式:execution(修飾符型別 類全路徑.方法(..))
解釋:第一個 * 表示修飾符型別;(..)表示任意引數
示例:
	1)execution(* cn.itcast.aop.Book.add(..))   //增強指定類中指定方法  
	2)execution(* cn.itcast.aop.Book.*(..))  //增強指定類中所有方法	
	3)execution(* *.*(..))		//增強所有類中所有方法
	4)execution(* save*(..))   	//增強所有sava開頭的方法。

三、Spring的aop操作

1 aspectj介紹:
	1)aspectj不是spring一部分,和spring一起使用進行aop操作
	2)Spring2.0以後新增了對AspectJ支援

	在spring裡面使用aspectj實現aop操作!

2 使用aspectj實現aop的兩種方式
	1)基於aspectj的xml配置
	2)基於aspectj的註解方式

Aop操作

步驟:
1) 導包
2) 建立spring核心配置檔案,匯入aop的約束
3) 建立原始類、原始方法
4) 建立增強類、增強方法
5) 配置切入點,切面 (重點)
6)測試

程式碼示例:

 1.	//原始類
	public class Book {
		//原始方法
		public void add(){
			System.out.println("add()......");
		}
	}

2.	//增強類
	public class MyBook {
		
		//增強方法 
		public void before1(){
			System.out.println("前置通知");
		}
		
		//增強方法 
		public void after1(){
			System.out.println("後置通知");
		}
		
		//增強方法 
		//環繞通知
		//底層原理:使用ProceedingJoinPoint類指代被執行的方法。該類中的.proceed()方法表示開始執行。
		public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
			System.out.println("方法之前");
			
			//執行被增強的方法
			proceedingJoinPoint.proceed();  
			
			System.out.println("方法之後");
		}
	}
	
3.xml:
	<?xml version="1.0" encoding="UTF-8"?>
	<beans xmlns="http://www.springframework.org/schema/beans"
	    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	    xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
	        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here -->
		
		<!-- 1 配置物件 -->
		<bean id="book" class="book.Book"></bean>
		<bean id="myBook" class="book.MyBook"></bean>
		
		<!-- 2 配置aop操作 -->
		<aop:config>
			<!-- 2.1 配置切入點   使用execute表示式
				expression屬性值:execute表示式
				id:為切入點名稱
			-->
			<aop:pointcut expression="execution(* book.Book.*(..))" id="pointcut1"/>
		
			<!-- 2.2 配置切面(把增強應用到方法上) 
				步驟: 
				1)配置增強類。
				2)再增強類中配置增強方法,並給切面配置切入點
			-->
			<aop:aspect ref="myBook">   
			
				<!-- 配置增強型別
					method:增強方法的 方法名 
					pointcut-ref:切入點引用配置
				 -->
				<aop:before method="before1" pointcut-ref="pointcut1"/>
				
				<aop:after-returning method="after1" pointcut-ref="pointcut1"/>
				
				<aop:around method="around1" pointcut-ref="pointcut1"/>
			</aop:aspect>
		
		</aop:config>
		
	</beans>

四、log4j介紹

作用:通過log4j可以看程式執行過程中的詳細資訊

使用
	1)匯入log4j的jar包
	2)複製log4j的配置檔案,複製到src下面

設定日誌級別
	1)info:看到基本資訊	
	2)debug:看到更詳細資訊

五、解決配置檔案多次載入問題

問題:每次訪問action時候,都會載入spring配置檔案

解決方案:
	1)在伺服器啟動時候,建立物件載入配置檔案
	2)底層使用監聽器、ServletContext物件

實現思想:使用在spring裡面已封裝的監聽器

步驟:  
	1)匯入spring整合web專案的jar包
	2)配置監聽器
	3)指定載入spring配置檔案位置

在這裡插入圖片描述 在這裡插入圖片描述