aspect学习(1)before&after&around

使用AspectJ的Aspect、Pointcut、Around实现记录日志功能(拦截自定义注解的方式) 记录:396 场景:实现自定义注解WriteLog,作用在类的方法上,每次执行方法就记录一条日志。使用AspectJ的注解@Aspect、@Pointcut、@Around、@Before、@AfterReturning、@AfterThrowing、@After拦截自定义注解WriteLog,从而完成记录日志功能。 阅读详情

            面向Aspect的编程,其实就是AOP,什么是AOP,用过学习过spring的同学都晓得。本人不喜欢也不擅长写概念,更喜欢结合例子慢慢讲解。

       下面的例子是在eclipse下写的,需要先准备好环境。


准备环境

         eclipse安装AJDT插件,安装插件的方法有多种,本人更喜欢在线安装。http://www.eclipse.org/ajdt/downloads/,找到和ecilpse版本相合的ajdt版本,复制update site URL连接,然后在eclipse中按照安装插件的方法安装即可。

    (不会安装插件的同学,可百度,别人有贴图详细说明)。

    下载aspect架包,http://www.eclipse.org/aspectj/downloads.php

需求一

     有一Point类,有三个私有属性int x,int y , int z ,当调用setX,setY,setZ进行属性值修改前,打印通知日志。

    注意:eclipse新建项目,必须选择aspectJ project


package com.fei.bean;

public class Point {

	private int x;
	private int y;
	private int z;
	
	public Point(int x, int y, int z) {
		super();
		this.x = x;
		this.y = y;
		this.z = z;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public int getZ() {
		return z;
	}

	public void setZ(int z) {
		this.z = z;
	}
	
}

     如果是新手,他们的做法就是在3个set方法里面加入日志代码,如果日志代码很复杂呢?如果我还有Pont1、Point2类,也需要对他们的set做相同处理呢?难道你在所有需要的地方都复制粘贴那部分日志代码吗?如果某天日志代码有修改呢,这样一来就需要修改N多个地方的代码了。。。。哪怕你是新手,你都觉得恶心了。

     废话不多说了,下面先直接用aspect来做,实现需求,然后再结合代码讲解。

package com.fei.aspect;

import com.fei.bean.*;
import org.aspectj.lang.Signature;

public aspect LogAspect {

	public pointcut printLog() : call(void Point.set*(int));
	
	before() : printLog(){
		 Signature signature = thisJoinPoint.getSignature();
		 System.out.println("在调用"+signature.getName());
	}
}



       是不是觉得很神奇,我们用反编译工具来看看编译后的class文件。

       Point.class反编译后得到的源码和原源码可以说是一样的,就不贴了.

      MainTest.class反编译后的源码

package com.fei;

import com.fei.aspect.LogAspect;
import com.fei.bean.Point;
import org.aspectj.lang.JoinPoint.StaticPart;
import org.aspectj.runtime.reflect.Factory;

public class MainTest
{
  private static final JoinPoint.StaticPart ajc$tjp_0;
  private static final JoinPoint.StaticPart ajc$tjp_1;

  static{
	    ajc$preClinit(); } 
	  	private static void ajc$preClinit() {
		  Factory localFactory = new Factory("MainTest.java", MainTest.class); 
		  ajc$tjp_0 = localFactory.makeSJP("method-call", localFactory.makeMethodSig("1", "setX", "com.fei.bean.Point", "int", "x", "", "void"), 9);
		  ajc$tjp_1 = localFactory.makeSJP("method-call", localFactory.makeMethodSig("1", "setY", "com.fei.bean.Point", "int", "y", "", "void"), 10);
	  }
	  	
  public static void main(String[] args) {
    Point p = new Point(10, 20, 30);
    LogAspect.aspectOf().ajc$before$com_fei_aspect_LogAspect$1$738e898(ajc$tjp_0); 
    p.setX(15);
    
    LogAspect.aspectOf().ajc$before$com_fei_aspect_LogAspect$1$738e898(ajc$tjp_1); 
    p.setY(25);
  }


}

