spring總結————AOP面向切面總結


spring總結————AOP面向切面

 

一、spring aop概念

spring aop面向切面編程,java是面向對象的語言。

真正的service層代碼

業務邏輯層再處理業務之前和之后都要進行一些參數的校驗,異常處理,日志記錄等代碼。有非常多非常核心的業務邏輯在里面,這些業務邏輯不要是不行的。怎么解決這種問題?生活中有很多這樣的例子,實際上就是使用了代理模式來解決這個問題。spring aop 就是基於代理模式的。代理分靜態代理和動態代理,spring aop的核心就是通過動態代理來實現的。

二、使用bean的方式配置spring的aop

先創建項目,把項目運行起來

第一步,創建spring項目  引入jar包

第二步,創建主配置文件

1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd">
8 <bean id="userService" class="com.aaa.spring.service.impl.UserServiceImpl"></bean>
9 </beans>

第三步,創建包實體類

注:service層只保留核心的業務邏輯代碼:

 

 1 package com.aaa.spring.service.impl;
 2 import com.aaa.spring.entity.Userimport com.aaa.spring.service.UserService/**
 3 * 用戶管理service實現類
 4 */
 5 public class UserServiceImpl implements UserService {
 6 @Override
 7 public void saveUser(User user) {
 8 System.out.println("保存用戶");
 9 }
10 @Override
11 public void deleteUser(User user) {
12 System.out.println("刪除用戶");
13 }
14 @Overridepublic void updateUser(User user) {
15 System.out.println("修改用戶");
16 }
17 @Override
18 public User findById(Long id) {
19 System.out.println("根據id查找用戶");
20 return null;
21 }
22 }

第四步,在spring的主配置文件中配置bean

1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd">
8 <bean id="userService" class="com.aaa.spring.service.impl.UserServiceImpl"></bean>
9 </beans>

 第五步,測試

 1 package com.aaa.spring;
 2 import com.aaa.spring.entity.User;
 3 import com.aaa.spring.service.UserService;
 4 import javafx.application.Application;
 5 import org.springframework.context.ApplicationContext;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 /**
 8 * 獲取對象
 9 */
10 public class Test01 {
11 public static void main(String[] args) {
12 //創建spring的工廠類對象
13 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
14 //從工廠中獲取對象
15 UserService userService = context.getBean(UserService.class);
16 userService.saveUser(new User());
17 userService.deleteUser(new User());
18 userService.updateUser(new User());
19 userService.findById(10L);
20 }
21 }

 

 三、實現aop

一、導入jar包

二、聲明日志處理類的代碼 ,在spring aop中,管這種代碼叫通知 

 1 package com.aaa.spring.advice;
 2 import org.aspectj.lang.JoinPoint;
 3 import java.util.Date;
 4 /**
 5 * 日志記錄的代碼
 6 */
 7 public class LogAdvice {
 8 /**
 9 * 日志記錄的代碼,通過JoinPoint對象可以獲取方法調用的一些參數
10 * @param jp
11 */
12 public void log(JoinPoint jp){
13 //獲取調用方法的名稱
14 String methodName = jp.getSignature().getName();
15 System.out.println(new Date()+"調用了"+methodName);
16 }
17 }

三、配置AOP

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4 xmlns:context="http://www.springframework.org/schema/context"
 5 xmlns:aop="http://www.springframework.org/schema/aop"
 6 xsi:schemaLocation="http://www.springframework.org/schema/beans
 7 http://www.springframework.org/schema/beans/spring-beans.xsd
 8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/springaop.xsd">
 9 <bean id="userService" class="com.aaa.spring.service.impl.UserServiceImpl"></bean>
10 <!--聲明通知類的對象,蓋了一個傳達室-->
11 <bean id="logAdvice" class="com.aaa.spring.advice.LogAdvice"></bean>
12 <!--
13 實現aop 相當於實現在有同學進入學校的時候檢查是否穿了拖鞋
14 -->
15 <aop:config>
16 <!---聲明切入點表達式 expression是什么要攔截哪些類的哪些方法
17 切入點表達式語法
18 舉例1:如果要攔截所有com.aaa.spring.service.impl包下的UserServiceImpl類的所有以User結尾的方法
19 execution(* com.aaa.spring.service.imp.UserServiceImpl.*User(..))
20 舉例2:如果要攔截所有類的以User結尾的方法
21 execution(* *User(..))
22 舉例2:要攔截所有com.aaa.spring包或者子包下所有的以User結尾的方法
23 execution(* com.aaa.spring..*.*User(..))
24 -->
25 <aop:pointcut id="p1" expression="execution(void *User(..)) "></aop:pointcut>
26 <!---聲明切面,完成日志記錄的功能-->
27 <aop:aspect ref="logAdvice">
28 <!--聲明后置通知,在所有攔截的方法執行完之后執行-->
29 <!---攔截到目標方法之后要調用通知類的哪個方法-->
30 <aop:after-returning method="log" pointcut-ref="p1"></aop:after-returning>
31 </aop:aspect>
32 </aop:config>
33 </beans>

bean配置aop

四、測試

四、aop常用的五種通知類型

通知類型  

說明  

注解配置(aop:aspectj-autoproxy)

aop:before前置通知  

在目標方法調用之前執行

@Before("exception(void *(..))")

aop:after-returning后置通知

在目標方法調用之后執行,一旦目標方法產生異常,不會執行

@AfterReturning("execution(*(..))")

aop:after最終通知

在目標方法調用之后執行,無論目標是否產生異常,都會被執行

 

aop:after-throwing異常通知

在目標方法產生異常的時候執行

@AfterThrowing(pointcut="excution(void *(..))",throwing="e")

aop:arround 環繞通知

在目標方法執行之前和 之后都寫一寫非核心的業務邏輯,一般可以用來替代前置通知和后置通知

aop:around,method,pointcut-ref

總結:aop面向切面編程,aop接口業務邏輯中橫向代碼重復的問題

aop用bean的方式配置aop通知五種類型

使用注解配置aop

面試題:

aop底層使用了什么設計模式

使用了動態代理模式 springaop支持jdk動態代理和cglib動態代理

spring aop常用的五種通知類型是什么

前置通知,后置通知,環繞通知,異常通知,最終通知

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM