Spring AOP学习(一)

最近在看spring aop的内容,在这作个笔记。 1、介绍 一、了解编程范式: (1)面向过程编程:C语言 (2)面向对象编程:Java、C++ (3)函数式编程 (4)事件驱动编程:GUI (5)面向切面编程:AOPphp

二、AOP是什么? 是一种编程方式,不是编程语言。 解决特定问题,不是全部问题 aop是面向对象编程的补充c++

三、Aop初衷: DRY:Don’t repeat yourself 不用重复代码 SoC:Separation of Concenrns 关注点分离 水平分离:展现层、服务层、持久层 垂直分离:模块划分(订单、库存) 切面分离:分离功能性需求和非功能性需求spring

四、Aop好处: 集中处理管理某一关注点/横切逻辑 能够很方便添加、删除关注点 侵入性少,加强代码可读性以及维护性编程

五、Aop应用场景 权限控制 缓存控制 事务控制 审计日志 性能监控 分布式追踪 异常处理缓存

六、支持AOP的编程语言:Java、 .net.、 c/c++、 ruby、Python 、php等等,包括面向对象语言,也包括脚本语言ruby

2、AOP的简单实现 主要步骤有: (1)引入aop maven 依赖; (2)编写切面代码(主要用到@Aspect、@Pointcut和通知注解); (3)编写单元测试,运行。maven

主要代码: 一、maven依赖:编程语言

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

二、业务逻辑类:分布式

@Service
public class ProductService{

	public void saveProduct() {
		System.out.println("save product now ……");
	}

	public void deleteProduct() {
		System.out.println("delete product now ……");
	}
	
	public void deleteProduct_throwWrong() throws Exception {
		System.out.println("delete product and throw exception now ……");
		throw new Exception();
	}
}

三、切面类:函数式编程

@Aspect
@Component
public class AspectTest {

	@Pointcut("within(cn.exercise.service.impl.ProductService)")
	public void adminOnly() {

	}

	@Before("adminOnly()")
	public void before() {
		System.out.println("------------ @Aspect ###before");
	}
	
//	@After("adminOnly()")
//	public void after() {
//		System.out.println("------------ @Aspect ###after");
//	}
	
//	@AfterReturning("adminOnly()")
//	public void afterReturning() {
//		System.out.println("------------ @Aspect ###afterReturning");
//	}
	
//	@AfterThrowing("adminOnly()")
//	public void after() {
//		System.out.println("------------ @Aspect ###afterThrowing");
//	}
	
//	@Around("adminOnly()")
//	public void Around(ProceedingJoinPoint joinPoint) {
//		System.out.println("------------ @Aspect ###around--before");
//		try {
//			joinPoint.proceed();
//		} catch (Throwable e) {
//			System.out.println("------------ @Aspect ###around--throwable");
//		} finally {
//			System.out.println("------------ @Aspect ###around--after");
//		}
//		System.out.println("------------ @Aspect ###around--last");
//	}
	
}

四、单元测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class AopTestApplicationTests {
	
	@Autowired
	private ProductService productServie;

	@Test
	public void contextLoads() throws Exception {
		productServie.saveProduct();
//		productServie.deleteProduct();
//		productServie.deleteProduct_throwWrong();
	}
	
}
相关文章
相关标签/搜索