   我们发现在执行p.setX(15),p.setY(25)之前,都会先调用LogAspect.aspectOf().ajc$before$com_fei_aspect_LogAspect$1$738e898这个方法,那这个方法是什么东东呢,我们在来看看LogAspect.aj编译后产生的class文件

package com.fei.aspect;

import java.io.PrintStream;
import org.aspectj.lang.JoinPoint.StaticPart;
import org.aspectj.lang.NoAspectBoundException;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class LogAspect{
  static{
    try{
      ajc$postClinit(); 
    } catch (Throwable localThrowable) {
    	ajc$initFailureCause = localThrowable;
    } 
  }

  @Before(value="printLog()", argNames="")
  public void ajc$before$com_fei_aspect_LogAspect$1$738e898(JoinPoint.StaticPart thisJoinPointStaticPart) {
    Signature signature = thisJoinPointStaticPart.getSignature();
    System.out.println("在调用" + signature.getName());
  }

  public static LogAspect aspectOf() {
    if (ajc$perSingletonInstance == null)
    	throw new NoAspectBoundException("com_fei_aspect_LogAspect", ajc$initFailureCause); return ajc$perSingletonInstance; } 
    public static boolean hasAspect() { 
	  return ajc$perSingletonInstance != null;
  }
}

   对于里面的一些不熟悉的方法,我们不需要继续深究,我们只要知道它的处理流程即可。


  我们已经知道执行流程了,那下面我们来学习下aspect的一些语法。语法的使用有很多,这里没法一一详解,需要支持复制操作的,可自行查看官方文档。


pointcut

     pointcut,从字面的意思说的是切面的意思。也就是横切的时候,会有哪些执行点会被识别。只有先识别了,才能执行相应的Advice。

public pointcut printLog() : call(void Point.set*(int));
    这行代码很容易理解,就是凡是符合call里面说写的东东,你都给我执行pritntLog()这个方法,至于是什么时候执行呢?Point.set*之前还是之后呢?那就看printLog()这方法使用befor()修饰呢还是after()修饰呢?我们上面的代码用的是before,所以在main方面里面执行p.setX(15) 之前会先执行printLog().

call

   call里面是可以使用通配符的,组合一些复杂的东东。

     * 表示任何数量的字符,除了(.) 
     .. 表示任何数量的字符包括任何数量的(.) 
     + 描述指定类型的任何子类或者子接口
    同java一样,提供了一元和二元的条件表达操作符。
    一元操作符:!
    二元操作符:||和&&
    优先权同java

  

   比如上面的call(void Point.set*(int))就是说Point里面方法是以set开头,并且参数类型是int,返回void类型的方法。

   call(* Point.*X(..))就是说Point里面方法名以X结尾,任意参数类型,返回类型也任意的方法都符合,也就是说void setX(int x),int getX()都符合

   call(void Point.set*(int)) 会捕捉到setX,setY,setZ,那如果我要排除setY呢?那可以这样写call(void Point.set*(int)) && !call(void Point.setY(int));

execution

    上面的源码是pointcut  和call连用,call就是方法调用,所以我们用反编译工具看class文件时,发现都是在调用方法(如上面MainTest.main中的p.setX(15),p.setY(25))前会插入一些代码

    pointcut除了和call连用,还可以和execution连用,execution就是方法执行,我们把上面的LogAspect中的 call改为execution看看,有什么不同。

package com.fei.aspect;

import com.fei.bean.*;
import org.aspectj.lang.Signature;

public aspect LogAspect {

	public pointcut printLog() : execution( void Point.set*(int)) ;
	
	before() : printLog(){
		 Signature signature = thisJoinPoint.getSignature();
		 System.out.println("在调用"+signature.getName());
	}
	
	
}

MainTest.class反编译后的源码

package com.fei;

import com.fei.bean.Point;

public class MainTest
{
  public static void main(String[] args)
  {
    Point p = new Point(10, 20, 30);
    p.setX(15);
    p.setY(25);
  }
}

    发现没插入任何额外代码了。那额外的那部分代码哪去了呢?

  Point.class反编译后的源码

package com.fei.bean;

import com.fei.aspect.LogAspect;
import org.aspectj.lang.JoinPoint.StaticPart;
import org.aspectj.runtime.reflect.Factory;

public class Point
{
  private int x;
  private int y;
  private int z;
  private static final JoinPoint.StaticPart ajc$tjp_0;
  private static final JoinPoint.StaticPart ajc$tjp_1;
  private static final JoinPoint.StaticPart ajc$tjp_2;

