AspectJ框架基于注解的AOP实现

AspectJ的AOP实现:有两种方式,一种是基于XML配置文件,一种是基于注解的,由于注解更为常用,这里

这里只针对注解来学习。

--------------------------------------------------------------------------------------

 1 package com.sjl.aspectj.annotation;
 2
 3 import org.aspectj.lang.JoinPoint;
 4 import org.aspectj.lang.ProceedingJoinPoint;
 5 import org.aspectj.lang.annotation.*;
 6 import org.springframework.stereotype.Component;
 7
 8 /**
 9  * 切面类,在此类中编写通知
10  * */
11 @Aspect
12 @Component //这个注解的作用是实例化对象,相当于在配置文件中<bean id="" class="">
13 public class MyAspect {
14     //定义切入点表达式
15     @Pointcut("execution(* com.sjl.jdk.*.*(..))")
16     //用一个返回值为void、方法体为空的方法来命名切入点
17     private void myPoint(){ }
18
19     // 前置通知
20     @Before("myPoint()")
21     public void myBefore(JoinPoint joinPoint) {
22         System.out.print("前置通知 :模拟执行权限检查...,");
23         System.out.print("目标类是:"+joinPoint.getTarget().getClass() );
24         System.out.println(",被织入增强处理的目标方法为:"
25                 +joinPoint.getSignature().getName());
26     }
27
28     // 后置通知
29     @AfterReturning("myPoint()")
30     public void myAfterReturning(JoinPoint joinPoint) {
31         System.out.print("后置通知:模拟记录日志...," );
32         System.out.println("被织入增强处理的目标方法为:"
33                 + joinPoint.getSignature().getName());
34     }
35
36     /**
37      * 环绕通知
38      * ProceedingJoinPoint 是JoinPoint子接口,表示可以执行目标方法
39      * 1.必须是Object类型的返回值
40      * 2.必须接收一个参数,类型为ProceedingJoinPoint
41      * 3.必须throws Throwable
42      */
43     @Around("myPoint()")
44     public Object myAround(ProceedingJoinPoint proceedingJoinPoint)
45             throws Throwable {
46         // 开始
47         System.out.println("环绕开始:执行目标方法之前,模拟开启事务...");
48         // 执行当前目标方法
49         Object obj = proceedingJoinPoint.proceed();
50         // 结束
51         System.out.println("环绕结束:执行目标方法之后,模拟关闭事务...");
52         return obj;
53     }
54
55     // 异常通知
56     @AfterThrowing(value = "myPoint()",throwing = "e")
57     public void myAfterThrowing(JoinPoint joinPoint, Throwable e) {
58         System.out.println("异常通知:" + "出错了" + e.getMessage());
59     }
60
61     // 最终通知
62     @After("myPoint()")
63     public void myAfter() {
64         System.out.println("最终通知:模拟方法结束后的释放资源...");
65     }
66 }
67 /**
68  * 提醒:同时记得jdk包下的目标类也要进行一个持久化层的一个注解的添加;
69  * */

#接口、目标类:

package com.sjl.jdk;

public interface UserDao {
     void addUser();
     void deleteUser();
}
package com.sjl.jdk;

import org.springframework.stereotype.Repository;

/**
 * UserDaoImpl是目标类,对其中的方法进行增强处理;
 */
@Repository("userDao")
public class UserDaoImpl implements UserDao{

    @Override
    public void addUser() {
        System.out.println("添加用户");
    }

    @Override
    public void deleteUser() {
        System.out.println("删除用户");
    }
}

#配置文件的配置

<?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-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--指定需要扫描的包,使注解生效-->
    <context:component-scan base-package="com.sjl"/>
    <!--启动注解声明式AspectJ支持-->
    <aop:aspectj-autoproxy />
</beans>

#测试类:

package com.sjl.aspectj.annotation;

import com.sjl.jdk.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

