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可 ...
随机推荐
- django反向解析和正向解析
Django的正向解析和反向解析 先创建一个视图界面 urls.py index.html index页面加载的效果 正向解析 test/?result=1 所谓正向解析就是直接在这里写地址 向url ...
- 吴裕雄--天生自然KITTEN编程:小猫解题
作品链接:https://ide.codemao.cn/we/36447034
- Python---13面向对象编程
一.类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法, ...
- 来自ebay内部的「软件测试」学习资料,覆盖GUI、API自动化、代码级测试及性能测试等,Python等,拿走不谢!...
在软件测试领域从业蛮久了,常有人会问我: 刚入测试一年,很迷茫,觉得没啥好做的-- 测试在公司真的不受重视,我是不是去转型做开发会更好? 资深的测试架构师的发展路径是怎么样的?我平时该怎么学习? 我 ...
- 换到GitHub 博客了
觉得还是github上面的代码风格看起来舒服些,所以决定把blog搬到github上面去了.以后这里就作为一个放资料的地方吧. github地址:http://l34rner.github.io/
- 从租人APP沦为性工作发布平台 看共享经济监管边界
看共享经济监管边界" title="从租人APP沦为性工作发布平台 看共享经济监管边界"> 继直播类软件部分涉黄之后,最近火爆的各类"租人"软件 ...
- 软工 实验一 Git代码版本管理
实验目的: 1)了解分布式版本控制系统的核心机理: 2) 熟练掌握git的基本指令和分支管理指令: 实验内容: 1)安装git 2)初始配置git ,git init git status指令 3 ...
- C++扬帆远航——5(换分币)
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:huanfenbi.cpp * 作者:常轩 * 完成日期:201 ...
- Node REPL环境
1.概述 REPL全称Read,Eval,Print,Loop,简单理解为接收用户输入,执行用户输入,打印执行结果并输出到控制台,进行下一次轮回,可以进行一些简单的测试,类似于浏览器的控制台. 命令行 ...
- Python基础知识(day1)
day1 1.编码 ASCII码 1字节8位 2^8 = 256 位 万国码 unicode 4字节32位 #浪费空间 UTF-8 对unicode进行压缩 2.注释 单行注释 score = inp ...