[spring]spring静态代理和aop

10.代理模式

代理模式的分类:

  • 静态代理
  • 动态代理

关系分析

[spring]spring静态代理和aop

抽象角色:一般会使用接口或者抽象类

真实角色:被代理的角色

代理角色:代理真实的角色,做一些附属的操作

客户:访问代理对象的人

静态代理

步骤:

抽象角色:

/**
 * @author panglili
 * @create 2022-07-24-15:00
 */
public interface Rent {
    public void rent();
}

真实角色:

/**
 * @author panglili
 * @create 2022-07-24-15:01
 */
public class Host implements Rent {
    public void rent() {
        System.out.println("host would rent house");

    }
}

代理角色:

/**
 * @author panglili
 * @create 2022-07-24-15:02
 */
public class Proxy implements Rent {

    private Host host;
    public Proxy(){

    }

    public Proxy(Host host){
        this.host=host;
    }

    public void rent() {
        host.rent();
        seeHouse();
    }

    //look house
    public void seeHouse(){
        System.out.println("look House");
    }
}

客户:

/**
 * @author panglili
 * @create 2022-07-24-15:02
 */
public class Client  {
    public static void main(String[] args) {
        Host host = new Host();
        Proxy proxy = new Proxy(host);
        proxy .rent();
    }
}

动态代理

  • 和静态代理的角色一样
  • 动态生成,不是我们直接写好了的
  • 动态代理分为两大类:基于接口的动态代理和基于类的动态代理
  • 基于接口——jdbc
  • 基于类——cglib
  • 基于字节码

11.AOP切面编程

使用aop植入,需要导入一个依赖包


    org.aspectj
    aspectjweaver
    1.9.7

  • 横切关注点
  • 切面
  • 通知
  • 目标
  • 代理
  • 切入点
  • 连接点

在执行的方法前动态的添加一个日志输出

方法一使用spring类实现

(1)接口

package service;

/**
 * @author panglili
 * @create 2022-07-24-16:09
 */
public interface Service {
    public void add();
    public void delete();
    public void update();
    public void select();
}

(2)要代理的实现类

package service;

/**
 * @author panglili
 * @create 2022-07-24-16:09
 */
public class ServiceImpl implements Service {
    public void add() {
        System.out.println("add");
    }

    public void delete() {
        System.out.println("delete");
    }

    public void update() {
        System.out.println("update");
    }

    public void select() {
        System.out.println("select");
    }
}

(3)代理商

package log;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

/**
 * @author panglili
 * @create 2022-07-24-16:11
 */
public class Log implements MethodBeforeAdvice {
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("excutor"+method.getName()+target);
    }
}

(4)客户调用

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.Service;

/**
 * @author panglili
 * @create 2022-07-24-16:28
 */
public class MyTest  {
    public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        //注意,代理的是接口类型
        Service ser = (Service) context.getBean("userSer");
        ser.add();

    }
}

方法二 使用自定义类实现

(1)自定义一个类,是被横切进去的内容

package dir;

/**
 * @author panglili
 * @create 2022-07-24-17:00
 */
public class PointMethod {
    public void after(){
        System.out.println("执行方法之后切入......");
    }
    public void before(){
        System.out.println("执行方法之前切入......");
    }
}

(2)在配置文件中使用aop切入


(3)测试

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.Service;

/**
 * @author panglili
 * @create 2022-07-24-16:28
 */
public class MyTest  {
    public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        //注意,代理的是接口类型
        Service ser = (Service) context.getBean("userSer");
        ser.add();

    }
}

[spring]spring静态代理和aop

方式三 使用注解实现aop

(1)在要被切入的地方使用@Aspect和@After等注解标识切面和切点等

package dir;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

/**
 * @author panglili
 * @create 2022-07-24-17:00
 */
@Aspect
public class PointMethod {
    @After("execution(* service.ServiceImpl.*(..))")
    public void after(){
        System.out.println("执行方法之后切入......");
    }
    @Before("execution(* service.ServiceImpl.*(..))")
    public void before(){
        System.out.println("执行方法之前切入......");
    }
}

(2)将此类配置到spring中,别忘了开启注解支持


(3)测试

同上面一样的测试,不再赘述

