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可 ...
随机推荐
- Sublime Text2 使用心得总结
sublime text2是开发代码编辑的神器 ,编辑器界面优美,操作速度快速.而且Sublime Text2是一款跨平台的编辑器,再也不用为换平台而找不到合适的.熟悉的编辑器担忧了. Sublime ...
- IPFS私有网络搭建总结
参考:https://mp.weixin.qq.com/s/IKcXAjcX_BxI4siBeVsJUw 测试环境 节点A.B.C为局域网内三台部署了IPFS的节点,A为win7,B为Redhat L ...
- ACID原则
ACID原则是数据库事务正常执行的四个,分别指原子性.一致性.独立性及持久性. 事务的原子性(Atomicity)是指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如 ...
- get请求直接通过浏览器发请求传数组或者list到后台
原文链接: http://blog.csdn.net/qq_27093465/article/details/76160419 感谢原作者 例如: http://localhost:27001/tes ...
- 通过samus驱动实现基本数据操作
传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由(database).集合(collection).文档对象(documen ...
- Day learn,day up
前言 忽略我这个中文式英语的标题. 身为一个记性不咋地的前端渣渣,觉得平时看的一些文章太散了,特开此文作为一种记录,可谓好记性不如烂笔头,也算是逼自己要经常学习.文章的日期为最后更新时间,题目顺序不分 ...
- windows 下 基于express搭建 https协议的网站
参考 https://blog.csdn.net/xingyanchao/article/details/79362443 问题在于生成SSL证书的时候Windows环境下会报错 解决方案 参考 ht ...
- Spring Boot 鉴权之—— JWT 鉴权
第一:什么是JWT鉴权 1. JWT即JSON Web Tokens,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519),他可以用来安全的传递信息,因为传递的信息是 ...
- AWS CloudFront / 亚马逊CDN使用教程
步骤: 1. 打开CloudFront服务之后,首先需要选择分发类型.分发类型分为一般的静态文件分发和流媒体分发,即Web和RTMP,我的站点即选择Web类型. 2. CDN回源设定. a. 首先要填 ...
- Binder机制简析(三)
注册Service Service组件运行在Server进程中,首先要将Service注册到Service Manager中,再启动一个Binder线程池来等待和处理Client的通信请求. 注册过程 ...