spring总结————AOP面向切面

一、spring aop概念

spring aop面向切面编程,java是面向对象的语言。

真正的service层代码

业务逻辑层再处理业务之前和之后都要进行一些参数的校验,异常处理,日志记录等代码。有非常多非常核心的业务逻辑在里面,这些业务逻辑不要是不行的。怎么解决这种问题?生活中有很多这样的例子,实际上就是使用了代理模式来解决这个问题。spring aop 就是基于代理模式的。代理分静态代理和动态代理,spring aop的核心就是通过动态代理来实现的。

二、使用bean的方式配置spring的aop

先创建项目,把项目运行起来

第一步,创建spring项目  引入jar包

第二步,创建主配置文件

 <?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd">
<bean id="userService" class="com.aaa.spring.service.impl.UserServiceImpl"></bean>
</beans>

第三步,创建包实体类

注:service层只保留核心的业务逻辑代码:

 package com.aaa.spring.service.impl;
import com.aaa.spring.entity.Userimport com.aaa.spring.service.UserService/**
* 用户管理service实现类
*/
public class UserServiceImpl implements UserService {
@Override
public void saveUser(User user) {
System.out.println("保存用户");
}
@Override
public void deleteUser(User user) {
System.out.println("删除用户");
}
@Overridepublic void updateUser(User user) {
System.out.println("修改用户");
}
@Override
public User findById(Long id) {
System.out.println("根据id查找用户");
return null;
}
}

第四步,在spring的主配置文件中配置bean

 <?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd">
<bean id="userService" class="com.aaa.spring.service.impl.UserServiceImpl"></bean>
</beans>

第五步,测试

 package com.aaa.spring;
import com.aaa.spring.entity.User;
import com.aaa.spring.service.UserService;
import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 获取对象
*/
public class Test01 {
public static void main(String[] args) {
//创建spring的工厂类对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//从工厂中获取对象
UserService userService = context.getBean(UserService.class);
userService.saveUser(new User());
userService.deleteUser(new User());
userService.updateUser(new User());
userService.findById(10L);
}
}

三、实现aop

一、导入jar包

二、声明日志处理类的代码 ,在spring aop中,管这种代码叫通知

 package com.aaa.spring.advice;
import org.aspectj.lang.JoinPoint;
import java.util.Date;
/**
* 日志记录的代码
*/
public class LogAdvice {
/**
* 日志记录的代码,通过JoinPoint对象可以获取方法调用的一些参数
* @param jp
*/
public void log(JoinPoint jp){
//获取调用方法的名称
String methodName = jp.getSignature().getName();
System.out.println(new Date()+"调用了"+methodName);
}
}

三、配置AOP

 <?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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/springaop.xsd">
<bean id="userService" class="com.aaa.spring.service.impl.UserServiceImpl"></bean>
<!--声明通知类的对象,盖了一个传达室-->
<bean id="logAdvice" class="com.aaa.spring.advice.LogAdvice"></bean>
<!--
实现aop 相当于实现在有同学进入学校的时候检查是否穿了拖鞋
-->
<aop:config>
<!---声明切入点表达式 expression是什么要拦截哪些类的哪些方法
切入点表达式语法
举例1:如果要拦截所有com.aaa.spring.service.impl包下的UserServiceImpl类的所有以User结尾的方法
execution(* com.aaa.spring.service.imp.UserServiceImpl.*User(..))
举例2:如果要拦截所有类的以User结尾的方法
execution(* *User(..))
举例2:要拦截所有com.aaa.spring包或者子包下所有的以User结尾的方法
execution(* com.aaa.spring..*.*User(..))
-->
<aop:pointcut id="p1" expression="execution(void *User(..)) "></aop:pointcut>
<!---声明切面,完成日志记录的功能-->
<aop:aspect ref="logAdvice">
<!--声明后置通知,在所有拦截的方法执行完之后执行-->
<!---拦截到目标方法之后要调用通知类的哪个方法-->
<aop:after-returning method="log" pointcut-ref="p1"></aop:after-returning>
</aop:aspect>
</aop:config>
</beans>

bean配置aop

四、测试

四、aop常用的五种通知类型

通知类型  

说明  

注解配置(aop:aspectj-autoproxy)

aop:before前置通知  

在目标方法调用之前执行

@Before("exception(void *(..))")

aop:after-returning后置通知

在目标方法调用之后执行,一旦目标方法产生异常,不会执行

@AfterReturning("execution(*(..))")

aop:after最终通知

在目标方法调用之后执行,无论目标是否产生异常,都会被执行

 

aop:after-throwing异常通知

