第一步:导包

第二步:实现类和切面类

Service("userService")
public class IUserviceImpl implements IUserService{
private String name ;
@Override
public void add(User user) {

}

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

@Override
public void updateUser() {
System.out.println("更新用户");

}

@Override
public int deleteUser(int id) {
System.out.println("通过id删除用户");
return 1;
}

@Override
public void deleteUser() {
System.out.println("删除用户");
// int i = 10/0;

}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public void add() {
System.out.println("创建用户");

}
}
@Component //AOP底层
@Aspect
public class MyAspect {

@Before("execution(* com.zz.service.UserServiceImpl.*(..))")
public void myBefore(JoinPoint joinPoint){
System.out.println("1 前置通知..."+joinPoint.getSignature().getName());
}

public void myAfterReturning(){
System.out.println("4 后置通知...");
}

/* public Object myAround() throws Throwable {
return myAround();
}*/

public Object myAround( ProceedingJoinPoint pjp) throws Throwable {
System.out.println("2环绕通知...开启事务");
System.out.println(pjp.getSignature().getName());//切入点就方法名
//放行
Object retObj = pjp.proceed();
System.out.println("3提交事务...提交事务");
return retObj;
}

public void myAfterThrowing( JoinPoint jp,Throwable e) {
System.out.println("异常通知..." + jp.getSignature().getName() + "===" + e.getMessage());
}

public void myAfter(JoinPoint jp){

System.out.println("最终通知 ");

}

第三步:spring的xml配置

<!--  配置UserService-->
<bean id="userService" class="com.zz.service.UserServiceImpl"></bean>
<!-- 配置切面类对象-->
<bean id="myAspect" class="com.zz.aspect.MyAspect"></bean>

<aop:config >

<!-- 切入点:2
expression:表达式
每个service的方法前面都开启事务和结束事务

AOP:用于事务配置&日志记录
-->
<aop:aspect ref="myAspect"> //指定切面类位置
<aop:pointcut id="myPointcut" expression="execution(* com.zz.service.UserServiceImpl.*(..))"/> //指定切入点
<!-- 配置前置通知...-->
<aop:before method="myBefore" pointcut-ref="myPointcut" />
<!-- 配置后置通知...-->
<aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut" />
<!-- 配置异常通知..throwing="e" 值,是方法的参数名.-->
<aop:after-throwing method="myAfterThrowing" pointcut-ref="myPointcut" throwing="e" />
<!--配置环绕通知-->
<aop:around method="myAround" pointcut-ref="myPointcut"></aop:around>
<!--配置最终通知-->
<aop:after method="myAfter" pointcut-ref="myPointcut"></aop:after>
</aop:aspect>
</aop:config>

第四步:测试

    
@Test
public void test()throws Exception{
  ApplicationContext applicationContext =new ClassPathXmlApplicationContext("Beans16.xml");

//从spring 容器获取userservice 对象
IUserService userService1= (IUserService) applicationContext.getBean("userService");

userService1.deleteUser();

}
}

AOP联盟规范

AOP实现

规范

aspectj实现

