Spring学习第三天------2021-07-15-AOP


AOP面向切面【Aspect Oriented Programming】

1.代理设计模式

将程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们已有方法进行增强

2.Java 2中动态代理模式

1.JDK动态代理机制
必须有接口
2.CJGLIB动态代理机制
可以没有接口

3.AOP的作用及优势

作用:在程序运行期间,不修改源码对已有方法进行增强。
优势:减少重复代码、提高开发效率、维护方便

4.面向切面编程【注解版本】

1、导入切面相关联坐标【pom.xml中】

<!--AOP切面坐标-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.2</version>
        </dependency>

2、在配置文件中追加切面的命名空间【beans.xml中】

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:bean="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">

在这里插入图片描述

3、开启自动代理【beans.xml中】

 <!--开启切面自动扫描-->
    <aop:aspectj-autoproxy ></aop:aspectj-autoproxy>

4、切面类写注解【@Component和@Aspect】

@Aspect
@Component
public class MyAop {

    @Before(value = "execution(* com.zx.service.impl.UserServiceImpl.testAop(..))")
    public void before(){
        System.out.println("before");
    }
    @After(value = "execution( * com.zx.service.impl.UserServiceImpl.testAop(..))")
    public void after(){
        System.out.println("after");
    }
    @Around(value = "execution( * com.zx.service.impl.UserServiceImpl.testAop(..))")
    public void around(ProceedingJoinPoint p ) throws Throwable {
        System.out.println("环绕通知.前");
        p.proceed();
        System.out.println("环绕通知.后");
    }
    @AfterReturning(value = "execution( void com.zx.service.impl.UserServiceImpl.testAop(..))")
    public void afterReturning(){
        System.out.println("afterReturning");
    }
    @AfterThrowing(value = "execution( void com.zx.service.impl.UserServiceImpl.testAop(..))")
    public void afterThrowing(){
        System.out.println("afterThrowing");
    }
}

5.通知类型:

		i. 前置通知:@Before:
			1) 应用:各种校验
			2) 其它:在方法执行前执行,该方法中出现了异常,不会影响前置统治的执行
		ii. 后置通知:@After
			1) 应用:清理现场
			2) 其它:方法执行完毕后执行,无论方法中是否出现异常都会执行
		iii. 最终通知:@AfterRetuening
			1) 应用:常规数据处理
			2) 其它:方法正常返回后执行,无论方法中是否出现异常都会执行
		iv. 抛异常通知:@AfterThrowing
			1) 应用:包装异常信息
			2) 其它:方法抛出异常后执行,如果方法没有抛出异常,无法执行
		v. 环绕通知:@Around
			1) 应用:十分强大,可以做任何事情
			2) 其它:方法执行前后分别执行,如果方法中有异常,末尾通知就不执行了

6.切入点表达式:

		i. 语法:通知类型(“execution(切入的方法)”)
		ii. 访问修饰符:一般是public
		iii. 返回值:void    int    String    User   
		 通配符:  *  ,匹配所有返回值
		iv. 包名:一般情况下切入到接口包即可
			..   接口包以及子包
			.  接口包
		v. 方法名称:类的全限定类名.方法名称
		vi. 参数:(int) (java.lang.String) 
			(*)一个任意类型的参数
			(*,*)两个任意类型的参数
			(. .)人一个属任意类型的参数
	h. 【注意事项】public可以省略!

5.面向切面编程【注解版本】

在beans.xml中添加,
头声明文件同上

<!--XML版本的AOP配置-->
    <!--声明切面类-->
    <bean id="myop_xml" class="com.zx.aop.MyAop"></bean>
    <!--配置AOP切面相关内容-->
    <aop:config>
        <aop:aspect id="aspect" ref="myop_xml">
            <aop:pointcut id="pointcut" expression="execution(* com.zx.service.impl.UserServiceImpl.testAop(..))"></aop:pointcut>
            <aop:before method="before" pointcut-ref="pointcut"></aop:before>
            <aop:after method="after" pointcut-ref="pointcut"></aop:after>
        </aop:aspect>
    </aop:config>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值