//测试类
public class TestAnnotationAspectj {
    public static void main(String[] args) {
        String xmlPath="applicationContext02Annotation.xml";
        ApplicationContext ac=new ClassPathXmlApplicationContext(xmlPath);        //接口类型,向上造型  提高代码的复用性,其实也可以强转为父类,就强转为子类,        // 但是复用性就差,因为后面如果还有其它的代码就不利于使用        UserDao userDao=(UserDao)ac.getBean("userDao"); userDao.addUser();    } }

原文地址:https://www.cnblogs.com/shijinglu2018/p/10354792.html

时间: 2024-08-01 18:53:42

AspectJ框架基于注解的AOP实现的相关文章

Spring_Spring与AOP_AspectJ基于注解的AOP实现

一.AspectJ.Spring与AOP的关系 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件.(百度百科) Spring又将AspectJ的对于AOP的实现引入到自己的框架中. 在Spring中使用AOP开发时,一般使用AspectJ的实现方式. 二.AspectJ的通知类型 前置通知 后置通知 环绕通知 异常通知 最终通知 三.AspectJ的切入点表达式 表达式中加[]的部分

SPRING学习(十九)--基于注解的AOP切面编程

上篇中介绍了基于XML配置的AOP切面编程,除了XML配置AOP切面编程外,还可以通过注解方式实现AOP切面编程,本篇通过一个小例子来介绍基于注解的AOP编程. 1.在spring中使用AOP变成,不止要导入spring-aop.jar,还需要导入spring-aspects.jar.aspectjweaver.jar和aopalliance.jar,但是aspectjweaver.jar被spring-aspects.jar依赖,aopalliance.jar被spring-aop.jar依赖

框架 day37 Spring3,AOP,代理模式(动态/CGLIB/工厂bean),传统AOP,AspectJ框架(基于xml/注解),切入点表达式,jdbcTemplate

1     AOP 1.1   什么是AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. * AOP采取横向抽取机制,取代了传统纵向继承体系

Spring AspectJ基于注解的AOP实现

对于AOP这种编程思想,很多框架都进行了实现.Spring就是其中之一,可以完成面向切面编程.然而,AspectJ也实现了AOP的功能,且实现方式更为简捷,使用更加方便,而且还支持注解式开发.所以,Spring又将AspectJ对于AOP的实现也引入到了自己的框架中.     在Spring中使用AOP开发时,一般使用AspectJ的实现方式. Spring的经典AOP配置方案  01.使用的是Aspectj第三方框架,实现了AOP思想  02.注解配置的AOP  03.纯POJO <aop:c

Spring基础知识之基于注解的AOP

背景概念: 1)横切关注点:散布在应用中多处的功能称为横切关注点 2)通知(Advice):切面完成的工作.通知定了了切面是什么及何时调用. 5中可以应用的通知: 前置通知(Before):在目标方法被调用前调用通知功能. 后置通知(After):在目标方法完成后调用通知,此时不会关系方法输出什么. 返回通知(After-returning):在目标方法成功执行后调用通知. 异常通知(After-throwing):在目标方法抛出异常后调用通知. 环绕通知(Around):通知包裹了被通知的方法

阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置

复制依赖和改jar包方式 src下的都复制过来. 复制到新项目里了 bean.xml里面复制上面一行代码到下面.把aop改成context. 配置spring容器创建时要扫描的包 Service的配置这里就可以删除了 配置注解 使用@Service注解 开始AOP配置 把通知类交给Spring来管理 在Logger上加注解.之类注意,@Service和@Repository都不合适.因为logger属于三层 所以这里用@Component这个注解来配置 写完上面的@Component的注解后.b

阶段3 1.Mybatis_04.自定义Mybatis框架基于注解开发_3 基于注解的自定义再分析

这里只需要 一是连接数据库的 二是映射的 注解是class的方式  dom4j技术获取xml的数据,这是xml的方式获取的下面几个关键的点 注解的方式回去dao类里面的几个主要的信息 User黄色的部门就是要封装到哪里的数据.基于注解的开发,如何拿到User是最关键的 设计注解和泛型相关的知识 最终得到class的名称 原文地址:https://www.cnblogs.com/wangjunwei/p/11306401.html

阶段3 1.Mybatis_04.自定义Mybatis框架基于注解开发_2 回顾自定义mybatis的流程分析

原文地址:https://www.cnblogs.com/wangjunwei/p/11306369.html

spring学习(二) ———— AOP之AspectJ框架的使用

前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以这篇文章主要介绍一下什么是AOP,如何去理解AOP.理解完之后,在spring中如何使用AspectJ AOP框架的.看得懂,写的出spring配置的那么就学的差不多了.加油.建议都自己手动实现一遍,这样才能更好的理解. --WH 一.什么是AOP? AOP:面向切面编程,采用横向抽取机制,取代了传