spring的aop面向切面编程

手握太阳      2022-04-09     456

关键词:

用设计模式是思想理解:面向切面编程

1、spring自动生成代理类

 

 

 

Spring的AOP面向切面编程

什么是AOP?

1.AOP概念介绍

  所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程。

   功能: 让关注点代码与业务代码分离!

关注点:

          重复代码就叫做关注点;

业务代码:

    核心业务的代码

业务代码与关注点代码分离,好处?

               --> 关注点代码写一次即可;

                   -->开发者只需要关注核心业务;

                   -->运行时期,执行核心业务代码时候动态植入关注点代码; 【代理】

如何分离?

         过程式/对象式/代理模式分离

  AOP的好处是可以动态地添加和删除在切面上的逻辑而不影响原来的执行代码

切面,

          关注点形成的类,就叫切面(类)!

          面向切面编程,就是指 对很多功能都有的重复的代码抽取,再在运行的时候往业务方法上动态植入“切面类代码”。

切入点(拦截的作用)

         执行目标对象方法,动态植入切面代码。

         可以通过切入点表达式,指定拦截哪些类的哪些方法; 给指定的类在运行的时候植入切面类代码。

注解方式实现AOP编程

步骤:

1) 先引入aop相关jar文件           (aspectj  aop优秀组件)                                      

         spring-aop-3.2.5.RELEASE.jar   【spring3.2源码】

    aopalliance.jar                         【spring2.5源码/lib/aopalliance】

      aspectjweaver.jar                    【spring2.5源码/lib/aspectj】或【aspectj-1.8.2\lib】

    aspectjrt.jar                            【spring2.5源码/lib/aspectj】或【aspectj-1.8.2\lib】

注意: 用到spring2.5版本的jar文件,如果用jdk1.7可能会有问题。

                   需要升级aspectj组件,即使用aspectj-1.8.2版本中提供jar文件提供。

 

2) bean.xml中引入aop名称空间

3) 开启aop注解

4) 使用注解

@Aspect                                                              指定一个类为切面类             

@Pointcut("execution(* cn.itcast.e_aop_anno.*.*(..))")  指定切入点表达式

@Before("pointCut_()")                                    前置通知: 目标方法之前执行

@After("pointCut_()")                                         后置通知:目标方法之后执行(始终执行)

@AfterReturning("pointCut_()")                         返回后通知: 执行方法结束前执行(异常不执行)

@AfterThrowing("pointCut_()")                            异常通知:  出现异常时候执行

@Around("pointCut_()")                                      环绕通知: 环绕目标方法执行

代码示例:

1、bean.xml中引入aop名称空间

2、 开启aop注解

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd">
    
    <!-- 使用注解时要开启注解扫描 要扫描的包 -->
    <context:component-scan base-package="cn.itcast.e_aop_anno"></context:component-scan>
    
    <!-- 开启aop注解方式 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>   
复制代码

3、指定切面类

复制代码
@Component  //加入IOC容器
@Aspect  // 指定当前类为切面类
public class Aop {

    // 指定切入点表达式: 拦截哪些方法; 即为哪些类生成代理对象   //解释@Pointcut("execution(* cn.itcast.e_aop_anno.*.*(..))")
  //@Pointcut("execution(*    切入点表达式固定写法, cn.itcast.e_aop_anno表示包.类名(可以用*表示包下所有的类).方法名(可以用*表示类下所有的方法)(..)表示参数可以用..
    @Pointcut("execution(* cn.itcast.e_aop_anno.*.*(..))")
    public void pointCut_(){
    }
       //@Before("execution(* cn.itcast.e_aop_anno.*.*(..))")每个方法需要写相同的引用,所以将相同的部分抽取到一个空的方法中pointCut_(),
    // 前置通知 : 在执行目标方法之前执行
    @Before("pointCut_()")
    public void begin(){
        System.out.println("开始事务/异常");
    }
    
    // 后置/最终通知:在执行目标方法之后执行  【无论是否出现异常最终都会执行】
    @After("pointCut_()")
    public void after(){
        System.out.println("提交事务/关闭");
    }
    
