spring原理

Spring核心详解!!!

元气小坏坏 提交于 2019-12-12 23:17:32
原创作者点击跳转 Spring核心详解!!! Spring出现的原因? Spring出现的原因 解除耦合 软件开发的开闭原则:通过多态实现,要么子类重写父类,要么增加方法 提高抽象层次; 提高抽象层次的方法 把子类对象赋给父类对象进行使用的动态多态 注入Injection:某一个类想要什属性,通过set方法给他 就叫注入 依赖注入 Depenency Injection =DI 有set就能活 没有就错误 配置文件(反射) Spring如何解除耦合 解耦合:首先解除逻辑耦合 mvc模式第一次解除了逻辑耦合 spring的IOC是进行深度解耦 日志:用来保持程序的健壮性,就是程序的运行记录 代理需要在jdk1.5以上版本使用 jdk代理是基于反射的没有反射就没有办法通用 调用代理类的的任何方法,都会执行到invoke方法 代理是模式 代理机制其实真正的代理的是方法 代理:proxy 代理的本质就是原产品不动,不做任何改变 要增值 要包装 代理分类: 一.静态代理:门面模式或装饰模式 缺点:需要为每一个被代理的方法都写一个代理方法,修改的时候特别值复杂,不灵活 二.动态代理 1.jdk动态代理:缺点:要想代理对象,被代理对象必须有接口,否侧不能代理 2.CGLIB代理:优点:在被代理类没有接口的情况下也能够被代理,实际就是为当前类生成一个子类 代理类和被代理类都需要实现同一个接口

Spring的两种动态代理:Jdk和Cglib 的区别和实现

