实习笔记 —— AOP开发I

实习笔记 —— AOP开发I,第1张

系列文章目录

实习笔记 —— Spring基础
实习笔记 —— IOC反转控制(xml配置文件 + 注解)


文章目录
  • 系列文章目录
  • 一、什么是AOP?
    • 1.简介
    • 2.与OOP的对比
    • 3.AOP的相关术语
  • 二、AOP代码简例
  • 三、今日总结


一、什么是AOP? 1.简介

AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

简单来说,AOP就是通过运行期间生成动态代理的方式,实现代码隔离,维护方便,功能增强效果。

2.与OOP的对比

AOP是面向切面编程,横向
OOP是面向对象编程,纵向

AOP原理,以开发网络购物平台为例:

此为纵向开发的例子,包括5个模块。
购物车的商品不写数据库,因为购物车的商品变更比较频繁,引发数据库抖动。

若在上述模块都完成后又需增加两项功能:显示用户等级、徽章等身份 + 在每次跳转页面时验证用户身份。按照传统做法(没有切面编程),我们得一项一项地添加到每个模块中,对代码进行整理和增删,效率很低。
在切面编程中,将新添加的两个功能单独写在一个模块中,使用spring的注入方式将其注入到需要这些功能的模块中,原有的模块完全不需改变。既提高了开发效率,又维持了原有代码的稳定。

3.AOP的相关术语

①Joinpoint:连接点,待增强或完善的那些已写好的模块/方法(我们主要针对方法)

②Pointcut:切入点,真正需要做的连接点(连接点是众多候选人,切入点是得奖者,可能不止一个)

③Advice:通知,增强;甲方要求新增加的方法或需求(如上述显示用户身份需求)

④Target:目标,切入点(被增强的方法)所属的类

⑤Weaving:织入,将Advice应用到Target的过程(将甲方新增的需求应用到某个切入点的过程,即颁奖仪式)

⑥Aspect:切面,多个Weaving过程配置(单个Weaving是点对点的,多个累计就形成了面),构成切面

二、AOP代码简例

创建了新的项目结构:

com.high.demo1包的内容:

①创建接口:

②接口的实现类:

③切面类:

④XML配置文件:
新的文件头:


<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">
beans>

配置文件内容:


<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 name="productDao" class="com.high.demo1.ProductDaoImpl">bean>      
 	       
   	
   	<bean name="myAspect" class="com.high.demo1.MyAspectXML">bean>  
   	 
   	
   	
   	<aop:config>
   			
   		<aop:pointcut id="pointcut1" expression="execution(* com.high.demo1.ProductDaoImpl.save(..))"/>
   		<aop:pointcut id="pointcut2" expression="execution(* com.high.demo1.ProductDaoImpl.delete(..))"/>
   		
   		
   		
   		
   		<aop:aspect ref="myAspect">
   			
   			
   			<aop:before method="checkPri" pointcut-ref="pointcut1"/>
   			
   			<aop:after-returning method="writeLog" pointcut-ref="pointcut2" returning="result"/>
   			
   		aop:aspect>
   	aop:config>
beans>

⑤测试类:

package com.high.demo1;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

// AOP入门 
// 书写类注解,类层级,所以写在类外面
// 整合JUnit4
@RunWith(SpringJUnit4ClassRunner.class)
// 加载XML配置文件(严格按照格式书写,不要添加任何空格等字符)
@ContextConfiguration("classpath:applicationContext.xml")

public class SpringDemo {
	
	// 1.未使用注解整合JUnit
//	@Test
//	public void demo() {
//		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//		ProductDaoImpl product = (ProductDaoImpl)applicationContext.getBean("productDao");
//		
//		product.save();
//		product.update();
//		product.delete();
//		product.find();
//	}
	
	// 2.整合后
	// 想用哪个类就注入哪个类,交给spring管理
	
	// 对私有属性的引入
	@Resource(name = "productDao")
	private ProductDao productDao;
		
	@Test
	public void demo2() {
		productDao.save();
		productDao.update();
		productDao.delete();
		productDao.find();
	}
}

测试结果:

三、今日总结

1.切入点 + Advice 是今天内容的重点。
2.修改的内容都在文件/spring03/src/com/high/demo1/MyAspectXML.java + /spring03/src/applicationContext.xml 中。测试类、接口、接口的实现类都无需改变。
3.总结一下AOP编程的流程:
①创建接口,接口中有若干待方法。
②创建接口的实现类,此时实现类中实现的是基本功能,若甲方提出新的需求,就轮到AOP编程出场了。
③编写XML配置文件,将接口的实现类交给spring管理。

 	<bean name="productDao" class="com.high.demo1.ProductDaoImpl">bean>      

(完成这步后可在测试类中加载配置文件并获取实现类对象,执行实现类中实现的接口的方法以判断到此为止的初步书写是否正确)

@Test
public void demo() {
	ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
	ProductDaoImpl product = (ProductDaoImpl)applicationContext.getBean("productDao");
		
	product.save();
	product.update();
	product.delete();
	product.find();
}

④若此时甲方新的需求到来了,则需要编写切面类,存放甲方要增加的方法,举两例:

public class MyAspectXML {
	// 前置通知
	public void checkPri(JoinPoint jointJoinpoint) {
		System.out.println("save方法的前置通知:进行身份验证........" + jointJoinpoint);
	}
	
	// 后置通知
	public void writeLog(Object result) {
		System.out.println("delete方法的后置通知:Be recorded....." + result);
	}
}

要实现在save方法执行前增加新的输出语句,并在delete方法执行后增加新的输出语句。

编写好切面类,需编写XML配置文件,将切面类交给spring管理:

<bean name="myAspect" class="com.high.demo1.MyAspectXML">bean>  

后续 *** 作:声明切入点,将通知(Advice)应用到切面类(Target),即进行织入过程:



<aop:config>
   		
   	<aop:pointcut id="pointcut1" expression="execution(* com.high.demo1.ProductDaoImpl.save(..))"/>
   	<aop:pointcut id="pointcut2" expression="execution(* com.high.demo1.ProductDaoImpl.delete(..))"/>
   		
   		
   		
   	
   	<aop:aspect ref="myAspect">
   		
   		
   		<aop:before method="checkPri" pointcut-ref="pointcut1"/>
   		
   		<aop:after-returning method="writeLog" pointcut-ref="pointcut2" returning="result"/>
   			
   	aop:aspect>
aop:config>

⑤之后只需编写测试类,获取接口实现类的对象后调用其中的方法,看看我们是否将在原有方法基础上实现了新需求:

// 2.整合后
// 想用哪个类就注入哪个类,交给spring管理
	
// 对私有属性的引入
@Resource(name = "productDao")
private ProductDao productDao;
		
@Test
public void demo2() {
	productDao.save();
	productDao.update();
	productDao.delete();
	productDao.find();
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/730740.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存