zoukankan      html  css  js  c++  java
  • 006Spring面向切面

    01、基本术语---->POM中配置spring-aspects

    1、通知(Advice)---->要做的事
        前置通知(@Before)
        后置通知(@After)
        返回通知(@AfterReturning)
        异常通知(@AfterThrowing)
        环绕通知(@Around)
    2、连接点(Join point)---->可能会应用通知的时机
    
    3、切点(Pointcut)---->一个或多个连接点
    
    4、切面(Aspect)---->通知+切点
    
    5、引入(Introduction)---->向现有类添加新方法或属性
    
    6、织入(Weaving)
        编译期
        类加载期
        运行期---->Spring AOP

    02、基本特性

        只支持方法调用相关的连接点
        基于动态代理(运行期织入)

    03、Spring AOP所支持的AspectJ切点指示器

    实际执行匹配
        execution()
    限制
        args()        指定参数
        @args()        指定参数注解
        this()        
        target
        @target()
        within()    限制连接点类
        @within()
        @annotation
    指示器连接符
        &&    ||    !

    04、Spring AOP支持的bean()指示器

      使用bean ID或名称作为参数来限制,只匹配特定的bean05、不处理参数的切面

    开启自动代理
    @Configuration
    @EnableAspectJAutoProxy---->启动自动代理
    @ComponentScan
    public class ConcertConfig{
        @Bean
        public Audience audience(){---->切面
            return new Audience();
        }
    }
    某连接点
    package concert;
    public interface Performance{
        public void perform();
    }
    @Aspect
    public class Audience {
        @Pointcut("execution(*concert.Performance.perform(..)) && within(concert.*)")---->定义命名的切点
        public void performance(){}---->切点名称,仅供附着
        
        @Before("performance()")
        public void do1(){}
        
        @After("performance()")
        public void do2(){}
        
        @Around("performance()")
        public void do3(ProceedingJoinPoint jp){---->若函数本来有参数,jp参数要放在最左边
            System.out.println("Before");
            jp.proceed();---->可以不掉用,也可多次调用;若有返回值,在最后也该返回,以免影响原线程
            System.out.println("After")
        }
        
        @AfterReturning("performance()")
        public void do4(){}
        
        @AfterThrowing("performance()")
        public void do5(){}
        
        
    }

    06、带参数切面

    开启自动代理
    ...
    某连接点
    public class BlankDisc{
        public void playTrack(int trackNumber){
            ...
        }
    }
    切面
    @Aspect
    public class TrackCounter {
        private Map<Integer, Integer> trackCounts = new HashMap<Integer, Integer>();
        
        @Pointcut("execution(* soundsystem.CompactDisc.playTrack(int)) && args(trackNumber)")//使用args()在切点中声明参数,此参数将传递到通知中
        public void trackPlayed(int trackNumber) {}
        
        @Before("trackPlayed(trackNumber)")
        public void countTrack(int trackNumber){
            int currentCount = getPlayCount(trackNumber);
            trackCounts.put(trackNumber, currentCount + 1);
        }
        
        public int getPlayCount(int trackNumber){
            return trackCounts.containsKey(trackNumber)? trackCounts.get(trackNumber) : 0;
        }
    }

    07、通过切面为Performance接口引入新功能

    public interface Encoreable {
        void performEncore();
    }
    
    @Aspect
    public class EncoreableIntroducer {
        @DeclareParents(value = "concert.Performance+", defaultImpl = DefaultEncoreable.class)
        public static Encoreable encoreable;---->引入的接口
    }
    value---->指定哪种类型的bean引入此接口
    defaultImpl---->指定为引入功能提供实现的类
    @DeclareParents注解标注的静态属性指明要引入的接口
  • 相关阅读:
    IDEA激活及使用丶
    内网渗透-windows认证
    应急响应必备技能
    云计算期末考试---
    常见GetShell
    SQL Sever提权
    Socks协议以及代理转发工具分析
    最近两场HVV总结
    ATK&CK红队评估实战靶场 (一)的搭建和模拟攻击过程全过程
    应急响应之勒索病毒
  • 原文地址:https://www.cnblogs.com/geniushuangxiao/p/7301070.html
Copyright © 2011-2022 走看看