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可 ...
随机推荐
- Java IO: RandomAccessFile
原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) RandomAccessFile允许你来回读写文件,也可以替换文件中的某些部分.FileIn ...
- 思科WLC5508上传定制Portal展示模版
1. 登录Cisco设备,获取模板样例登录cisco WLC设备后点击help,打开帮助文档Wireless Tab-->Web Login Page-->External Web Aut ...
- Uber自动驾驶卡车正式运营,是否会给卡车司机彻底“宣判死刑”?
随着科技的快速迭进和嬗变,大众的生活也在被全面革新和改变.不过有些改变是显性的,比如PC和智能手机的出现.有些改变却是隐性的,比如太空科技.云计算等.而在当下,又一个看似与大众生活紧密相关,但一般人却 ...
- OpenGL Panorama Player
JMGL_PANO star_war_eve source 1 star_war_eve source 2 1. 介绍 JMGL_PANO 是Justin开源的一个全景视频播放器(Github).基于 ...
- MyEclipse下Spring+Hibernate整合
目前,SSH(Struts+Spring+Hibernate)是Web开发的一种常用框架组合,Struts实现了MVC,Hibernate实现了关系对象映射,Spring实现了基于Bean的配置管理. ...
- AndroidStudio自动导入包
IntelliJ IDEA可以自动优化导入包,但是有多个同名的类位于不同的包时,需要自己手动使用Alt + Enter进行导入. Settings→Editor→General→Auto Import ...
- 理解 Java 内存模型的因果性约束
目录 理解 Java 内存模型的因果性约束 欢迎讨论 规范理解 例子练习 例子1 例子2 总结 理解 Java 内存模型的因果性约束 欢迎讨论 欢迎加入技术交流群186233599讨论交流,也欢迎关注 ...
- Grafana+Prometheus监控mysql性能
#cmd /usr/local 今天讲一下如何监控服务器中的mysql数据库的性能 一.数据库操作 1.mysql启动 #service mysqld start #启动数据库 #service my ...
- Python爬虫-scrapyd
1.什么是scrapyd Scrapyd是一个服务,用来运行scrapy爬虫的. 它允许你部署你的scrapy项目以及通过HTTP JSON的方式控制你的爬虫. 官方文档:http://scrapyd ...
- JMeter-完成批量的接口测试
前言 当我们在工作中进行接口测试时,项目的接口肯定不止一个,而是很多很多,而且每个接口都需要进行正确参数,错误参数,参数为空,特殊字符等方式来测试接口是否能够正确返回所需的响应值. 今天,我们来一起学 ...