spring总结————AOP面向切面总结
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面向切面总结的更多相关文章
- Spring:AOP面向切面编程
AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...
- Spring 08: AOP面向切面编程 + 手写AOP框架
核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...
- Spring框架 AOP面向切面编程(转)
一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...
- 【spring源码学习】spring的AOP面向切面编程的实现解析
一:Advice(通知)(1)定义在连接点做什么,为切面增强提供织入接口.在spring aop中主要描述围绕方法调用而注入的切面行为.(2)spring定义了几个时刻织入增强行为的接口 => ...
- Spring的AOP面向切面编程
什么是AOP? 1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程. 功能: 让关注点代码与业务代码分离! 关注点: 重复代码就叫做关注点: ...
- spring:AOP面向切面编程02
参考: https://blog.csdn.net/jeffleo/article/details/54136904 一.AOP的核心概念AOP(Aspect Oriented Programming ...
- Spring注解 - AOP 面向切面编程
基本概念: AOP:Aspect Oriented Programming,即面向切面编程 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 前置通知(@Before):在目标 ...
- Spring框架——AOP面向切面编程
简介 AOP练习 使用动态代理解决问题 Spring AOP 用AspectJ注解声明切面 前置后置通知 利用方法签名编写AspectJ切入点表达式 指定切面的优先级 基于XML的配置声明切面 Spr ...
- Spring之AOP(面向切面编程)_入门Demo
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...
随机推荐
- Go语言如何实现单例模式
单例模式是常见的设计模式,被广泛用于创建数据库,redis等单实例.作用在于可以控制实例个数节省系统资源 特点: 保证调用多次,只会产生单个实例 全局访问 单例的分类 单例模式大致分为2大类: 懒汉式 ...
- 吴裕雄--天生自然HTML学习笔记:HTML 统一资源定位器(Uniform Resource Locators)
URL 是一个网页地址. URL可以由字母组成,如"runoob.com",或互联网协议(IP)地址: 192.68.20.50.大多数人进入网站使用网站域名来访问,因为 名字比数 ...
- C++笔试常见问题
C++提供的编译预处理功能主要有以下三种: 宏定义 文件包含 条件编译 预编译又称为预处理 , 是做些代码文本的替换工作.处理#开头的指令 , 比如拷贝 #include包含的文件代码, #defin ...
- Spring Security基本原理
近期研究了Spring Security,现进行记录. 首先先进行一个最简单的demo.默认情况下,在Spring Boot里,如果在classpath下面有Spring Security相关的jar ...
- iOS自建分发
1.首先满足具有https证书的域名和空间.2.通常使用github或者国内第三方托管平台.3.上传ipa文件到空间内,获取ipa文件的下载地址.4.然后编辑plist文件(注意:ipa文件和plis ...
- Android(四)-JVM与DVM区别
JVM与DVM区别 1.由来 Android是基于java的既然java已经有了java虚拟机,为什么android还要弄一个DVM了?最重要的就是版权问题,一开始就是用的 JVM,没过多久就被SUN ...
- Ubuntu日常使用总结
Contents 使用了将近一年的Ubuntu,感觉不用windows也可以处理日常的事务.并且我相信只要合理利用Ubuntu,一定可以取代你手中的Windows.我不是说Ubuntu有多么好,只是从 ...
- 《AndroidStudio导入安卓源码-idegen》---可方便查看安卓源代码
idegen是Android源码中的一个模块,需要编译一下.生成一个jar包.然后再进行构建生成AndroidStudio配置相关文件. > 什么是idegen 要将Android系统源代码工程 ...
- jQuery学习笔记二
事件监听者是DOM的一部分,任何页面都可以增加事件监听者.浏览器利用事件监听者监视页面上做了什么,然后告诉Javascript解释器是否需要采取行动.如:$('#showMessage').click ...
- 【WPF学习】第五十章 故事板
正如上一章介绍,WPF动画通过一组动画类(Animation类)表示.使用少数几个熟悉设置相关信息,如开始值.结束值以及持续时间.这显然使得它们非常适合于XAML.不是很清晰的时:如何为特定的事件和属 ...