Original: https://www.cnblogs.com/lumanmanqixiuyuanxi/p/16522019.html
Author: 路漫漫qixiuyuanxi
Title: [spring]spring静态代理和aop

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574465/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringSecurity+Token实现权限校验

    1.Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spr…

    Java 2023年6月9日
    050
  • SpringBoot集成Thymeleaf发送Html邮件报错

    由于业务需求需要使用Thymeleaf作为模板发送Html邮件,开发调试过程中发生以下错误 开始以为是Classpath下不存在这个文件或者解析时候传入参数不对等等原因,排查了半天…

    Java 2023年6月13日
    071
  • PTA第4、5次大作业及期中考试总结

    期中考试题目总结 (1)总结:期中考试主要考察的是点线面类的设计,之前没有接触过类,或者说对类没有什么很清晰的概念和认知。现在才发现”类”是一个非常强大的工…

    Java 2023年6月5日
    072
  • Win10文件、文件夹被占用解决方法

    有时删除文件/弹出移动硬盘的时候会出现文件或文件夹或磁盘被占用的情况,从而无法删除文件/文件夹或安全弹出移动硬盘。这时可以在资源管理器中搜索该文件、文件夹,来找到对应的程序。使用了…

    Java 2023年6月9日
    066
  • Halo 开源项目学习(四):发布文章与页面

    基本介绍 博客最基本的功能就是让作者能够自由发布自己的文章,分享自己观点,记录学习的过程。Halo 为用户提供了发布文章和展示自定义页面的功能,下面我们分析一下这些功能的实现过程。…

    Java 2023年6月9日
    051
  • LeetCode.1137-第N个泰波那契数(N-th Tribonacci Number)

    这是小川的第 409次更新,第 441篇原创 看题和准备 今天介绍的是 LeetCode算法题中 Easy级别的第 260题(顺位题号是 1137)。Tribonacci(泰波那契…

    Java 2023年6月5日
    080
  • mybatis

    基于JDBC的。 public class JDBCDemo { public static void main(String[] args) throws SQLExceptio…

    Java 2023年5月30日
    069
  • 远程注册表读取,与多线程池的应用.

    界面如下: 一般用在域环境下,读取客户机注册的配制信息. 主要代码如下: private void button1_Click(object sender, System.Even…

    Java 2023年5月30日
    061
  • 用户名密码年龄的校验

    用户名: 密码: 确认密码: 年龄: //校验用户名 function usernamecheck(){ //获取dom var username = document.getEl…

    Java 2023年6月7日
    062
  • springboot 整合druid–Java 注解+代码配置 Bean

    1.pom.xml引入 2.druid配置类: 3.构建DataSource对象 4.配置监控拦截器 5.配置Druid监控视图 6.去除druid监控页面广告 7.启动类加@Se…

    Java 2023年6月6日
    087
  • Linux系统(根目录下)目录介绍

    Linux系统(根目录下)目录介绍根目录(/)包含了几乎所的文件目录。相当于中央系统。进入的最简单方法是:cd /。★/boot 引导程序,内核等存放的目录这个目录,包括了在引导过…

    Java 2023年6月7日
    073
  • Qt使用OpenGL进行多线程离屏渲染

    基于 Qt Widgets的 Qt程序,控件的刷新默认状况下都是在UI线程中依次进行的,换言之,各个控件的 QWidget::paintEvent方法会在UI线程中串行地被调用。若…

    Java 2023年5月30日
    085
  • Kafka为什么性能这么快?4大核心原因详解

    Kafka的性能快这是大厂Java面试经常问的一个话题,下面我就重点讲解Kafka为什么性能这么快的4大核心原因@mikechen 1、页缓存技术 Kafka 是基于操作系统 的页…

    Java 2023年6月15日
    076
  • Ubuntu16安装Nvidia驱动(GTX1060显卡)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kuberne…

    Java 2023年6月8日
    069
  • 太方便了,钉钉上就可完成代码发布审批啦!

    如今,不少企业的发布流程要求代码发布到生产环境前需要经过审批。这种发布审批流程,对企业的的CI/CD工具提出了新要求:CI/CD步骤里需要支持人工卡点审批,并在人工卡点审批通过后能…

    Java 2023年6月8日
    070
  • java_day06

    Java流程控制 循环结构 增强for循环 Java5引入了一种主要用于数组或集合的增强型for循环 增强型for循环格式如下: for(声明语句 : 表达式) 声明语句:声明局部…

    Java 2023年6月5日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球