    // 返回后通知: 在调用目标方法结束后执行 【出现异常不执行】
    @AfterReturning("pointCut_()")
    public void afterReturning() {
        System.out.println("afterReturning()");
    }
    
    // 异常通知: 当目标方法执行异常时候执行此关注点代码
    @AfterThrowing("pointCut_()")
    public void afterThrowing(){
        System.out.println("afterThrowing()");
    }
    
    // 环绕通知:环绕目标方式执行
    @Around("pointCut_()")
    public void around(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("环绕前....");
        pjp.proceed();  // 执行目标方法
        System.out.println("环绕后....");
    }
    
}
复制代码

接口

// 接口
public interface IUserDao {
    void save();
}

4、目标对象类一:实现接口

复制代码
/**
 * 目标对象
 */
@Component   // 加入容器
public class UserDao implements IUserDao{

    @Override
    public void save() {
        System.out.println("-----核心业务:保存!!!------"); 
    }
}
复制代码

目标对象类二:没有实现接口

复制代码
/**
 * 目标对象*/
@Component   // 加入容器
@Scope("prototype")
public class OrderDao{

    public void save() {
        System.out.println("-----核心业务:保存!!!------");
    }
}
复制代码

测试类

复制代码
public class App {
    
    ApplicationContext ac = 
        new ClassPathXmlApplicationContext("cn/itcast/e_aop_anno/bean.xml");

    // 目标对象有实现接口,spring会自动选择“JDK代理”
    @Test
    public void testApp() {
        IUserDao userDao = (IUserDao) ac.getBean("userDao");
        System.out.println(userDao.getClass());//$Proxy001  
        userDao.save();
    }
    
    // 目标对象没有实现接口, spring会用“cglib代理”
    @Test
    public void testCglib() {
        OrderDao orderDao = (OrderDao) ac.getBean("orderDao");
        System.out.println(orderDao.getClass());
        orderDao.save();
    }
复制代码

输出结果:

    开始事务/异常

    -----核心业务:保存!!!------

    提交事务/关闭


 

XML方式实现AOP编程 

Xml实现aop编程:

         1) 引入jar文件  【aop 相关jar, 4个】

         2) 引入aop名称空间

         3)aop 配置

                   * 配置切面类 (重复执行代码形成的类)

                   * aop配置

                            拦截哪些方法 / 拦截到方法后应用通知代码

代码示例:

bean.xml配置

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    
    <!-- dao 实例   在这里配置后就不用在类中使用注解 -->
    <bean id="userDao" class="cn.itcast.f_aop_xml.UserDao"></bean>
    <bean id="orderDao" class="cn.itcast.f_aop_xml.OrderDao"></bean>
    
    <!-- 切面类 -->
    <bean id="aop" class="cn.itcast.f_aop_xml.Aop"></bean>
    
    <!-- Aop配置 -->
    <aop:config>
        <!-- 定义一个切入点表达式: 拦截哪些方法 -->
        <aop:pointcut expression="execution(* cn.itcast.f_aop_xml.*.*(..))" id="pt"/>
        <!-- 切面 -->
        <aop:aspect ref="aop">
            <!-- 环绕通知 -->
            <aop:around method="around" pointcut-ref="pt"/>
            <!-- 前置通知: 在目标方法调用前执行 -->
            <aop:before method="begin" pointcut-ref="pt"/>
            <!-- 后置通知: -->
            <aop:after method="after" pointcut-ref="pt"/>
            <!-- 返回后通知 -->
            <aop:after-returning method="afterReturning" pointcut-ref="pt"/>
            <!-- 异常通知 -->
            <aop:after-throwing method="afterThrowing" pointcut-ref="pt"/>
            
        </aop:aspect>
    </aop:config>
</beans>      
复制代码

全部使用xml配置后,类中注解全部去掉,代码同上

转:https://www.cnblogs.com/guzhou-ing/p/6445159.html

spring框架--aop面向切面编程(代码片段)

Spring框架往期文章Spring框架(一)–spring搭建和IOCSpring框架(二)–SpringBean管理Spring框架(三)–SpringJDBCSpring框架(四)–AOP面向切面编程Spring框架(五)–Spring事务管理和Spring事务传播行为AOP(AspectOrientedProgramming面向切面编程)不使用AOP的开... 查看详情

