cglib

Spring事务Transactional和动态代理(一)-JDK代理实现

你。 提交于 2020-04-18 05:59:13
系列文章索引: Spring事务Transactional和动态代理(一)-JDK代理实现 Spring事务Transactional和动态代理(二)-cglib动态代理 Spring事务Transactional和动态代理(三)-事务失效的场景 什么是代理 理设计模式提供了对目标对象的间接访问方式,能力模式能够解耦合并且便于扩展目标的功能。 在现实生活这,我们消费者如果要去购买一杯牛奶的时候,并不是直接去找牛奶厂商购买,而是在便利店或者超市购买(零售商);超市进货的时候也通常不是直接找牛奶厂商,而是找市级代理(渠道经销商),市级代理再找省级代理(代理商),省级代理从牛奶生产商(厂商)提货。 如下图,虽然通过层层代理,一杯牛奶的价格会有增加,但是用户省却了时间(用户不能跑到内蒙去买牛奶)。 静态代理 静态代理的实现比较简单,代理类通过实现与目标对象相同的接口,并在类中维护一个代理对象。通过构造器塞入目标对象,赋值给代理对象,进而执行代理对象实现的接口方法 public interface Person { void eat(); } public class Child implements Person { @Override public void eat() { System.out.println("A Child eats something"); } } public

Spring5源码深度分析(二)之理解@Conditional,@Import注解

被刻印的时光 ゝ 提交于 2020-04-18 04:42:47
代码地址: https://github.com/showkawa/spring-annotation/tree/master/src/main/java/com/brian 1.源码分析二主要分析的内容 1.使用@Condition多条件注册bean对象 2.@Import注解快速注入第三方bean对象 3.@EnableXXXX 开启原理 4.基于ImportBeanDefinitionRegistrar注册bean 5.基于FactoryBean注册bean对象 1.使用@Conditional多条件注册bean对象 conditional字面意思条件句,亦即满足某些条件将该类注册到IOC容器的意思 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @ interface Conditional { /** * All { @link Condition Conditions} that must { @linkplain Condition#matches match} * in order for the component to be registered. */ Class <? extends Condition

SpringBoot启动流程分析(六):IoC容器依赖注入

心已入冬 提交于 2020-04-18 04:09:03
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇:    Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一):SpringApplication类初始化过程 SpringBoot启动流程分析(二):SpringApplication的run方法 SpringBoot启动流程分析(三):SpringApplication的run方法之prepareContext()方法 SpringBoot启动流程分析(四):IoC容器的初始化过程 SpringBoot启动流程分析(五):SpringBoot自动装配原理实现 SpringBoot启动流程分析(六):IoC容器依赖注入 笔者注释版Spring Framework与SpringBoot源码git传送门:请不要吝啬小星星 spring-framework-5.0.8.RELEASE SpringBoot-2.0.4.RELEASE 一、前言   前面我们对IoC容器的初始化过程进行了详细的分析,这个初始化过程完成的主要工作是在IoC容器中建立BeanDefinition数据映射。在此过程中并没有看到IoC容器对Bean依赖关系进行注入,接下来分析一下IoC容器是怎样对Bean的依赖关系进行注入的。   前面在refresh()--

Spring事务Transactional和动态代理(三)-事务失效的场景

拜拜、爱过 提交于 2020-04-18 04:03:04
系列文章索引: Spring事务Transactional和动态代理(一)-JDK代理实现 Spring事务Transactional和动态代理(二)-cglib动态代理 Spring事务Transactional和动态代理(三)-事务失效的场景 一. Spring事务分类 Spring 提供了两种事务管理方式:声明式事务管理和编程式事务管理。 1.1编程式事务 在 Spring 出现以前,编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中显式调用 beginTransaction()、commit()、rollback() 等事务管理相关的方法,这就是编程式事务管理。 简单地说,编程式事务就是在代码中显式调用开启事务、提交事务、回滚事务的相关方法。 1.2声明式事务 Spring 的声明式事务管理是建立在 Spring AOP 机制之上的,其本质是对目标方法前后进行拦截,并在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。而Spring 声明式事务可以采用 基于 XML 配置 和 基于注解 两种方式实现 简单地说,声明式事务是编程式事务 + AOP 技术包装,使用注解进行扫包,指定范围进行事务管理。 本文内容是使用SpringBoot的开发的“基于注解”申明式事务管理,示例代码: https://github.com

