Spring(十二)--Spring AspectJ
Spring AspectJ
AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
AspectJ 是一个面向切面的框架!定义了AOP的语法!
Spring 将AspectJ 整合到了自己的框架中!
需要引入两个核心jar
01.aspectj.weaver
02.spring-aspects
(如果你使用的是idea 所需的所有pom节点,在这儿:https://www.cnblogs.com/fl72/p/9625697.html)
务必掌握的 AspectJ 的切入点表达式
execution([访问权限类型] 返回值类型 [完整限定类名]方法名 (参数) [抛出的异常类型])
execution( 返回值类型 方法名(参数))
*:0-N的字符
..:
01.如果是在方法参数中,表示参数可有多个或者可无
02.如果是在包名之后,表示当前包和子包
+:
01.如果定义在类后面,表示当前类以及子类
02.如果定义在接口后面,表示当前接口以及实现类
例子:

1. 使用注解实现
/**
* 当前类就是 整个程序中需要的各种系统级业务
* 就是一个切面类
*/
@Aspect
public class MyAspectJ { @Before("execution(* *..UserDao.sleep(..))")
public void before(){
System.out.println("前置增强........");
} @AfterReturning("execution(* *..UserDao.sleep(..))")
public void afterReturning(){
System.out.println("后置增强........");
}
//如果想获取方法的返回值
@AfterReturning(value = "execution(* *..UserDao.sleep(..))",returning = "result")
public void afterReturning(String result){
System.out.println("后置增强........"+result);
} /**
* 环绕增强可以改变返回值
*/
@Around("execution(* *..UserDao.eat(..))")
public Object around(ProceedingJoinPoint point){
System.out.println("环绕增强进来........");
Object result=null;
try {
result= point.proceed(); //执行目标方法
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("环绕增强出去........");
return "orange";
}
}
2. 对应的xml文件和测试方法
<!--01.配置目标对象-->
<bean id="userDao" class="com.xdf.dao.UserDaoImpl"/> <!--02.配置切面-->
<bean id="myAspectJ" class="com.xdf.annotation.MyAspectJ"/> <!--03.注册aspectj的自动代理-->
<aop:aspectj-autoproxy/> //测试方法
@Test
public void defaultTest(){
ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
UserDao dao= context.getBean("userDao", UserDao.class);
// System.out.println(dao.eat());
dao.sleep();
}
3. 使用纯切面的方式实现
public class MyAspectJ {
    public void  before(){
        System.out.println("前置增强........");
    }
    public void  afterReturning(){
        System.out.println("后置增强........");
    }
    /**
     * 环绕增强可以改变返回值
     */
    public Object  around(ProceedingJoinPoint point){
        System.out.println("环绕增强进来........");
        Object result=null;
        try {
             result=  point.proceed(); //执行目标方法
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("环绕增强出去........");
        return  "orange";
    }
}
4.对应的xml文件和测试方法
<!--01.配置目标对象-->
<bean id="userDao" class="com.xdf.dao.UserDaoImpl"/> <!--02.配置切面-->
<bean id="myAspectJ" class="com.xdf.annotation.MyAspectJ"/> <!--03.注册aspectj需要的切入点-->
<aop:config>
<!--配置切入点表达式-->
<aop:pointcut id="myPonit" expression="execution(* *..UserDao.sleep(..))"/>
<aop:pointcut id="myPonit2" expression="execution(* *..UserDao.eat(..))"/>
<!--配置切面-->
<aop:aspect ref="myAspectJ">
<aop:before method="before" pointcut-ref="myPonit"/>
<aop:after-returning method="afterReturning" pointcut-ref="myPonit"/>
<aop:around method="around" pointcut-ref="myPonit2"/>
</aop:aspect>
</aop:config>
@Test
public void aspectJTest(){
ApplicationContext context=new ClassPathXmlApplicationContext("aspectJ.xml");
UserDao dao= context.getBean("userDao", UserDao.class);
//System.out.println(dao.eat());
dao.sleep();
}
未完待续!!!
Spring(十二)--Spring AspectJ的更多相关文章
- Spring(十二)使用Spring的xml文件配置方式实现AOP
		配置文件与注解方式的有非常大不同,多了非常多配置项. beans2.xml <?xml version="1.0" encoding="UTF-8"? & ... 
- 十二 Spring的AOP开发入门,整合Junit单元测试(AspectJ的XML方式)
		创建web项目,引入jar包 引入Spring配置文件 
- 学习 Spring (十二) AOP 基本概念及特点
		Spring入门篇 学习笔记 AOP: Aspect Oriented Programming, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 主要功能是:日志记录.性能统计.安全控 ... 
- Java开发学习(二十二)----Spring事务属性、事务传播行为
		一.事务配置 上面这些属性都可以在@Transactional注解的参数上进行设置. readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true. timeout ... 
- Spring(十二)之JDBC框架
		JDBC 框架概述 在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等.但 Spring JDBC 框架负责所有的低层细节,从开始打开连接,准备和执行 SQ ... 
- Spring学习(十二)-----Spring @PostConstruct和@PreDestroy实例
		实现 初始化方法和销毁方法3种方式: 实现标识接口 InitializingBean,DisposableBean(不推荐使用,耦合性太高) 设置bean属性 Init-method destroy- ... 
- Spring学习(十二)-----Spring Bean init-method 和 destroy-method实例
		实现 初始化方法和销毁方法3种方式: 实现标识接口 InitializingBean,DisposableBean(不推荐使用,耦合性太高) 设置bean属性 Init-method destroy- ... 
- spring cloud深入学习(十二)-----Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式
		Zuul的核心 Filter是Zuul的核心,用来实现对外服务的控制.Filter的生命周期有4个,分别是“PRE”.“ROUTING”.“POST”.“ERROR”,整个生命周期可以用下图来表示. ... 
- Spring Boot2 系列教程(三十二)Spring Boot 整合 Shiro
		在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro. 今天松哥就来和大家聊聊 Spring Boot ... 
- Spring MVC(二)--Spring MVC登陆实例
		本文通过一个简单的登陆实例实现Spring MVC的流程,同时整合 MyBatis使用,流程是这样的: 1.访问一个URL进入登陆界面 2.输入正确的用户名和密码,成功则进入index页面,否则留在登 ... 
随机推荐
- CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)E
			题面 这个题暴好啊,考了很多东西. 首先设f(x)为离终点还有x步要走的期望步数,我们可以发现 : 1.x>=k时,x可以转移到的点的下标都<x. 2.x<k时,则可能走回到x或者下 ... 
- 重启php7.0-fpm
			/etc/init.d/php7.0-fpm restart 
- webpack打包.vue文件
			在webpack中配置.vue组件页面的解析(vue-loader) 结合webpack使用vue-router 在webpack中配置.vue组件页面的解析 1.运行npm i vue -S将vue ... 
- Spring Boot教程(三十七)整合MyBatis
			Spring中整合MyBatis就不多说了,最近大量使用Spring Boot,因此整理一下Spring Boot中整合MyBatis的步骤.搜了一下Spring Boot整合MyBatis的文章,方 ... 
- Android_activity实现一个简单的新建联系表
			项目展示: 第一个Activity用于显示联系人信息 第二个Activity输入联系人信息 要求: 运行“新建联系人”程序,结果如下图所示: 点击“新建联系人”按钮,打开输入信息界面并输入姓名.公司. ... 
- python-获取程序的路径
			python获取当前路径 import os,sys 使用sys.path[0].sys.argv[0].os.getcwd().os.path.abspath(file).os.path.realp ... 
- ESPCMS的CSRF添加管理员账号
			ESPCMS的CSRF添加管理员账号 前言 这里开始的思路是先注入进去 然后getshell 但是不关CSRF什么事 换思路 看了一下群消息 大哥发了一个视频 后台名称admin admin12 ... 
- 使用Python进行层次聚类
			使用 scipy.cluster.hierarchy.linkage进行层次聚类 from scipy.cluster.hierarchy import dendrogram, linkage,fcl ... 
- 【黑马JavaSE】1_1_11_IDEA、12_方法、13_重载
			文章目录 1_1_11_01开发工具IntelliJ IDEA 1.3 创建包.查看包的目录结构 1.5 字体设置(File->Settings->Editor->Font) 1.6 ... 
- ActivityLifecycleCallbacks
			public class ActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks, ActivityS ... 