  public Point(int x, int y, int z)
  {
    this.x = x;
    this.y = y;
    this.z = z;
  }

  public int getX() {
    return this.x;
  }

  public void setX(int x) {
    LogAspect.aspectOf().ajc$before$com_fei_aspect_LogAspect$1$738e898(ajc$tjp_0); this.x = x;
  }

  public int getY() {
    return this.y;
  }

  public void setY(int y) {
    LogAspect.aspectOf().ajc$before$com_fei_aspect_LogAspect$1$738e898(ajc$tjp_1); this.y = y;
  }

  public int getZ() {
    return this.z;
  }

  public void setZ(int z) {
    LogAspect.aspectOf().ajc$before$com_fei_aspect_LogAspect$1$738e898(ajc$tjp_2); this.z = z;
  }

  static
  {
    ajc$preClinit(); } 
  private static void ajc$preClinit() { Factory localFactory = new Factory("Point.java", Point.class); ajc$tjp_0 = localFactory.makeSJP("method-execution", localFactory.makeMethodSig("1", "setX", "com.fei.bean.Point", "int", "x", "", "void"), 20); ajc$tjp_1 = localFactory.makeSJP("method-execution", localFactory.makeMethodSig("1", "setY", "com.fei.bean.Point", "int", "y", "", "void"), 28); ajc$tjp_2 = localFactory.makeSJP("method-execution", localFactory.makeMethodSig("1", "setZ", "com.fei.bean.Point", "int", "z", "", "void"), 36);
  }
}

   呵呵,已经跑到Point里面来了。



通过比较,对call和execution的区别就一目了然了。


需求二

     在需求一的基础上,增加,当调用完setX(int),setY(int),setZ(int)方法后,打印当前时间.


   既然有before那当然就有after啊,简单。

package com.fei.aspect;

import java.util.Calendar;
import java.util.Date;

import com.fei.bean.*;

import org.aspectj.lang.Signature;

public aspect LogAspect {

	public pointcut printLog() : call( void Point.set*(int)) ;
	public pointcut timeLog() : call(void Point.set*(..));
	
	before() : printLog(){
		 Signature signature = thisJoinPoint.getSignature();
		 System.out.println("在调用"+signature.getName());
	}
	
	after() : timeLog(){
		Signature signature = thisJoinPoint.getSignature();
		 System.out.println(signature.getName()+"调用完后当前时间:"+new Date().toLocaleString());
	}
	
}
或者

package com.fei.aspect;

import java.util.Calendar;
import java.util.Date;

import com.fei.bean.*;

import org.aspectj.lang.Signature;

public aspect LogAspect {

	public pointcut printLog() : call( void Point.set*(int)) ;
	
	before() : printLog(){
		 Signature signature = thisJoinPoint.getSignature();
		 System.out.println("在调用"+signature.getName());
	}
	
	after() : printLog(){
		Signature signature = thisJoinPoint.getSignature();
		 System.out.println(signature.getName()+"调用完后当前时间:"+new Date().toLocaleString());
	}
	
}




