前言

    aspectJ: 一个开源的专门做aop的框架。spring框架中集成了aspectj框架,通过spring就能使用aspectj的功能。
    aspectJ框架实现aop有两种方式:
   1.使用xml的配置文件 : 配置全局事务
   2.使用注解,我们在项目中要做aop功能,一般都使用注解, aspectj有5个注解。


一、基本步骤

使用aspectj实现aop的基本步骤:
1.新建maven项目
2.加入依赖
    1)spring依赖
    2)aspectj依赖
    3)junit单元测试
3.创建目标类:接口和他的实现类。
     要做的是给类中的方法增加功能
4.创建切面类:普通类
     1)在类的上面加入 @Aspect
     2)在类中定义方法, 方法就是切面要执行的功能代码
     在方法的上面加入aspectj中的通知注解,例如@Before
     有需要指定切入点表达式execution()
5.创建spring的配置文件:声明对象,把对象交给容器统一管理
声明对象你可以使用注解或者xml配置文件
     1) 声明目标对象
     2) 声明切面类对象
     3) 声明aspectj框架中的自动代理生成器标签。
     自动代理生成器:用来完成代理对象的自动创建功能的。
6.创建测试类,从spring容器中获取目标对象(实际就是代理对象)。
     通过代理执行方法,实现aop的功能增强。

二、操作实例

1.maven依赖

     <!--spring依赖-->
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
  </dependency>
    <!--aspectj依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
   </dependency>

2.切面类实现


 *  @Aspect : 是aspectj框架中的注解。
 *     作用:表示当前类是切面类。
 *     切面类:是用来给业务方法增加功能的类,在这个类中有切面的功能代码
 *     位置:在类定义的上面
 
@Aspect
public class MyAspect {

     * 定义方法,方法是实现切面功能的。
     * 方法的定义要求:
     * 1.公共方法 public
     * 2.方法没有返回值
     * 3.方法名称自定义
     * 4.方法可以有参数,也可以没有参数。
     *   如果有参数,参数不是自定义的,有几个参数类型可以使用。
    
}

3.spring的配置文件

 <!--声明自动代理生成器:使用aspectj框架内部的功能,创建目标对象的代理对象。
        创建代理对象是在内存中实现的, 修改目标对象的内存中的结构。 创建为代理对象
        所以目标对象就是被修改后的代理对象.

        aspectj-autoproxy:会把spring容器中的所有的目标对象,一次性都生成代理对象。
    -->
 <!--<aop:aspectj-autoproxy />-->
    
 <!--
       如果你期望目标类有接口,使用cglib代理
       proxy-target-class="true":告诉框架,要使用cglib动态代理
  -->
    <aop:aspectj-autoproxy proxy-target-class="true"/>

4.测试

@Test
    public void test01(){
        String config="applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
        //从容器中获取目标对象
        SomeService proxy = (SomeService) ctx.getBean("someService");

        //com.sun.proxy.$Proxy8 :jdk动态代理
        //com.sun.proxy.$Proxy0
        System.out.println("proxy:"+proxy.getClass().getName());
        //通过代理的对象执行方法,实现目标方法执行时,增强了功能
        proxy.doSome("ttyj",25);
    }
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