SpringAOP学习(适合新人)

本文深入讲解了SpringAOP的基本概念,包括切面、关注点、切入点等关键术语,并通过一个具体的示例,演示了如何在业务代码中动态植入切面代码,实现关注点与业务代码的分离。

最近有人私信我说,我写的博客有些肤浅,没有深究,在此我统一回复一下,这些博客大多都是概念性东西,是用通俗的例子让你理解这个技术或者知识到底是怎么一样原理。
所以我在后面都加着适合新人,我们都是从新人走过来的,知道初学者的那种迷茫,只会代码,不懂原理和含义,就比如,注解,你不去学习理解,初学者根本就不知道那是个什么东西,为什么要使用注解。
如果是资深大牛,那就不要看了,还是那句话,适合新人。
————————————————

1,什么是SpringAOP?

面向切面编程;

2,理解SpringAOP;

切面编程,首先我们需要理解什么是切面,比如:
用刀将西瓜劈成两半,那么被刀切开的面,就是切面,
在运用到代码中
每个类与类,之间就是一个切面;

3,SpringAOP的作用;

功能是让关注点代码与业务代码分离;

关注点: 重复代码就叫关注点;

切面: 关注点形成的类,就叫切面,面向切面编程,就是指很多功能都有的重复代码抽取,再在运行的时候,往业务代码中动态的植入“切面代码”;

切入点: 执行目标对象方法,动态植入切面代码,通过切入点表达式,指定拦截那些类的那些方法,给指定的类在运行的时候植入切面类代码;

举个日常的例子:

按照理解开看,我们炒菜,锅和铲子是固定的,并且只有一套,而炒什么菜,取决于我们的材料,画个图;
在这里插入图片描述
锅与铲子,都是做饭需要的东西,是不会变的,无论做什么饭都需要这两个东西。
这个锅与铲子,就是一个切面,因为他重复使用。
在炒菜中,我们是面向锅与铲子炒菜,蔬菜选好了,我们拿出来锅与铲子就行了;
代码中,我们是面向重复代码组成的类,编程;要做的业务调好了,我们将切面植入进去就好了。

将重复的代码,提取出来,形成一个单独的类,这个类就是切面;

4, 案例;

  1. 创建一个 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;
	}

}

  1. 设置bean。 这个bean的意思是,开启aop注解
 <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
  1. 设置一个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代理设计模式之静态代理,动态代理(适合新人)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值