面向切面编程AOP是什么呢?
举个例子,如某公司开发了一个人力资源管理系统,要检测这个系统的每个方法的运行效率以及所耗用的时间,然而一个成形的系统,有成千上万个方法,都要加检测运行效率的代码,可想而知是多大的一个工程,而且后期还要移除掉代码;如果能够在系统中大动态添加代码,就能很好的解决这个需求。这种在系统运行时添加代码的方式称作为面向切面编程(AOP)
面向切面的概念就先介绍到这,咱们接下来开始写代码。
1.首先在pom文件中加入aop的依赖
<!--面向对象aop 面向切面-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.在包下创建 一个UserService 模拟 实际的业务逻辑接口方法
@Service
public class UserService {
public String getUserById(Integer id)
{
System.out.println("get·····");
return "User";
}
public void deleteUserById(Integer id)
{
System.out.println("delete····");
}
}
3.开始创建切面
@Component
@Aspect
public class LogAspect {
@Pointcut("execution(* com.springboot.chapter05.service.*.*(..))")
public void pc1(){
}
@Before(value = "pc1()")
public void before(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"方法开始执行····");
}
@After(value = "pc1()")
public void after(JoinPoint jp)
{
String name=jp.getSignature().getName();
System.out.println(name+"方法执行结束····");
}
@AfterReturning(value = "pc1()")
public void afterreturning(JoinPoint jp)
{
String name=jp.getSignature().getName();
System.out.println(name+"方法返回值为····");
}
@AfterThrowing(value = "pc1()",throwing = "e")
public void afterthrowing(JoinPoint jp,Exception e)
{
String name=jp.getSignature().getName();
System.out.println(name+"方法抛出异常率,异常是····"+e.getMessage());
}
public Object around(ProceedingJoinPoint pjp)throws Throwable{
return pjp.proceed();
}
}
代码解释:
@Aspect注解表明的是这是一个切面类
@PointCut是一个切入点, execution中的第一个*表示方法返回任意值,第二个*表示service包下的任意类,第三个*表示类中的任意方法,括号中的两个点表示方法任意参数,当前描述的是service包下的所有类中的所有方法
@Before是一个前置通知,方法执行前进入
@After是一个后置通知,方法执行后进入
@AfterRunning是一个返回通知,方法执行完毕返回值的时候进入
@AfterThrowing是一个异常通知,目标方法发生异常是进入
@Around是一个环绕通知,是所有通知中功能最强大的通知
4.在controller包下新建UserController,分别调用,既可以看到切面里的代码动态迁入到目标方法中了
@RestController
public class UserController {
@Autowired
UserService service;
@GetMapping("/getuserbyid")
public String getUserById()
{
String user=service.getUserById(1);
return user;
}
@GetMapping("/deleteuserbyid")
public void deleteUserById()
{
service.deleteUserById(1);
}
}
5.运行到控制台查看结果