     这样做,的确满足了需求,但是却需要多写个after.那能否不需这么麻烦吗?可以,这时around就派上用场了,around字面意思包围。

package com.fei.aspect;

import java.util.Calendar;
import java.util.Date;

import com.fei.bean.*;

import org.aspectj.lang.Signature;

public aspect LogAspect {

	public pointcut printLog() : call( void Point.set*(int)) ;
	
	void around() : printLog(){
		 Signature signature = thisJoinPoint.getSignature();
		 System.out.println("在调用"+signature.getName());
		 proceed();
		 System.out.println("当前时间:"+new Date().toLocaleString());
	}
	
	
}









Aspect Ratio Fitter 和 Image UGUI 里面 Aspect Ratio Fitter 的作用是保持一个 UI 控件的宽高比。然而 Image 自身就有一个 Preserve Aspect 属性用于保持自己的宽高比。因此起初我就想 Image 是不是就用不上 Aspect Ratio Fitter 了,或者说 Image 自身的 Perserve Aspect 的属性是不是多余的。后来发现并不完全是。前段时间遇到一种情况必须要使... 阅读详情

相关推荐

gmsv源代码c语言,石器时代ABLua的原理、简介、过程、运用、收发

操作原理(一)服务端:服务器源文件客户端:客户所操作的程序(既是游戏客户端)接口:既是某项功能(例如:鼠标点击,文字发送,战斗,观战,人物动作等)返回的值ABlua:在源代码中添加的整套引擎作为回调接口--lua所实现的功能是基于服务端源码添加的接口由该接口与客户端发送封包实现功能源码里是否有ABlua回调接口?例如:源码里的gmsv/battle.c文件(既是战斗回调文件)以下为简单描述C给予l...

weixin_35223575的博客 2411

Spring @Aspect、@Before、@After 注解实现 AOP 切面功能

Spring AOP 注解概述 1、Spring 的 AOP 功能除了在配置文件中配置一大堆的配置,比如切入点、表达式、通知等等以外,使用注解的方式更为方便快捷,特别是 Spring boot 出现以后,基本不再使用原先的 beans.xml 等配置文件了,而都推荐注解编程。 @Aspect 切面声明,标注在类、接口(包括注解类型)或枚举上。 @Pointcut 切入点声明,即切入到哪些目标类的目标方法。 value 属性指定切入点表达式,默认为 "",用于被通知注解引用

蚩尤后裔-汪茂雄 7万+

紫光同创国产FPGA学习之Fabric Debugger

文章从紫光同创参考书拷贝过来的。因为我用的时候,看了一下就会用了(纯粹只是会用了,默认和xilinx的一样),没有看教程。先更新点文本,后面在写程序。 一、      软件简介 Fabric Debugger是一款界面化的FPGA芯片调试工具,能够针对公司目前以及未来的FPGA芯片进行在线调试。本软件直接与JtagHub、DebugCore交互,能够实时的配置目标FPGA、设置触发条件并且观测结...

my_share的专栏 6397

AOP切面使用

文章目录AOP切面使用首先定义一个@Aspect类然后通过execution写切点方法几个注解execution表达式的一些规则 AOP切面使用 首先定义一个@Aspect类 然后通过execution写切点方法 几个注解 @Around:在目标方法的前面和后面都执行我们的切点方法 @Before:只在目标方法的前面执行我们的切点方法 @After:只在目标方法的后面执行我们的切点方法 这里需要注意一下使用@Around的环绕通知和前置后置通知的一个最大的区别,环绕通知里面需要执行一个procced

xzy的博客 1634

【有啥问啥】智能座舱CPD技术:毫米波雷达如何守护儿童安全?

本文深入探讨了智能座舱中CPD(Child Presence Detection)技术如何通过毫米波雷达保障儿童安全。毫米波雷达凭借其穿透性检测、微动感知等优势,成为儿童遗留车内的有效解决方案。文章详细解析了技术原理、系统集成方案及安装指南,为智能座舱安全技术提供了实用参考。

weixin_29193259的博客 358

实战指南:从零搭建ROS2 + Cartographer 2D激光SLAM系统

本文详细介绍了如何从零开始搭建ROS2与Cartographer结合的2D激光SLAM系统,涵盖环境准备、激光雷达驱动配置、Cartographer安装与参数调优等关键步骤。通过实战案例和常见问题解决方案,帮助开发者快速掌握激光雷达建图技术,提升机器人自主导航能力。

weixin_29062255的博客 404

使用Aspect的@Around注解实现定时任务执行

package com.jumi.microservice.redissetnx; import com.jumi.microservice.common.exception.BaseException; import com.jumi.microservice.config.ScheduledSwitchConfig; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; impor.

netuser1937的博客 1573

搭建Dzzoffice 教程

通过以上步骤,您已经成功配置了WEB环境,安装了DzzOffice,并完成了系统设置和应用安装。1.安装包的设置默认是系统盘之外的第二个盘,没有其他盘符的时候则安装在C盘,当主机盘符只有C盘可用的时候,安装时不要使用U盘,否则可能误装到U盘当中。4.如果之前已经安装,再次安装时请确保上次安装已经卸载或者所有文件可读,否则请备份文件,卸载之后再安装。在其他安装环境中,我没有相关的使用经验。3. 保证安装路径是纯净的,安装路径下不能有已安装的V8版本,若重新安装,请选择其它路径。

小胡的博客 4954

(Spring笔记)AspectJ最终通知——@After切面开发+切入点表达式取别名

AspectJ最终通知——@After切面开发+切入点表达式取别名

张松的博客 1616

Notion卡顿救星:3分钟搞定DNS优化,手机电脑全平台加速指南

本文针对Notion访问慢和卡顿问题,提供了全平台DNS优化与Hosts文件修改的详细指南。通过更换优质DNS服务器或建立静态IP映射,可有效解决因网络延迟和域名解析导致的加载缓慢,实现手机与电脑端的快速加速,提升Notion使用流畅度。

v6b7n8m9q0的博客 1306

2025年华为杯中国研究生数学建模竞赛A题 通用神经网络处理器下的核内调度问题 思路+代码

针对通用神经网络处理器下的核内调度问题,我们提出了一套基于分层优化框架的系统性解决方案。该方案首先通过缓存敏感的启发式拓扑排序算法生成最小峰值缓存占用的调度序列,在满足计算图依赖关系的前提下优先选择能够释放或减少缓存占用的节点;随后采用最佳适应算法进行精细化的缓存分配,结合LRU换出策略动态管理多级缓存空间,最小化额外数据搬运量;最后引入多目标遗传算法进行联合优化,在严格控制数据搬运量不显著增加的前提下,通过关键路径分析、流水线并行和数据预取等技术进一步优化总执行时间。

YOLO 786

情感分析学习笔记(1)——aspect-term,aspect-category,aspect-opinion,aspect-opinion pair的理解

感觉这一方面网上资源好少……整理一份出来作为学习笔记,方便以后忘记了还有地方可以查看…… 感谢师兄用他早饭中的鸡蛋给我讲懂了这个问题,摸摸大! 昨天看综述《情感分析综述》就正好讲到了这个问题,这篇论文里面写的是“甄别句子中针对不同属性所表达的观点倾向,推出其正面、负面还是中性”,这就是上面的这些内容的概括,有兴趣的朋友可以下载下来阅读下,反正就3页,几分钟就看完了对吧。 然后我把师兄说的两句话糅在一起给大家讲解,话如下: 这个显卡很烂,但是鸡蛋好吃! aspect-term: aspect-term.

LiQZ的博客 2485

Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码)