在目标方法产生异常的时候执行

@AfterThrowing(pointcut="excution(void *(..))",throwing="e")

aop:arround 环绕通知

在目标方法执行之前和 之后都写一写非核心的业务逻辑,一般可以用来替代前置通知和后置通知

aop:around,method,pointcut-ref

总结:aop面向切面编程,aop接口业务逻辑中横向代码重复的问题

aop用bean的方式配置aop通知五种类型

使用注解配置aop

面试题:

aop底层使用了什么设计模式

使用了动态代理模式 springaop支持jdk动态代理和cglib动态代理

spring aop常用的五种通知类型是什么

前置通知,后置通知,环绕通知,异常通知,最终通知

spring总结————AOP面向切面总结的更多相关文章

  1. Spring:AOP面向切面编程

    AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...

  2. Spring 08: AOP面向切面编程 + 手写AOP框架

    核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...

  3. Spring框架 AOP面向切面编程(转)

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  4. 【spring源码学习】spring的AOP面向切面编程的实现解析

    一:Advice(通知)(1)定义在连接点做什么,为切面增强提供织入接口.在spring aop中主要描述围绕方法调用而注入的切面行为.(2)spring定义了几个时刻织入增强行为的接口  => ...

  5. Spring的AOP面向切面编程

    什么是AOP? 1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程. 功能: 让关注点代码与业务代码分离! 关注点: 重复代码就叫做关注点: ...

  6. spring:AOP面向切面编程02

    参考: https://blog.csdn.net/jeffleo/article/details/54136904 一.AOP的核心概念AOP(Aspect Oriented Programming ...

  7. Spring注解 - AOP 面向切面编程

    基本概念: AOP:Aspect Oriented Programming,即面向切面编程 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 前置通知(@Before):在目标 ...

  8. Spring框架——AOP面向切面编程

    简介 AOP练习 使用动态代理解决问题 Spring AOP 用AspectJ注解声明切面 前置后置通知 利用方法签名编写AspectJ切入点表达式 指定切面的优先级 基于XML的配置声明切面 Spr ...

  9. Spring之AOP(面向切面编程)_入门Demo

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...

随机推荐

  1. Java 并发编程面试题

    并发编程面试题-内存模型说下内存模型定义为什么要有内存模型为什么要重排序,重排序在什么时候排如何约束重排序规则happens-before什么是顺序一致性CAS 实现的原理,是阻塞还是非阻塞方式?什么 ...

  2. struts2学习笔记之十四:使用注解配置Action(不是和spring集成使用)

    Struts2支持使用注解配置Action,减少配置文件的配置 Struts2如果要支持注解配置Action,需要插件的支持,导入插件struts2-convention-plugin-2.1.8.1 ...

  3. Angular系列一:Angular程序架构

    Angular程序架构 Angular程序架构 组件:一段带有业务逻辑和数据的Html服务:用来封装可重用的业务逻辑指令:允许你向Html元素添加自定义行为模块: 环境搭建 安装nodeJs安装好no ...

  4. A Knight's Journey (DFS)

    题目: Background The knight is getting bored of seeing the same black and white squares again and agai ...

  5. Errors running builder JavaScript Validator

    问题: 解决方法: 方法一. 选择对应项目—-右键Properties—-Builders—-取消“JavaScript Validator”的勾就OK了 方法二. 找到“.project”文件,找到 ...

  6. 表单验证之JQuery Validate控件

    概述 jQuery Validation Plugin v1.14.0,基于JQuery,官网http://jqueryvalidation.org/ 该插件捆绑了一套有用的验证方法,包括 URL 和 ...

  7. Python 十大语法

    前言 Python 是一种代表简单思想的语言,其语法相对简单,很容易上手.不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了.本文精心筛选了最能展现 Python 语法之精妙的十个知识 ...

  8. bootstrap简介与入门

    bootstrap前端框架 1.概念:一个前端开发的框架,Bootstrap,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JavaScript 的,它 ...

  9. C# 客户端内存优化分析

    背景概述 C# 开发客户端系统的时候,.net 框架本身就比较消耗内存资源,特别是xp 这种老爷机内存配置不是很高的电脑上运行,所以就需要进行内存上的优化,才能流畅的在哪些低端电脑上运行. 想要对C# ...

  10. 【译文连载】 理解Istio服务网格(第七章 安全)

    全书目录 第一章 概述 第二章 安装 第三章 流控 第四章 服务弹性 第五章 混沌测试 第六章 可观测性 本文目录 第7章 安全 7.1 身份认证 7.1.1 Kubernetes上的Istio的身份 ...