Spring_AOP容器

一、代理模式

  1、代理模式的设计原则:

    ·代理类与委托类具有相似的行为

    ·代理类增强委托类的行为

  

  2、代理模式实现的三要素:

    代理角色、目标角色、共同行为

    实现行为接口,持有目标对象的引用

  3、静态代理和动态代理

    1)静态代理

      特点:程序运行前制作代理角色

         代理目标角色单一

         代理类数量无法控制

    2)动态代理

      程序运行期动态创建代理角色

      ·JDK动态代理,回调方式实现

      ·cglib动态代理,继承方式实现

     区别:

        JDK动态代理:委托类必须要有接口,制作过程较快,执行慢

        Cglib动态代理:委托类可以没有接口,继承的思维来实现相似性,制作代理过程比较慢,执行快

二、AOP(面相切面编程)

  AOP的两种实现机制是JDK动态代理和cglib动态代理

    AOP主要应用于日志记录,性能统计,安全控制,事务处理额等方面,实现公共行为的重复使用

    降低模块之间的耦合度,提高业务代码的聚合度(高内聚低耦合)

    提高代码的复用性

    提高系统的扩展性

  Aop基本概念

    Joinpoint(连接点):spring中指被拦截到的每一个方法

    Pointcut(切入点):规定拦截哪些方法,对那些方法进行处理

    Advice(通知):拦截到每一个连接点后要做的操作

      前置通知、返回通知、最终通知、异常通知、环绕通知

    Aspect(切面):切入点与通知的结合

    Target(目标对象):被代理的目标对象

    Weave(织入)

    Introduction(引入)

三、AOP注解实现

  1、XML:引入命名空间,开启aop代理环境

    

  2、Maven项目引入Aspect坐标

  3、创建切面类  @Aspect定义切面类

  4、声明方法为切入点  @Pointcut 匹配规则定义 execution

  5、创建通知方法

    

package com.shsxt02.proxy;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LogCut {

    @Pointcut("execution(* com.shsxt02.service..*.*(..))")
    public void cut() {
    }

    @After(value = "cut()")
    public void before(){
        System.out.println("前置通知,目标方法执行前执行...");
    }

    @AfterReturning(value = "cut()")
    public void afterReturn(){
        System.out.println("返回通知,方法正常结束后执行...");
    }

    @After(value = "cut()")
    public void after(){
        System.out.println("最终通知,方法是否发生异常均会执行...");
    }

    @AfterThrowing(value = "cut()",throwing = "e")
    public void afterThrow(Exception e){
        System.out.println("异常通知,异常时执行..."+e);
    }

    // 环绕通知
    @Around(value = "cut()")
    public Object around(ProceedingJoinPoint  pjp) throws Throwable {
        Object result=null;
        System.out.println("环绕前置...");
        System.out.println("环绕通知...");
        System.out.println("方法签名"+pjp.getSignature());
        System.out.println("目标对象"+pjp.getTarget());
        System.out.println("种类"+pjp.getKind());
        Object[] objects=pjp.getArgs();
        for(Object o:objects){
            System.out.println("参数"+o);
        }
        result= pjp.proceed(); // 返回的目标对象
        System.out.println("环绕后置...");
        return result;
    }
}

四、AOP XML配置实现

  

五、AOP拦截注释

  

如果目标角色实现了接口,AOP有代理,返回的是代理对象,需要通过接口接收。

原文地址:https://www.cnblogs.com/dhome/p/9716234.html

时间: 2024-10-23 03:47:57

Spring_AOP容器的相关文章

Docker学习笔记——Mongo Dockerfile及容器运行

1.创建项目目录mongo,在目录下上传下载的Mongodb安装文件及mongo.conf配置文件,创建Dockerfile文件,项目结构如下: mongo - Dockerfile - mongo.conf - mongodb-linux-x86_64-3.4.9.tgz - data - logs Dockerfile内容如下: # mongo # SOURCE_IMAGE FROM centos # MAINTAINER_INFO MAINTAINER bluemooder [email 