摘要 本文介绍了基于Spring Boot 3.2和Spring AI 1.0.0-M4构建智能客服系统的技术方案。系统采用分层架构设计,集成DeepSeek API提供自然语言处理能力,使用MyBatis和H2数据库实现数据持久化,并通过Thymeleaf+Bootstrap构建前端界面。文章详细阐述了项目的技术栈选择、Maven依赖配置、应用架构设计,以及各模块的功能划分,为开发者提供了完整的智能客服系统实现方案,涵盖从后端服务到前端交互的全流程开发指导。

博客 3847

【Unity】Entities 1.0 学习(一):Aspect

Unity在 2022年下半年(我印象是9月份左右)推出了 Entities 1.0 ,可以在 2022.2.0b8 以上的版本使用。当时我粗略地看了一下,但是没有深入学习。最近空闲时间稍多,就认真来学习一下 Entities 1.0有啥新的东西。 这篇文章算一个起头,以及对Aspect的一些学习总结

魔术师Dix的博客 7016

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

《A Multi-task Learning Model for Chinese-oriented Aspect Polarity Classification and Aspect Term》笔记

A Multi-task Learning Model for Chinese-oriented Aspect Polarity Classification and Aspect Term Extraction 学习笔记 记录自己看论文时的心得,后附有GitHub链接。 创新点 本文提出了一个联合模型用于aspect term extraction(方面项提取) 和 aspect polarity classification (aspect极性分类) 论文中提出的模型面向中文,也适应于英文 该模型还

无深度不学习的博客 4279

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

相机畸变系数$b_1,b_2$与畸变系数aspect ratio和skew的互转

