Advisor

sql

半世苍凉 提交于 2020-08-15 03:36:45
–1 CREATE DATABASE _2018522018; use _2018522018; year(getdate())-year(Sbirth) –2 create table Student ( Sno char(30) primary key, Sname char(30) unique, Ssex char(2) , Classno char(30), Sbirth datetime, Status char(4), Hometown char(30), Enrollment datetime, Telephone char(30), Resume char(80) ); create table SClass ( ClassNo char(30) primary key, ClassName char(15), Major char(10), Grade char(8), Number int, Advisor char(8) ); create table Course ( CourseNo char(30) primary key, CourseName char(30), Category char(30), Major char(30), Grade char(30), StartTM char(30), Credits int , WeekHours

理解Spring(二):AOP 的概念与实现原理

佐手、 提交于 2020-08-14 22:38:48
目录 什么是 AOP AOP 的基本术语 Spring AOP 的简单应用 Spring AOP 与动态代理 Spring AOP 的实现原理(源码分析) 扩展:为什么 JDK 动态代理要求目标类必须实现接口 什么是 AOP AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,它是对 OOP(Object Oriented Programming,面向对象编程)的一个补充。 OOP 允许我们通过类来定义对象的属性和行为,由于对象的行为是通过类中的方法来体现的,所以要想修改一个对象的行为,就必须修改类中相应的方法。试想这么一个场景,我们需要对某些对象的某些行为进行耗时统计,OOP 的做法只能是挨个去修改它们所属的类,在相应的方法上加入耗时统计的逻辑,如果只是针对少量几个行为的修改倒也无妨,但如果要统计的是成百上千个行为呢,挨个去修改这成百上千个方法就显得很拙劣,而且还会导致大量的代码重复,如果要统计的是第三方类库中的行为,那么 OOP 就显得更加力不从心了。 在实际开发中,除耗时统计之外,类似的还有日志记录、事务控制、权限验证等等,它们往往穿插在各个控制流中,被各个功能模块所调用,但它们却是与核心业务逻辑无关的。像这种穿插在各个功能模块中的且与核心业务无关的代码被称为横切(cross cutting)。 在传统 OOP 中

Spring事务(二)事务自定义标签

北慕城南 提交于 2020-08-14 20:53:17
摘要: 本文结合《Spring源码深度解析》来分析Spring 5.0.6版本的源代码。若有描述错误之处,欢迎指正。 目录 一、注册 InfrastructureAdvisorAutoProxyCreator 二、获取对应class/method的增强器 1. 寻找候选增强器 2. 候选增强器中寻找到匹配项 3. 提取事务标签 对于Spring中事务功能的代码分析,我们首先从配置文件开始人手,在配置文件中有这样一个配置:<tx:annotation-driven/>。可以说此处配置是事务的开关,如果没有此处配置,那么Spring中将不存在事务的功能。那么我们就从这个配置开始分析。 根据之前的分析,我们因此可以判断,在自定义标签中的解析过程中一定是做了一些辅助操作,于是我们先从自定义标签入手进行分析。 使用Idea搜索全局代码,关键字annotation-driven,最终锁定类TxNamespaceHandler,在TxNamespaceHandler中的 init 方法中: @Override public void init() { registerBeanDefinitionParser( "advice", new TxAdviceBeanDefinitionParser()); registerBeanDefinitionParser( " annotation

阿里P8级大师精品之作:Spring源码深度解读(IOC/AOP/MVC/事务)

我怕爱的太早我们不能终老 提交于 2020-08-14 13:30:20
对于大多数第一次看spring源码的人来说,都会感觉不知从哪开始看起,因为spring项目源码由多个子项目组成,如spring-beans,spring-context,spring-core,spring-aop,spring-web,spring-webmvc等 Spring底层到底要看什么?以下是大神整理的Spring源码深度解读学习笔记,总简直不要太好用,从理论到实战,每一步操作都有相应代码展示。给大家分享一下,希望可以对你掌握Spring有所帮助。祝大家前程似锦,Offer不断! 每个知识点都有左侧导航书签页,看的时候十分方便,由于内容较多,这里就截取一部分图吧。 需要的 直接点这里就可以免费拿到这份P8大师的精品之作:Spring源码深度解读 Spring源码笔记 Spring IOC 容器继承体系 BeanFactory(容器接口) XmlBeanFactory(基础容器实现) Resource接口体系 ApplicationContext接口(高级容器接口) ClassPathXmlApplicationContext(高级容器实现) Bean的注册 Bean的加载 循环依赖 实例——循环依赖 Spring AOP AOP术语 Advisor Advice BeanPostProcessor JDK动态代理与CGLIB代理 解析AOP标签 创建AOP代理

基于个人理解的springAOP部分源码分析,内含较多源码,慎入

荒凉一梦 提交于 2020-08-14 02:04:55
本文源码较多,讲述一些个人对spring中AOP编程的一个源码分析理解,只代表个人理解,希望能和大家进行交流,有什么错误也渴求指点!!!接下来进入正题 AOP的实现,我认为简单的说就是利用代理模式,对目标方法所在的类进行封装代理。请求目标方法时,是直接请求代理对象,再根据用户指定的通知(切点),在代理对象中进行操作,到了该使用目标方法的时候,调用代理对象中包装的真正目标方法完成,以实现面向切面编程,以下对两个问题进行一个分析: 代理对象什么时候被创建 切面类我们定义的切点信息是怎么加载的 找到在何处进行扫描 探究如何进行扫描 代理对象是什么时候被创建的? 这里是通过name来获取bean的情况,注意使用type的方式来获取bean进行调试,就会和本文有所出入 现在从Main方法出发 //1.创建IOC容器 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.从IOC中获取bean实例 ArithmeticCalculator arithmeticCalculator = (ArithmeticCalculator) ctx.getBean("arithmeticCalculatorImpl"); 我们进入getBean的代码查看

AOP原理解析

穿精又带淫゛_ 提交于 2020-08-11 04:54:50
MainConfigOfAOP.class /** * AOP: * 指在程序运行期间动态的将某段代码切入到指定方法指定位置运行的编程方式 * 1. 导入AOP模块:Spring aop,(Spring-aspects) * 2. 定义一个业务逻辑类(MathCalculator),在业务逻辑运行时将日志进行打印(方法之前、方法运行、方法之后、方法异常) * 3. 定义一个日志切面(LogAspect),切面里的方法要动态感知MathCalculator.div运行到哪 * 通知方法: * 前置通知(@Before):logStart:在目标方法(div)运行之前运行 * 后置通知(@After):logEnd:在目标方法(div)运行之后运行(正常结束和异常结束) * 返回通知(@Returning):logEnd:在目标方法(div)返回之后运行 * 异常通知(@AfterThrowing):logEnd:在目标方法(div)异常之后运行 * 环绕通知(@Around):动态代理,手动控制目标方法运行(joinPoint.proceed()) * 4. 给切面的方法标注何时何地运行 * 5. 将切面类和业务逻辑类都加入到容器中 * 6. 必须告诉Spring容器哪个类是切面类,在切面类加@Aspect注解 * 7. 使用@EnableAspectJAutoProxy注解开启 *

深入分析Spring之IOC之加载BeanDefinition案例详解

試著忘記壹切 提交于 2020-08-10 22:30:01
本文主要分析 spring 中 BeanDefinition 的加载,对于其解析我们在后面的文章中专门分析。 BeanDefinition 是属于 Spring Bean 模块的,它是对 spring bean 的统一抽象描述定义接口,我们知道在spring中定义bean的方式有很多种,如XML、注解以及自定义标签,同事Bean的类型也有很多种,如常见的工厂Bean、自定义对象、Advisor等等,我们在分析加载BeanDefinition之前,首先来了解它的定义和注册设计。 上面类图我们做一个简单介绍,具体详细介绍在后面的相关文章说明, 另外大家要 注意 : 除了本文讲的案例。我还整理了最新5套JAVA架构项目实战教程及大厂面试题库,需要的可以进裙 783802103,裙文件下,没基础勿进哦! AliasRegistry 为 Bean注册一个别名的顶级接口 BeanDefinitionRegistry 主要用来把bean的描述信息注册到容器中,spring在注册bean时一般是获取到bean后通过 BeanDefinitionRegistry 来注册当当前的 BeanFactory 中 BeanDefinition 是用来定义描述 Bean的名字、作用域、角色、依赖、懒加载等基础信息,以及包含与spring容器运行和管理Bean信息相关的属性

spring源码解析之AOP原理

雨燕双飞 提交于 2020-08-08 09:38:47
一、准备工作    在这里我先简单记录下如何实现一个aop: AOP:【动态代理】 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式; 1、导入aop模块;Spring AOP:(spring- aspects) 2 、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx) 3 、定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行; 通知方法: 前置通知(@Before):logStart:在目标方法(div)运行之前运行 后置通知(@After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束) 返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后运行 异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行 环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced()) 4 、给切面类的目标方法标注何时何地运行(通知注解); 5 、将切面类和业务逻辑类(目标方法所在类)都加入到容器中; 6 、必须告诉Spring哪个类是切面类

Spring AOP 源码解析:注解式切面增强机制

心已入冬 提交于 2020-07-28 20:13:53
Spring AOP 源码解析:注解式切面增强机制 IoC 和 AOP 被称为 Spring 两大基础模块,支撑着上层扩展的实现和运行。虽然 AOP 同样建立在 IoC 的实现基础之上,但是作为对 OOP(Object-Oriented Programing) 的补充,AOP(Aspect-Oriented Programming) 在程序设计领域拥有其不可替代的适用场景和地位。Spring AOP 作为 AOP 思想的实现,被誉为 Spring 框架的基础模块也算是实至名归。Spring 在 1.0 版本的时候就引入了对 AOP 的支持,并且随着版本的迭代逐渐提供了基于 XML 配置、注解,以及 schema 配置的使用方式,考虑到实际开发中使用注解配置的方式相对较多,所以本文主要分析注解式 AOP 的实现和运行机制。 注解式 AOP 示例 首先我们还是通过一个简单的示例演示一下注解式 AOP 的具体使用。假设我们声明了一个 IService 接口,并提供了相应的实现类 ServiceImpl,如下: public interface IService { void sayHello(); void sayHelloTo(String name); void sayByebye(); void sayByebyeTo(String name); } @Service public

【Spring】@Transactional 闲聊

时光总嘲笑我的痴心妄想 提交于 2020-07-28 19:35:28
菜瓜:上次的AOP理论知识看完收获挺多的,虽然有一个自定义注解的demo,但还是觉得差点东西 水稻:我也觉得没有跟一遍源码还是差点意思,这次结合@Transactional注解深入源码看一下 菜瓜:事务注解,这个平时用的挺多的 水稻:是吗?来看看你的基础咋样 要保证一个方法中多个数据库操作的原子性,要共用一个数据库连接,但是coding时我们不用显示传递连接对象,这是咋弄的? 如果一个方法里面只有查询操作,是否不用开启事务? 如何解决非事务方法调用本地事务方法失效的? 注解常用的传播属性,你知道他们的区别吗 菜瓜:虽然没看过源码,我大胆猜测一下 隐式传递连接对象可以将其封装到线程中,一般一次请求操作都是在一个线程中完成。使用ThreadLocal将连接和线程绑定 查询操作也得看业务场景,如果多次查询相同的数据要避免不可重复读问题,可开启只读事务 (readOnly = true) 结合AOP的知识,这里其实要解决调用事务方法的对象不是代理对象的问题。用代理对象调本地事务方法即可(注入自己) /** * @author QuCheng on 2020/6/24. */ @Service public class ItemServiceImpl implements ItemService { @Resource private IcbcItemMapper itemMapper;