spring父子容器

通过HierarchicalBeanFactory接口,Spring的IoC容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的Bean,但父容器不能访问子容器的Bean.在容器内,Bean的id必须是唯一的,但子容器可以拥有一个和父容器id相同的Bean.父子容器层级体系增强了Spring容器架构的扩展性和灵活性,因为第三方可以通过编程的方式,为一个已经存在的容器添加一个或多个特殊用途的子容器,以提供一些额外的功能. Spring使用父子容器实现了很多功能,比如在Spring MVC中

java持有对象【2】ArrayList容器续解

此为JDK API1.6.0对ArrayList的解释. ArrayList 使用java泛型创建类很复杂,但是应用预定义的泛型很简单.例如,要想定义用来保存Apple对象的ArrayList,可以声明ArrayList<Apple>,尖括号内为类型参数,(可以为多个).它指定了容器可以保存的类型. 通过使用泛型,可以在编译期防止将错误类型的对象放置到容器中. ArrayList向上转型为List. 应该注意到,在将元素从List中取出时,类型转换不是必须的了.因为List在调用get()时会

width:100%与绝对定位同时存在,偏移出父级容器

当父级容器内的子元素width设为100%,而子元素又有绝对定位时,子元素伸展超出父级容器,像下面 出现这种情况的原因,width:100%,这个百分之百是相对其定位父级而言的,其定位父级有多宽,这个子元素就有多宽,所以子元素跑到了父级容器外 html <div class="container"> <div class="content">好的</div> </div> css .container { positi

【Docker常见问题2】如何设置容器日志大小和保留个数

举例:当tomcat容器的运行,容器占用空间越来越大,约1个月就会超过2G,如何解决? 步骤1:查看容器日志大小:假设容器目录为/var/lib/docker/containers,那么执行如下命令 cd /var/lib/docker/containers  #进入默认容器空间目录 du -sh *            #统计文件大小2.4G  de92a5643f7ffb106f8abba21fc0f93996842917a52879153adc95a73312934a-json.log

Vector容器 和 iteration 迭代器

vector容器 vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库负责管理存储元素的相关内存.我们把vector称为容器,是因为它可以包含其他对象.一个容器中的所有对象都必须是同一种类型的. 使用vector之前,必须包含相应的头文件.#include <vector> using std::vector; vector是一个类模板(class template).模板允许程序员编写单个类或函数定义,这个类和函数定义可用于不同的数据类型上.

架构师养成--7.同步类容器和并发类容器

一.同步类容器 同步类容器都是线程安全的,但在某些场景下可能需要加锁来保护复合操作.复合类操作如:迭代(反复访问元素,遍历完容器中的所有元素).跳转(根据指定的顺序找到当前元素的下一个元素).以及条件运算.这些复合操作在多线程并发的修改容器时,可能会表现出意外的行为,最经典的便是ConcurrentModificationException,原因是当容器迭代的过程中,被并发的修改了内容,这是由于早期迭代器设计的时候并没有考虑并发修改的问题. 同步类容器:如古老的Vector/HashTable.

vector容器用法详解

vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组.像数组一样,vector类也用从0开始的下标表示元素的位置:但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化. vector类常用的函数如下所示: 1.构造函数 vector():创建一个空vector vector(int nSize):创建一个vector,元素个数为nSize vector(int nSize,const t& t):创建一个vector,元

【Effective Java】8、优先考虑类型安全的异构容器

有的时候我们一个容器只有一个类型或几个类型并不能满足我们的要求,比如set中存放的元素类型都是同一种,map也就指定的两种 这里我们可以将键进行参数化,而不是将容器参数化,也就是我们可以给容器传一个键的类型,然后value用来放对应的实例,这样就可以存放多个不同的类型了 如: package cn.xf.cp.ch02.item29; import java.util.HashMap; import java.util.Map; public class ManyTypeClass { //一个