早过忘川 提交于 2019-12-11 13:11:04
Spring的两种动态代理:Jdk和Cglib 的区别和实现 这是有意义的一天!自己研究一路畅通的感觉真爽 原理是参考大神的,代码手敲 一、原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用CGLIB实现AOP? (1)添加CGLIB库,SPRING_HOME/cglib/*.jar (2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/> JDK动态代理和CGLIB字节码生成的区别? (1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类 (2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 因为是继承,所以该类或方法最好不要声明成final 二、代码实现 用户管理接口 package com.lf.shejimoshi.proxy

SpringBoot 提示找不到配置的 bean

南楼画角 提交于 2019-12-11 11:26:58
SpringBoot 提示找不到配置的 bean 首先检查了新建的controller和mapper的包都在SpringbootShiroApplication类的同级目录下 检查了配置文件和绑定都没有错误 注解都在 并没有导错包 4.Maven 导包也没错 错误点 : 接口上 用 public 修饰 导致 spring找不到bean 有大佬解释一下原理吗? 来源: CSDN 作者: weixin_44606765 链接: https://blog.csdn.net/weixin_44606765/article/details/103484792

Spring事务原理源码剖析

烈酒焚心 提交于 2019-12-11 08:06:16
1. 数据库事务特性 1.1 ACID特性 事务(Transaction)是数据库系统中一系列操作的一个逻辑单元,所有操作要么全部成功要么全部失败。 事务是区分文件存储系统与Nosql数据库重要特性之一,其存在的意义是为了保证即使在并发情况下也能正确的执行crud操作。怎样才算是正确的呢?这时提出了事务需要保证的四个特性即ACID: A: 原子性(atomicity) ​ 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 C: 一致性(consistency) ​ 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 I: 隔离性(isolation) ​ 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 D: 持久性(durability) ​

Config层源码解析

孤者浪人 提交于 2019-12-10 13:11:01
通过上一遍文章 整体架构 中已经详细了描述了Dubbo框架的整体设计结构和调用流程,接下来,我还是深入源码,详细分析各个层的实现原理,这一篇主要讲述Config层。 由整体的设计可以知道,Config层抽象了外部配置,各个模块的配置都会在Config层来体现。先看一下它的核心实现为org.apache.dubbo.config.AbstractConfig和org.apache.dubbo.config.ArgumentConfig。 AbstractConfig结构图如下: 从上图可以看到,核心的模块配置都会继承AbstractConfig 。但是既然是配置,那么怎么读取这些配置呢? Dubbo基于Java注解的配置原理 @EnableDubbo是Dubbo使用注解初始化的核心注解,先看一下源码: /** * Enables Dubbo components as Spring Beans, equals * {@link DubboComponentScan} and {@link EnableDubboConfig} combination. * <p> * Note : {@link EnableDubbo} must base on Spring Framework 4.2 and above * * @author zhaodongchao * @see

Spring事务注解实现的原理

北战南征 提交于 2019-12-10 03:59:37
Spring事务注解是个典型的Spring AOP的注解。方法上面加上@Transactional,方法就有了事务的能力。 面试中:基于动态代理讲更多的东西。。。。 为什么呢?--->其实里面核心也是动态代理。 在一个使用了ProfitDetailService对象方法上面加入了@Transactional注解,正常来说我们导入的应该是ProfitDetailServiceImp对象,但是debug出来的缺失$Proxy22。太熟悉了,肯定想到代理模式里面的动态代理。准备跳坑,进入 final class JdkDynamicAopProxy implements AopProxy, InvocationHandler, Serializable {}。 JdkDynamicAopProxy为整个srpingAop的核心。JdkDynamicAopProxy 实现了InvocationHandler(业务上的增强器),初步猜测肯定要实现invoke()方法。调试之后,进入JdkDynamicAopProxy.java确实找到了invoke()。所有的springAOP都要经历invoke()。 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { ...........

一个缓存使用的思考:Spring Cache VS Caffeine 原生 API

与世无争的帅哥 提交于 2019-12-09 14:08:09
最近在学习本地缓存发现,在 Spring 技术栈的开发中,既可以使用 Spring Cache 的注解形式操作缓存,也可用各种缓存方案的原生 API。那么是否 Spring 官方提供的就是最合适的方案呢?那么本文将通过一个案例来为你揭晓。 Spring Cache Since version 3.1, the Spring Framework provides support for transparently adding caching to an existing Spring application. The caching abstraction allows consistent use of various caching solutions with minimal impact on the code. Spring Cache 和 slf4j、jdbc 类似,是由 Spring Framwork 提供的一个缓存抽象层,可以接入各种缓存解决方案来进行使用,通过 Spring Cache 的集成,我们只需要通过一组注解来操作缓存就可以了。目前支持的有 Generic 、 JCache (JSR-107) 、 EhCache 2.x 、 Hazelcast 、 Infinispan 、 Couchbase 、 Redis 、 Caffeine 、 Simple

spring-依赖注入的实现

霸气de小男生 提交于 2019-12-09 02:30:19
上一篇日志讲了依赖注入的思想和原理,这里总结一下spring中实现依赖注入的具体实现方式 1.原理 在spring中,所有的POJO都可以被声明,或者定义为一个组件,通过配置文件,自动扫描,java代码的方式,可以任意装配不同组件 2.方法 在spring中,装配组件的方式有三种,分别是自动装配,XML配置文件装配以及java代码中显示装配,而组件装配无非就是两个过程1.创建组件;2.装配组件 1.自动装配 创建组件 使用注解 @Component("组件名") 来创建组件 //飞行接口 package Test; public interface FlyBehavior { public void fly (); } //飞行方式具体类 package Test; import org.springframework.stereotype.Component; @Component ( "duckfly" ) public class DuckFly implements FlyBehavior { public void fly (){ System.out.println( "I am a duck ,I am flying" ); } } //鸭子接口 package Test; public interface BaseDuck { public void fly ();

Spring @RequestMapping 注解原理

我与影子孤独终老i 提交于 2019-12-09 02:25:32
经过一番百度和钻研,这是我对该注解的浅析 开发者(程序猿)需要在控制器内部为每一个请求动作开发相应的处理方法。@RequestMapping 注解类型指示Spring用哪一个类或方法处理请求动作,该注解可用于类和方法。 @RequestMapping可以用来注释一个控制器类,在这种情况下,所有方法都将映射为相对于类级别的请求,表示该控制器处理的所有请求都被映射到value属性所指示的路径下。示例代码如下: @Controller @RequestMapping(value="/user") public class UserController{   @RequestMapping(value="/register")   public String register(){     return “register”;   } @RequestMapping(value="/login")   public String login(){     return “login”;   } } 由于UserController类中加了value="/user"的@RequestMapping的注解,因此所有相关路径都要加上"/user",此时方法被映射到了如下请求URL(统一资源定位器): http://localhost:8080/user/register http:/

Spring MVC — @RequestMapping原理讲解-1

江枫思渺然 提交于 2019-12-09 02:19:47
为了降低文章篇幅,使得文章更目标化,简洁化,我们就不例举各种@RequestMapping的用法等内容了. 具体请点击查看 @RequestMapping的用法 文章主要说明以下问题: Spring怎样处理@RequestMapping(怎样将请求路径映射到控制器类或方法) Spring怎样将请求分派给正确的控制器类或方法 Spring如何实现灵活的控制器方法的 在Spring MVC 3.1 之前的版本中,Spring默认使用 DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter来处理 @RequestMapping注解和请求方法调用,而从3.1开始提供了一组新的API完成这些工作。相比之下,新的API更加的合理完善,开放,易拓 展,面向对象。这篇文章便是基于3.1的新API进行剖析的。 一、概念解析 在开始之前我们先了解下新的API中引入的新接口或者类,这会有助于后面的处理过程的理解。不得不说新的API提供了更多漂亮的抽象,你能感受到面向对象的魅力。 RequestMappingInfo 这个类是对请求映射的一个抽象,它包含了请求路径,请求方法,请求头等信息。其实可以看做是@RequestMapping的一个对应类。 HandlerMethod 这个类封装了处理器实例(Controller Bean)和