AOP面试知识整理,^_^-包括spring Aop

二次信任 提交于 2020-04-18 01:53:20
讲到java企业级开发框架,就不可避免的讲到 IOC,AOP,MCV   今天面试时被问到AOP,讲的很乱,这里整理笔记,包括AOP,spring-AOP的部分知识,错误的地方请小伙伴指出来. 谈谈你对AOP的理解: AOP概念(Aspect-Oriented Programming): 即面向切面编程,与OOP(Object - Oriented Programming,面向对象编程)相辅相成,AOP的基本单元为Aspect(切面),Struts2 的拦截器设计就是基于AOP的思想。 AOP原理: 大型系统中的 通用的服务型的代码会穿插在各个业务类 ,方法中,随着系统规模的增大,会造成 大量的代码重复 ,,且与核心代码没有太多的关系。 系统中的业务可分为 核心关注点和横切关注点 , 核心关注点是业务处理的主要流程,横切关注点是与核心业务无关的通用业务。如日志权限 等,各个横切点离散的穿插与核心业务中。导致系统中的每一个模块代码都与这些业务具有很强的依赖性,当需要添加横切功能时,需要大幅修改已有的代码。 AOP即解决这个问题, 使用AOP框架,能够将这些影响多个类的通用性服务抽取出来,(即切面) ,并通过 配置的方式明确在那些位置插入这些服务, 系统运行后,AOP框架在指定的时机自动运行这些服务,从而达到核心业务逻辑和服务性逻辑分离的目的,减少了重复代码的

设计模式

北城余情 提交于 2020-04-17 20:08:28
代理模式介绍 代理模式提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以 在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 代理模式分为三类: 静态代理 动态代理 Cglib 代理 静态代理(不推荐) 介绍 要求目标对象和代理对象实现同一个接口 ,调用的时候调用代理对象的方法,从而达到增强的效果 优点: 可以在不修改目标对象的前提下,增强目标对象方法的功能(所有代理模式都可以实现,因此不推荐使用此方法) 缺点: ① 冗余。目标对象和代理对象实现同一个接口,会产生过多的代理类。 ② 不易维护。当接口方法增加,目标对象与代理对象都要进行修改。 代码实现 场景 :厂家生产了商品,但是没有足够的精力、人力去销售,这时候就需要一个代理商帮他售卖,但是代理商需要从中抽取 20% 的利润。 公共接口 public interface IProducer { void sale(float money); } 被代理对象 public class Producer implements IProducer { @Override public void sale(float money) { System.out.println("卖出产品,厂家获得" + money + "元"); } } 代理对象 public class ProxyProducer

coding++:Spring 中的 AOP 原理

▼魔方 西西 提交于 2020-04-17 07:12:00
【推荐阅读】微服务还能火多久?>>> 为什么使用 AOP 如下场景: 现在有一个情景: 我们要把大象放进冰箱,步骤为:打开冰箱->放入大象->关闭冰箱 如果再把大象拿出来,步骤为:打开冰箱->拿出大象->关闭冰箱 代码如下: public void put() { System.out.println( "打开冰箱..." ); System.out.println( "放入大象..." ); System.out.println( "关闭冰箱..." ); } public void get() { System.out.println( "打开冰箱..." ); System.out.println( "拿出大象..." ); System.out.println( "关闭冰箱..." ); } 我们需要在每一个拿进拿出操作前后都要进行打开冰箱和关闭冰箱的操作,造成了代码重复。 而如果要拿进拿出其他动物,那么每一个动物的操作都需要加入打开冰箱关闭冰箱的操作,十分繁琐混乱。 解决方法就是AOP,将这些打开冰箱和关闭冰箱的操作单独抽取出来,做成一个切面,之后调用任何方法,都插入到方法前后即可。 先来看一些基本概念再来解决这个问题。 基本概念: AOP 即Aspect Oriented Program, 面向切面编程 。 使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来