Spring AOP Aspect的简单实现(基于XML)的更多相关文章

  1. Spring AOP Aspect的简单实现(基于注解)

    第1步:声明使用注解 <!-- 配置扫描注解--> 扫描包的位置<context:component-scan base-package="com.zz"/> ...

  2. Spring声明式事务管理(基于XML方式实现)

    --------------------siwuxie095                             Spring 声明式事务管理(基于 XML 方式实现)         以转账为例 ...

  3. Spring AOP就是这么简单啦

    前言 只有光头才能变强 上一篇已经讲解了Spring IOC知识点一网打尽!,这篇主要是讲解Spring的AOP模块~ 之前我已经写过一篇关于AOP的文章了,那篇把比较重要的知识点都讲解过了一篇啦:S ...

  4. Spring系列(四):Spring AOP详解和实现方式(xml配置和注解配置)

    参考文章:http://www.cnblogs.com/hongwz/p/5764917.html 一.什么是AOP AOP(Aspect Oriented Programming),即面向切面编程, ...

  5. Spring AOP注解形式简单实现

    实现步骤: 1:导入类扫描的注解解析器 命名空间:xmlns:context="http://www.springframework.org/schema/context" xsi ...

  6. Spring(二十):Spring AOP(四):基于配置文件的方式来配置 AOP

    基于配置文件的方式来配置 AOP 前边三个章节<Spring(十七):Spring AOP(一):简介>.<Spring(十八):Spring AOP(二):通知(前置.后置.返回. ...

  7. Spring 之定义切面尝试(基于 XML)

    有些场景下只能基于 XML 来定义切面. [Spring 之定义切面尝试] 1.XML 下定义切面(首先是要有一个对应的类...显然要比基于注解的麻烦) <?xml version=" ...

  8. Spring AOP(aspect oriented programming) 转载

    1.面向切面的基本原理 软件系统可以看成是由一组关注点组成的,其中,直接的业务关注点,是直切关注点.而为直切关注点提供服务的,就是横切关注点. 01.什么是面向切面编程 横切关注点:影响应用多处的功能 ...

  9. Spring Boot -- Spring AOP原理及简单实现

    一.AOP基本概念 什么是AOP,AOP英语全名就是Aspect oriented programming,字面意思就是面向切面编程.面向切面的编程是对面向对象编程的补充,面向对象的编程核心模块是类, ...

随机推荐

  1. (论文笔记Arxiv2021)Walk in the Cloud: Learning Curves for Point Clouds Shape Analysis

    目录 摘要 1.引言 2.相关工作 3.方法 3.1局部特征聚合的再思考 3.2 曲线分组 3.3 曲线聚合和CurveNet 4.实验 4.1 应用细节 4.2 基准 4.3 消融研究 5.总结 W ...

  2. LATEX学习和IEEE Tran模板介绍

    目录 软件的选择 IEEE 模板下载 模板正文 图 表格 公式 算法 参考文献 Latex学习网站:http://www.latexstudio.net/page/tex-documents/ IEE ...

  3. kms激活windows或者office

    激活windows和office windows激活密钥 Windows 10 Professional(专业版):W269N-WFGWX-YVC9B-4J6C9-T83GX Windows 10 P ...

  4. sql注入漏洞笔记随笔

    sql注入是从1998年出现的,是一个十分常见的漏洞,它是OWASP top10的第一名(注入) 在了解sql注入之前,我们需要先了解web框架 webapp:web网站,这种方式它采用的是B/S架构 ...

  5. C 购买商品的游戏

    1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 /* 5 *模拟实现道具店购物 ...

  6. 字节跳动上传了一份“面试官版Android面试小册”,不讲一句废话,全是精华

    前言 金三银四马上就到了,很多粉丝朋友私信希望我出一篇面试专题或者分享面试相关的笔记来学习,这不今天就给大家安排上了?(都是干货,错过就是亏.) 下面的面试笔记都是精心整理好免费分享给大家的,希望新朋 ...

  7. 000 PCI Express协议入门指南目录

    一.001 PCI Express体系结构(一)

  8. Nginx 真实的 IP

    配置 Nginx 如果你的 Java 项目使用了 Nginx 代理,那么还需要进行以下配置,才能顺利获取到真实的 IP,否则只能获取到 127.0.0.1. 在 Nginx 的配置文件里,找到你 Ja ...

  9. 从零开始实现简单 RPC 框架 5:网络通信之序列化

    我们在接下来会开始讲网络通信相关的内容了.既然是网络通信,那必然会涉及到序列化的相关技术. 下面是 ccx-rpc 序列化器的接口定义. /** * 序列化器 */ public interface ...

  10. C++智能指针的原理和实现

    一.智能指针起因 在C++中,动态内存的管理是由程序员自己申请和释放的,用一对运算符完成:new和delete. new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针: delete:指向 ...