相机畸变系数b1,b2b_1,b_2b1​,b2​与畸变系数aspect ratio和skew是可以互相转换的畸变表达方式。b1b_1b1​,aspect ratio用于表达影像的像元x、y方向尺寸不一致;b2b_2b2​、skew用于表达x轴y轴不垂直引起的畸变。本文将介绍这两种参数表示方式的互相转换方法:首先介绍应用这两种参数表示法的畸变模型,然后介绍如何互相转换。(x′,y′)(x',y')(x′,y′)是经过径向、切向畸变系数改正的像点坐标。(x,y)(x,y)(x,y)是经过xy尺寸、垂直性校正后

simple的博客 1392

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

AOP,写法 ~ aspect

aop,aspect写法

Java博客 709

AOP 与 Aspect 复习

在传统的 OOP(面向对象编程)中,业务逻辑被封装在类和方法中。但有些功能(如日志记录、事务管理、安全检查、性能监控等)会横跨多个模块,无法很好地封装到单一类中,这类功能称为“横切关注点”。代码重复业务逻辑与非业务逻辑耦合难以维护和扩展@ServiceSystem.out.println("正在查询用户: " + id);System.out.println("正在删除用户: " + id);@Aspect@Component// 定义切入点:UserService 中所有方法。

weixin_37926313的博客 797

Aspect宣布用于大量客户外联的首屈一指的企业客服中心解决方案 Aspect Unified IP 7.4 SP1全面上市

马萨诸塞州韦斯特福德--(美国商业资讯)--Aspect今日宣布其综合的全渠道客户参与平台的最新版本Aspect® Unified IP®和Advanced List Management™ 7.4 SP1全面上市,以用于管理跨服务、收费和销售方面的体验。此次升级大幅增强了易用性,提供现代化用户体验,从而更易于客服人员、客服经理和行政管理员使用。7.4 SP1版本还通过添加新功能来帮助客户高效、有效地运营呼出客服中心,并符合国家、地区和地方法规要求,从而巩固Aspect在呼出市场的领导地位。 Asp.

美国商业资讯的博客 424

An Aspect-Based Engine

Based - Aspect Game Engine

qq_41940565的博客 1050

CSS 属性 aspect-ratio

摘要:在响应式网页设计中,保持一致的宽高比,即所谓的长宽比,对于防止布局累积偏移至关重要。在 Chromium 88、Firefox 87 和 Safari Technology Preview 版本中推出了 aspect-ratio 属性,我们有了更直接的方法来实现这一目标。 Aspect ratio 长宽比最常见的表示方式是两个整数和一个冒号,尺寸为:宽:高,或x:y。摄影最常见的长宽比是4:3和3:2,而视频和最近的消费类相机则倾向于16:9的长宽比。 随着响应式设计的出现,保持长宽比对Web开.

MayanDev 2万+

css中aspect,CSS属性之aspect-ratio

根据最新的浏览器chrom88 稳定版发布的信息看到,已经完全支持aspect-ratio了,那我们就来实践一下以及了解它的应用场景。1. 了解下aspect ratioaspect ratio翻译为中文就是宽高比(也称:纵横比)即x:y。我们日常生活中常见的宽高比由4:3和16:9。如图:x:y = 4:3为什么会有这个属性呢?因为,一般情况下只有某些替换的元素具有长宽比,尤其是图像。对于它们,...

weixin_39850365的博客 1833

Unity 组件学习记录:Aspect Ratio Fitter

Unity 组件学习记录:Aspect Ratio Fitter。

Xiao_Chen____的博客 1537

AOP 与 Aspect

AOP(面向切面编程)是一种编程范式,旨在将横切关注点(cross-cutting concerns)从主业务逻辑中分离出来,提高模块化程度。它是一种思想或方法论。Aspect(切面)是 AOP 中的具体实现单元,是对横切关注点的模块化封装。一个切面通常包含通知(Advice)和切点(Pointcut),用于定义“在何处”、“以何种方式”织入额外逻辑。维度AOPAspect性质编程范式 / 设计思想具体代码模块 / 类范围整体架构层面实现细节层面内容。

weixin_37926313的博客 714

带你学习AOP框架之Aspect.Core[1]

带你学习AOP框架之Aspect.Core[1] 2019-01-23 17:19 by 张子浩, ... 阅读, ... 评论, 收藏, 编辑   在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续...

qq_39110534的博客 1104
上一篇: 反射的一点小应用
下一篇: aspect学习(2)target&thisJoinPoint
夢_殤
博客等级 码龄15年 348粉丝 140原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值