第一步:导包

第二步:实现类和切面类

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. C++ 结构体案例2 升序打印数组中的元素

    1 //结构体案例 2 2 #include<iostream> 3 #include<string> 4 #include<ctime> 5 using name ...

  2. 【原创】在macOS Big Sur (Silicon M1, ARM)中配置ASP运行环境

    亲测有效,转载请附原文地址. 一,安装Parallels Desktop,注意选择支持ARM的版本. 二,注册 Windows Insider Preview Downloads 账号,通过以下链接下 ...

  3. Blazor 模板化组件开发指南

    翻译自 Waqas Anwar 2021年4月15日的文章 <A Developer's Guide To Blazor Templated Components> [1] 在我之前的一篇 ...

  4. solr7.4.0+mysql+solrj(简而优美)

    目录: 1 solr7部署+创建核心2 solr mysql 连接 2.1 导入相关 jar包 2.2 配置连接信息 2.3 配置中文分析器3 solrj JAVA客户端应用 3.1 solrj 构建 ...

  5. spring-session-data-redis反序列化问题

    springCloud项目,采用springSession,用户模块同时引入了spring-cloud-starter-security,在其他模块request.getSession()的时候抛了以 ...

  6. Azure Bicep 开发利器

    Bicep 是一种用于声明式部署Azure资源的领域特定语言.它的目标是通过更清晰的语法.改进的类型安全性.以及对模块化和代码重用的更好支持,彻底简化编写体验. Bicep 其实是对 ARM 模板的透 ...

  7. Vue CLI安装报错 npm ERR! Exit handler never called!

    安装Vue CLI时报错: npm install –g vue-cli 试了四种办法 1.把全局安装-g放到后面 npm install @vue/cli –g 2.命令行输入 npm 缓存清理命令 ...

  8. SQL 练习15

    检索" 01 "课程分数小于 60,按分数降序排列的学生信息 SELECT Student.* ,SC.score from Student,SC WHERE sc.cid = ' ...

  9. NPM使用方法

    什么是npm npm是nodejs的包管理器,在当今工程化前端开发过程中,npm包起着举足轻重的作用. 安装npm 作为nodejs的包管理器,npm随着nodejs一起安装的.通常情况下,当我们安装 ...

  10. 深层剖析鸿蒙轻内核M核的动态内存如何支持多段非连续性内存

    摘要:鸿蒙轻内核M核新增支持了多段非连续性内存区域,把多个非连续性内存逻辑上合一,用户不感知底层的不同内存块. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dynamic Mem ...