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注解标注的静态属性指明要引入的接口
时间: 2024-12-20 05:20:32

006Spring面向切面的相关文章

Spring AOP(面向切面示例)

什么是AOP?基本概念切面(aspect):横切关注点被模块化的特殊对象.通知(advice):切面必须要完成的工作.切面中的每个方向称之为通知.通知是在切面对象中的.目标(target):被通知的对象.代理(proxy):向目标对象应用通知后创建的对象. 连接点(joinpoint):目标对象的程序执行的某个特定位置.如某个方法调用前,调用后的位置.包括两个信息:1.目标程序的哪个方法?2.方法执行 前还是执行后?切点(pointcut):每个类会有多个连接点,AOP通过切点定位到特定的边接点

Spring面向切面编程

  1.面向切面编程(AOP)的概念:把项目中需要在多处用到的功能,比如日志.安全和事物等集中到一个类中处理,而不用在每个需要用到该功能的地方显式调用.   2.术语解释:        横切关注点:分布应用于多处的功能        切面:横切关注点可以被模块化为一个类,这个类被称为一个切面        通知(advice):切面要完成的工作.Spring的通知有5种类型:before.after.after-returning.after-throwing和around这五种类型.    

面向切面编程(转)

面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承.多态和封装.而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配.实际上也就是说,让不同的类设计不同的方法.这样代码就分散到一个个的类中去了.这样做的好处是降低了代码的复杂程度,使类可重用.       但是人们也发现,在分散代码的同时,也增加了代码的重复性.什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志.按面向对象的设计方法,我们就必须在两个

Spring AOP 面向切面编程

AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 在Spring中提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例

Spring4面向切面AOP

AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的横向多模块统一控制的一种技术.AOP是OOP的补充,是spring框架中的一个重要内容.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率.AOP可以分为静态织入与动态织入,静态织入即在编译前将需织入内容写入目标模块中,这样成本非常高.动态织入则不需要改变目标模块.Spring框架实现了AOP,使用注解

[Spring实战系列](16)面向切面编程(AOP)概述

1. 简介 在软件中,有些行为对于大多数应用都是通用的.日志,安全和事务管理的确很重要,但他们是都是应用对象主动参与的行为呢?如果让应用对象只关注自己所针对的业务领域问题,而其他方面的问题由其他应用对象来处理,这样会不会更好? 在软件开发中,分布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑中).将这些横切关注点与业务逻辑相分离是面向切面编程索要解决的. 上图展示了一个被划分为模块的典型应用.每个模块的核心功能都是为特

Spring框架——AOP(面向切面编程)详解

 1 AOP概述 ●AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统 OOP(Object-Oriented Programming,面向对象编程)的补充. ●AOP编程操作的主要对象是切面(aspect),而切面模块化横切关注点. ●在应用AOP编程时,仍然需要定义公共功能,但可以明确的定义这个功能应用在哪里,以什么方式应用,并且不必修改受影响的类.这样一来横切关注点就被模块化到特殊的类里--这样的类我们通常称之为"切面".

面向切面编程

面向切面编程 .Net的面向切面编程 .Net的服务端应用AOP很常见,在Asp.net MVC与Asp.net WebApi等新框架里到处都有AOP的影子,我们可以把一个服务方法"切"为很多面,日志面.验证面.请求方式处理.接口业务实现等多个面,有一些面可以使用过滤器特性(FilterAttribute)进行编写,然后很方便和打上特性即可,对于一般的工程师,只需要专注实现接口业务实现. 在流行SOAP的年代,很少需要一个强悍的Client,而今天restful时代,.net也出了一个

Spring面向切面编程(AOP)

1 spring容器中bean特性 Spring容器的javabean对象默认是单例的. 通过在xml文件中,配置可以使用某些对象为多列. Spring容器中的javabean对象默认是立即加载(立即实例化:spring加载完成,立即创建对象) scope:属性 singleton:默认值为单例,默认也是立即加载,在加载完成spring容器的时候,bean对象已经创建完成 prototype:多例的,默认懒加载,spring容器加载完成的时候,不会创建bean的对象,只有从容器获得bean对象的