aop:面向切面

...装成切面,利用AOP容器功能将切面织入到主业务逻辑 Spring AOP是Spring框架中的一部分,但可以作为一个独立的模块单独存在。Spring A 查看详情

#yyds干货盘点#spring核心之面向切面编程(aop)

Spring核心之面向切面编程(AOP)如何理解AOPAOP的本质也是为了解耦,它是一种设计思想;在理解时也应该简化理解。AOP是什么AOP为AspectOrientedProgramming的缩写,意为:面向切面编程AOP最早是AOP联盟的组织提出的,指定的一套规范,spring... 查看详情

spring中面向切面编程(aop)的个人理解

 面向切面编程AOP,是spring的一大特点Aspect切面:封装共性功能的(增强功能的)类Advice通过:切面类中封装的增强功能的方法。PointCut:切入点,是一个集合的概念,该集合的表达使用一个正则表达式表达    &nb... 查看详情

spring(二)面向切面编程aop

  这篇博客写的比较累赘,好多相同的程序写了好几遍,主要是为了是自己养成这样的一个编程思路,其中应该不乏错误之处,以后好好学,慢慢改吧。——————jgp1AOP介绍  1.1什么是AOP  面向切面编程(AspectOrientedPro... 查看详情

java实战之03spring-03spring的核心之aop(aspectorientedprogramming面向切面编程)

三、Spring的核心之AOP(AspectOrientedProgramming 面向切面编程)1、AOP概念及原理1.1、什么是AOPOOP:ObjectOrientedProgramming面向对象编程AOP:AspectOrientedProgramming面向切面编程1.2、代理充分理解:间接主要作用:拦截被代理对象执行的... 查看详情

spring:aop(面向切面编程),spring的jdbc模板类

...种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高 查看详情

spring基础_面向切面(aop)

...运行期间动态代理实现程序功能的统一维护的技术。AOP是Spring框架中的一个重要内容,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。在... 查看详情

spring的aop面向切面编程

什么是AOP?1.AOP概念介绍  所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程。   功能:让关注点代码与业务代码分离!关注点:         重复代码就叫做关注点;业务代码:    核... 查看详情

面向切面编程的介绍和使用(spring框架)

Spring框架整理第二发,AOP的介绍和使用。AOP概述AOP:aspectorientedprogramming:面向切面编程OOP:ObjectOrientedprogramming:面向对象编程AOP和OOP是两种编程思想,AOP是OOP的一种补充。面向切面编程:是指在程序... 查看详情

spring面向切面编程(aop)

Spring系列教程Spring框架介绍Spring框架模块Spring开发环境搭建(Eclipse)创建一个简单的Spring应用Spring控制反转容器(InversionofControl–IOC)理解依赖注入(DI–DependencyInjection)BeanXML配置(1)-通过XML配置加载BeanBeanXML配置(2)-Bean作... 查看详情

spring框架—面相切面编程aop

spring框架(2)—面相切面编程AOP  AOP(AspectOrientedProgramming),即面向切面编程。  可以说是OOP(ObjectOrientedProgramming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共... 查看详情

spring4——aop面向切面

...AspectOrientedProgramming(AOP),是软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。主... 查看详情

spring之aop(面向切面编程)_入门demo

软件152刘安民AOP是OOP的延续,是AspectOrientedProgramming的缩写,意思是面向切面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。    &n... 查看详情

aop(面向切面编程)

...种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度 查看详情

详解spring面向切面编程(aop)三种实现

一、什么是AOPAOP(AspectOrientedProgramming),即面向切面编程,可以说是OOP(ObjectOrientedProgramming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允... 查看详情

spring框架系列-深入浅出spring核心之面向切面编程(aop)

在​​Spring基础-Spring简单例子引入Spring的核心​​中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点;本节将在此基础上进一步解读AOP的含义以及AOP的使用方式。@pdai引入我们在​​Spring基础-Spring简单例子引入Spring... 查看详情

springaop面向切面编程

Spring中三大核心思想之一AOP(面向切面编程):在软件业,AOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热... 查看详情