从代理模式到Spring AOP

匆匆过客 提交于 2020-04-17 04:28:09
【推荐阅读】微服务还能火多久?>>> 1、现实场景 场景: 小A要在丰台科技园租一个单间。 如果不使用房产中介,一般的流程是这样: 浏览广告 ---> 筛选房源 ---> 约见房东 ---> 鉴别真假 ---> 谈判签约 ---> 入住 小A的核心目标是租房,但在入住前他和大多数人一样都得亲自去筛选房源、约见房东、鉴别真假等,然而这些附加的任务并不是他们的专长,而且还浪费了精力。 如果使用正规中介,一般的流程是这样: 告知需求 ---> 中介处理 ---> 通知入住 用经济学的话来解释,就是“劳动分工,物尽其用,提高生产效率,维护社会稳定" , 在软件设计中的我们这样说“高内聚,低耦合,提高了开发效率,便于软件维护”。 2、Java代理模式 2.1、概念 Subject: 抽象主题,申明目标方法operation() RealSubject: 具体的主题,实现Subject,在operation()下完成具体的业务逻辑 Proxy: 代理,实现Subject,并引用RealSubject,在operation()中调用RealSubject的operation(),并在调用前后添加一些附加功能 2.2、Java模拟中介租房 下面使用Java代理模式来实现最上面的小A通过中介找房的场景: 租房Subject public interface Rent { /**租房*/ void

Java 动态代理机制

吃可爱长大的小学妹 提交于 2020-04-16 19:15:46
【推荐阅读】微服务还能火多久?>>> Java动态代理机制(参考上一篇的“基于xml文件的IOC配置案例”) 问题:大家有没有考虑过一件事呢?上面讲述的基于xml文件或者注解的IOC配置中持久层操作数据库的过程中没有事务的操作(完整的事务操作:开启事务、提交事务、回滚事务、释放资源)也能成功,那这是为何?(以转账的例子思索)原因很简单,就是每一次增删改查的操作都会获取一个连接,而相互之间没有任何的影响。那么如果在转账的过程中发生异常,数据库操作还会继续执行吗?答案是发生异常之前的数据库操作均可作数,异常之后的操作皆不可作数。这就不符合事务的第一特性——原子性(要么都成功,要么都失败) 为完善之前的代码,这里还需增加两个类——数据库连接类(需要和当前的线程绑定)和事务管理类 package com.mypro.utils; ​ import javax.sql.DataSource; import javax.xml.crypto.Data; import java.sql.Connection; ​ /** * 连接工具的类,用于从数据源获取一个连接,并实现和线程的绑定 */ public class ConnectionUtils { private ThreadLocal<Connection> tl = new ThreadLocal<> (); ​ private

spring AOP

我怕爱的太早我们不能终老 提交于 2020-04-13 16:51:28
【今日推荐】:为什么一到面试就懵逼!>>> 为什么要说动态代理: 动态代理可以实现为对象提供一种代理,以控制这个对象的访问。 我们通常会用到在执行一批操作之前,例如对数据库数据进行增删改,需要保证这一部分操作的完整性,如果出现问题需要回滚到操作之前的状态。而这样的操作在业务上有很多。 最简单粗暴的做法,就是在每一个方法调用之前先加载这一步安全控制方法。 代理模式正是做了这样一件事情,它实现被代理类的接口,并引入被代理类,我们调用UserManagerImpleProxy类来通过代理类实现添加的功能。 /* * 静态代理类 * 实现接口UserManager * 引入UserManagerImpl * */ public class UserManagerImplProxy implements UserManager { private UserManagerImpl userManagerImpl; // 构造方法 public UserManagerImplProxy(UserManagerImpl userManagerImpl) { this.userManagerImpl = userManagerImpl; } // 具体方法 public void addUser(String username, String password) { // 执行检查方法