javascript
Spring 框架基础(04):AOP切面编程概念,几种实现方式演示
本文源碼:GitHub·點這里 || GitEE·點這里
一、AOP基礎簡介
1、切面編程簡介
AOP全稱:Aspect Oriented Programming,面向切面編程。通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。核心作用:可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的復用性和開發效率。AOP提供了取代繼承和委托的一種新的方案,而且使用起來更加簡潔清晰,是軟件開發中的一個熱點理念。
2、AOP術語
(1)、通知類型:Advice
前置通知[Before]:目標方法被調用之前; 返回通知[After-returning]:目標方法執行成功之后; 異常通知[After-throwing]:在目標方法拋出異常之后; 后置通知[After]:目標方法完成之后; 環繞通知[Around]:在目標方法執行前后環繞通知;(2)、連接點:JoinPoint
程序執行的某一個特定位置,如類初始前后,方法的運行前后。
(3)、切點:Pointcut
連接點是指那些在指定策略下可能被攔截到的方法。
(4)、切面:Aspect
切面由切點和通知的結合。
(5)、引入:Introduction
特殊的增強,為類添加一些屬性和方法。
(6)、織入:Weaving
將增強添加到目標類的具體連接點上的過程。編譯期織入,這要求使用特殊編譯器;類裝載期織入,這要求使用特殊的類加載器;動態代理織入,在運行期為目標類添加增強生成子類的方式,Spring采用的是動態代理織入,而AspectJ采用編譯期織入和類裝載期織入。
(7)、代理:Proxy
類被AOP織入后生成一個結果類,它是融合了原類和增強邏輯的代理類。
二、AOP編程實現方式
案例基于如下類進行:
public class Book {private String bookName ;private String author ; } public interface BookService {void addBook (Book book) ; } public class BookServiceImpl implements BookService {@Overridepublic void addBook(Book book) {System.out.println(book.getBookName());System.out.println(book.getAuthor());} }1、JDK動態代理
public class BookAopProxyFactory {public static BookService createService() {// 目標類final BookService bookService = new BookServiceImpl() ;// 切面類final BookAspect bookAspect = new BookAspect();/** 代理類:將目標類(切入點)和 切面類(通知) 結合*/BookService proxyBookService = (BookService) Proxy.newProxyInstance(BookAopProxyFactory.class.getClassLoader(),bookService.getClass().getInterfaces(),new InvocationHandler() {public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {// 前執行bookAspect.before();// 執行目標類的方法Object obj = method.invoke(bookService, args);// 后執行bookAspect.after();return obj;}});return proxyBookService ;} }2、CgLib字節碼增強
采用字節碼增強框架cglib,在運行時創建目標類的子類,從而對目標類進行增強。
public class BookAopCgLibFactory {public static BookService createService() {// 目標類final BookService bookService = new BookServiceImpl() ;// 切面類final BookAspect bookAspect = new BookAspect();// 核心代理類Enhancer enhancer = new Enhancer();// 確定父類enhancer.setSuperclass(bookService.getClass());// 設置回調函數enhancer.setCallback(new MethodInterceptor() {public Object intercept(Object proxy, Method method,Object[] args,MethodProxy methodProxy) throws Throwable {bookAspect.before();Object obj = method.invoke(bookService, args);bookAspect.after();return obj;}});BookServiceImpl proxyService = (BookServiceImpl) enhancer.create();return proxyService ;} }3、Spring半自動代理
spring 創建代理對象,從spring容器中手動的獲取代理對象。
- 配置文件
- 切面類
4、Spring全自動代理
從spring容器獲得目標類,如果配置Aop,spring將自動生成代理。
- 配置文件
5、綜合測試
@Test public void test1 (){BookService bookService = BookAopProxyFactory.createService() ;Book book = new Book() ;book.setBookName("Spring實戰");book.setAuthor("Craig Walls");bookService.addBook(book); } @Test public void test2 (){BookService bookService = BookAopCgLibFactory.createService() ;Book book = new Book() ;book.setBookName("MySQL");book.setAuthor("Baron");bookService.addBook(book); } @Test public void test3 (){String xmlPath = "spring-aop-half.xml";ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(xmlPath);BookService bookService = (BookService) context.getBean("proxyFactory");Book book = new Book() ;book.setBookName("紅樓夢");book.setAuthor("曹雪芹");bookService.addBook(book); } @Test public void test4 (){String xmlPath = "spring-aop-all.xml";ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(xmlPath);BookService bookService = (BookService) context.getBean("bookService");Book book = new Book() ;book.setBookName("西游記");book.setAuthor("吳承恩");bookService.addBook(book); }三、AspectJ切面編程
1、基礎簡介
AspectJ是一個基于Java語言的AOP框架,Spring2.0以后新增了對AspectJ切點表達式支持,通過JDK5注解技術,允許直接在類中定義切面,新版本Spring框架,推薦使用AspectJ方式來開發AOP編程。
2、XML配置方式
- 切面類
- 配置文件
- 測試方法
3、注解掃描方式
- 配置文件
- 注解切面類
- 測試方法
四、源代碼地址
GitHub·地址 https://github.com/cicadasmile/spring-mvc-parent GitEE·地址 https://gitee.com/cicadasmile/spring-mvc-parent總結
以上是生活随笔為你收集整理的Spring 框架基础(04):AOP切面编程概念,几种实现方式演示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 陈灯可重用代码段管理器(插件版最新版本:
- 下一篇: SpringCloud微服务(04):T