Spring入门(AspectJ简单介绍)

原创 2017年10月06日 20:02:52

AspectJ

@AspectJ的风格类似纯java注解的普通java类
Spring可以使用AspectJ来做切入点解析
AOP的运行时仍旧是纯的Spring AOP,对AspectJ的编译器或者织入无依赖性

Spring中配置@AspectJ

对@AspectJ支持可以使用XML或Java风格的配置
Java注解风格:

@Configuration
@EnableAspectJAutoProxy
public class AppConfig{}

XML格式:

<aop:aspectj-autoproxy/>

两种方式都可以,但是有个前提就是确保AspectJ的aspectjweaer.jar库包含在应用程序(版本1.6.8或更高版本)的classpath中。

然后我们在我们的例子中使用xml文件配置方式

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd">

        <context:component-scan base-package="com.imooc.aop.aspectj"/>
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

 </beans>

xml文件中主要就是这一句<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

aspect具体使用

1.@AspectJ切面使用@Aspect注解配置,拥有@Aspect的任何bean将被Spring自动识别并应用。
2.用@Aspect注解的类可以有方法和字段,他们也可能包括切入点(pointcut),通知(Advice)和引入(introduction)声明,也就是说用@Aspect注解这个类可以拥有AOP的一切特点和使用方式,和之前讲到通过xml的配置方式实现是非常接近的。
3.@Aspect注解是不能通过类路径自动检验发现的,所以需要配合使用@Component注解或者在xml配置bean。
什么是类路径自动检验?前边的代码有这一句<context:component-scan base-package="com.imooc.aop.aspectj"/>。Spring的bean容器会自动扫描所有在com.imooc.aop.aspectj包下的类。
由于@Aspect注解是不能通过类路径自动检验发现,所以component-scan不能检测某个类上或者某个bean上是否有@Aspect这个注解,所以可以配合使用@Component注解或者在把@Aspect注解的类配置在xml中,通过这种方式把它配置成一个Spring的bean。
看一下这两种方式(只写了配置在xml文件中的方式):

package org.xyz;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class NotVeryUsfulAspect{}
<bean id="myAspect" class="org.xyz.NotVeryUsefulAspect"?
    <!-- configure properties of aspect here as normal -->
</bean>

把这个类配置到xml文件当中,当然也可以在第一段代码中上边加上@Component注解把它标注成Spring的一个Bean。

4.一个类中的@Aspect注解标识它为一个切面,并且将自己从自动代理中排除。这容易理解,如果一个切面类和业务类在同一个包下,排除自己可以避免死循环。如果@AspectJ去代理了自己,然后又去找它。

pointcut

一个切入点通过一个普通的方法定义来提供,并且切入点表达式使用@Pointcut注解,方法返回类型必须为void
定义一个名为‘anyOldTransfer’,这个切入点将匹配任何名为“transfer”的方法的执行

@Pointcut("execution(*transfer(..))")  //the pointcut expression
private void anyOldTransfer(){}  //the pointcut signature

@Pointcut注解的方法的返回值必须为void类型

切入点支持哪些定义方式或者哪些点可以定义
这里写图片描述

然后我们定义一下自己的切入点

@Component
@Aspect
public class MoocAspect {

    @Pointcut("execution(* com.imooc.aop.aspectj.biz.*Biz.*(..))")
    public void pointcut() {}

    @Pointcut("within(com.imooc.aop.aspectj.biz.*)")
    public void bizPointcut() {}    
}

对于这个切入点

    @Pointcut("execution(* com.imooc.aop.aspectj.biz.*Biz.*(..))")
    public void pointcut() {}

也就是说在执行com.imooc.aop.aspectj.biz包下任何以Biz结尾的类的任何类型方法的时候,都会匹配当前切入点。
对于这个切入点

    @Pointcut("within(com.imooc.aop.aspectj.biz.*)")
    public void bizPointcut() {}

是说当前这个com.imooc.aop.aspectj.biz包下的任何类都会匹配到这个切入点。

组合pointcut

切入点表达式可以通过&&、||和!进行组合,也可以通过名字引用切入点表达式
通过组合,可以建立更加复杂的切入点表达式

定义良好的pointcuts

AspectJ是编译期AOP
检查代码并匹配连接点与切入点的代价是昂贵的
一个好的切入点应该包括以下几点
-选择特定类型的连接点,如execution、get、set、call、handler
-确定连接点范围,如:within、withincode
-匹配上下文信息,如:this、target、@annotation

版权声明:本文为博主原创文章,未经博主允许不得转载。

spring入门(10)---使用Aspectj进行AOP开发

添加类库:aspectjrt.jar和aspectjweaver.jar 添加aop schema. 定义xml元素: 编写java类,并用@Aspect注解成通知      AspectJ ...

Spring @AspectJ 实现AOP 入门例子

Spring @AspectJ 实现AOP 入门例子

Spring @AspectJ 实现AOP 入门例子(转)

AOP的作用这里就不再作说明了,下面开始讲解一个很简单的入门级例子。  引用一个猴子偷桃,守护者守护果园抓住猴子的小情节。  1、猴子偷桃类(普通类):  package...
  • DJJT10
  • DJJT10
  • 2017年02月09日 14:03
  • 145

Spring入门笔记(二)AOP及AspectJ

看完上一篇博客,大致入门了Spring,对于DI(依赖注入)、IOC(控制反转)有了一定的认识。这篇博客,我们还要继续学习Spring。现在,由Spring的另一个核心 — — AOP开始学习。...

spring整合aspectj实现aop的;一个简单案例(annotation)

1.*************代理类******************* package cn.xxxx.aopAnnotation; import org.aspectj.lang.JoinP...

spring整合aspectj实现aop的一个简单案例(xml)

1.************代理类*********************** import org.aspectj.lang.JoinPoint; import org.aspectj.lang....

spring aop @aspectj的简单说明

1.AOP术语图片 2.spring切面应用的无五种通知 前置通知@Before :在目标方法调用之前执行。 后置通知@After:在目标方法调用之后调用,此时不会关系方法...

spring 4.0 AOP (使用AspectJ的注解方式 的aop实现)简单实例

AspectJ:Java 社区里最完整最流行的 AOP 框架. spring aop 配合使用aspectj(AOP框架)实现我们所需的aop功能 在 Spring 中启用 AspectJ 注解支持...

Spring AspectJ AOP 简单示例

转自 http://outofmemory.cn/java/spring/AOP/aop-aspectj-example-before-after-AfterReturning-afterThrowi...

spring心得10--使用Aspectj进行AOP开发介绍及案例分析

1.使用Aspectj进行AOP开发 使用aspectjs的操作步骤: 1)添加类库:aspectjrt.jar和aspectjweaver.jar 2)添加aop schema. 3)定义x...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring入门(AspectJ简单介绍)
举报原因:
原因补充:

(最多只允许输入30个字)