最近有人私信我说,我写的博客有些肤浅,没有深究,在此我统一回复一下,这些博客大多都是概念性东西,是用通俗的例子让你理解这个技术或者知识到底是怎么一样原理。
所以我在后面都加着适合新人,我们都是从新人走过来的,知道初学者的那种迷茫,只会代码,不懂原理和含义,就比如,注解,你不去学习理解,初学者根本就不知道那是个什么东西,为什么要使用注解。
如果是资深大牛,那就不要看了,还是那句话,适合新人。
————————————————
1,什么是SpringAOP?
面向切面编程;
2,理解SpringAOP;
切面编程,首先我们需要理解什么是切面,比如:
用刀将西瓜劈成两半,那么被刀切开的面,就是切面,
在运用到代码中
每个类与类,之间就是一个切面;
3,SpringAOP的作用;
功能是让关注点代码与业务代码分离;
关注点: 重复代码就叫关注点;
切面: 关注点形成的类,就叫切面,面向切面编程,就是指很多功能都有的重复代码抽取,再在运行的时候,往业务代码中动态的植入“切面代码”;
切入点: 执行目标对象方法,动态植入切面代码,通过切入点表达式,指定拦截那些类的那些方法,给指定的类在运行的时候植入切面类代码;
举个日常的例子:
按照理解开看,我们炒菜,锅和铲子是固定的,并且只有一套,而炒什么菜,取决于我们的材料,画个图;

锅与铲子,都是做饭需要的东西,是不会变的,无论做什么饭都需要这两个东西。
这个锅与铲子,就是一个切面,因为他重复使用。
在炒菜中,我们是面向锅与铲子炒菜,蔬菜选好了,我们拿出来锅与铲子就行了;
代码中,我们是面向重复代码组成的类,编程;要做的业务调好了,我们将切面植入进去就好了。
将重复的代码,提取出来,形成一个单独的类,这个类就是切面;
4, 案例;
- 创建一个 service层
package com.aaa.service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.aaa.dao.UserDao;
@Service
public class UserService {
@Resource
private UserDao userDao;
public void add(){
System.out.println("这是业务逻辑层... ...");
userDao.add();
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
- 设置bean。 这个bean的意思是,开启aop注解
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
- 设置一个aop
package com.aaa.service;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component
//这个注解表示切面
@Aspect
public class Aop {
//开启事务 前置通知
@Before("execution(* com.aaa.service.UserService.add(..))")
public void begin(){
System.out.println("事务开启... ...");
}
@After("execution(* com.aaa.service.UserService.add(..))")
//提交事务 后置通知
public void commit(){
System.out.println("事务提交... ...");
}
//异常通知
@AfterThrowing("execution(* com.aaa.service.UserService.add(..))")
public void error(){
System.out.println("异常通知... ...");
}
//运行通知
@AfterReturning("execution(* com.aaa.service.UserService.add(..))")
public void run(){
System.out.println("运行通知... ...");
}
//环绕通知
@Around("execution(* com.aaa.service.UserService.add(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
System.out.println("环绕通知 ,之前 .... ....");
proceedingJoinPoint.proceed();
System.out.println("环绕通知 ,之后 .... ....");
}
}
就这样,在com.aaa.service.UserService.add这个路径的add方法就会出现这些通知;
SpringAOP是通过动态代理来实现的,这一点很重要,关于动态代理:
java代理设计模式之静态代理,动态代理(适合新人)
本文深入讲解了SpringAOP的基本概念,包括切面、关注点、切入点等关键术语,并通过一个具体的示例,演示了如何在业务代码中动态植入切面代码,实现关注点与业务代码的分离。
1045

被折叠的 条评论
为什么被折叠?



