中国智慧城市建设门户网站,市北区网站建设,视频直播网站开发流程,网站宣传的作用框架知识整理
SpringBoot、SpringMVC、Spring的区别和他们的作用#xff1f;
SpringBoot是一个微服务框架#xff0c;其简化了Spring应用的创建、运行、测试、部署。使开发人员无需过多的关注XML配置。里面整合了许多框架例如SpringMVC、Spring Security和Spring Data JPA。…框架知识整理
SpringBoot、SpringMVC、Spring的区别和他们的作用
SpringBoot是一个微服务框架其简化了Spring应用的创建、运行、测试、部署。使开发人员无需过多的关注XML配置。里面整合了许多框架例如SpringMVC、Spring Security和Spring Data JPA。并且内置了TomcatSpringMVC是web层的mvc框架用于处理响应请求获取表单参数进行表单校验等。是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架通过把ModelViewController分离将web层进行职责解耦把复杂的web应用分成逻辑清晰的几部分简化开发减少出错方便组内开发人员之间的配合。Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架目的是用于简化企业应用程序的开发它使得开发者只需要关心业务需求。常见的配置方式有三种基于XML的配置、基于注解的配置、基于Java的配置。
Spring的IOC和AOP
IOC
IOC控制反转把传统上由程序代码直接操控的对象的调用权交给了容器通过容器来实现对象组件的装配和管理。即对组件对象控制权的转移从程序代码本身转移到了外部容器。一个对象依赖的其它对象会通过被动的方式传递进来。最直观的表达就是IOC让对象的创建不用去new了可以由spring自动生产使用java的反射机制根据配置文件在运行时动态的去创建对象以及管理对象并调用对象的方法的。
作用管理对象的创建和依赖关系的维护解耦由容器去维护具体的对象托管了类的生产过程。优点将对象之间的相互依赖关系交给Ioc容器来管理并由IOC容器完成对象的注入这样可以很大程度上简化应用的开发。Ioc就像一个工厂一样需要创建对象只需要配置好文件或者注解即可。完全不用考虑对象是怎么创建出来的。 初始化过程XML-》Resource-》BeanDefinition-》BeanFactorySpring的IOC有三种注入方式 构造器注入、setter方法注入、根据注解注入。
AOP
AOP面向切面编程能够将那些与业务无关却为业务模块所共同调用的逻辑或责任例如事务处理、日志管理、权限控制等封装起来便于减少系统的重复代码降低模块间的耦合度并有利于未来的可扩展性和可维护性。如果没有AOP的话在做一些日志管理可能需要给每个方法都加上日志处理如果我们需要进行一些修改的逻辑就必须得一个一个来。通过AOP的动态代理可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块然后在指定位置插入这些功能。这样的思想被称为面向切面编程亦即AOP。
基于动态代理实现如果要代理的对象实现了某个接口那么Spring AOP就会使用JDK动态代理去创建代理对象。对于没有实现接口的对象无法使用JDK动态代理则转为使用CGlib动态代理生成一个被代理对象的子类在作为处理。AspectJ也是一个AOP框架是静态代理的增强所谓静态代理就是AOP框架会在编译阶段生成AOP代理类因此也称为编译时增强他会在编译阶段将AspectJ(切面)织入到Java字节码中运行的时候就是增强之后的AOP对象。静态代理与动态代理的区别就是生成AOP代理对象的时机不同一个是编译期另一个是运行期。静态代理性能较好但需要特定的编译器进行处理。AOP的动态代理 JDK的动态代理只提供接口的代理不支持类的代理。核心InvocationHandler接口和Proxy类InvocationHandler通过invoke()方法反射来调用目标类的代码动态的将横切逻辑和业务编织在一起。接着Proxy利用InvocationHandler动态创建一个符合某一接口的实例生成目标类的代理对象。如果代理类没有实现InvocationHandler接口那么Spring AOP会选择使用CGLibCode Genreation Library来动态代理目标类。CGLib是一个代码生成的类库可以在运行时动态的生成指定类的一个子类对象并覆盖其中特定方法并添加增强代码从而实现AOP。CGLib是使用继承的方式做的动态代理因此如果某个类被标记为final那么其无法使用CGLib进行动态代理。
AOP的相关概念
通知advise用于描述切面的目标即切面必须要完成的工作通知定义了切面是什么以及何时使用。有五种前置通知、后置通知、返回通知、异常通知、环绕通知。切点pointcut一个切面并不需要通知应用的所有连接点切点有助于缩小切面所通知的连接点范围。如果通知定义了切面的何时和什么则切点就是定义了何地。即定义了需要执行在哪些连接点上执行通知。切面Aspect通知和切点的结合通知和切点共同定义了切面的全部内容是什么在何时和在何处完成其功能。连接点join point在应用执行过程中能够插入切面的一个点这个点可以是调用方法时抛出异常时修改一个字段时。切面代码利用这些点插入到应用的政策流程之中并添加新的行为引入Introduction允许我们向现有的类添加新方法或属性。织入Weaving把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中在目标对象的生命周期中有很多个点可以进行织入 编译期切面在目标类编译时被织入。这种方式需要有特殊的编译器。类加载期切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器它可以在目标类被引入应用之前增强该目标类的字节码。运行期切面在应用运行的某个时刻被织入。一般情况下在织入切面时AOP容器会为目标对象动态的创建一个代理对象。
什么是依赖注入DI
依赖注入DI指的是组件之间的依赖关系由容器在运行期决定即由同期动态的将某个依赖关系注入到组件之中。依赖注入的目的是为了提升组件重用的频率并为系统搭建一个灵活、可扩展的平台以及对类的解耦。
IOC的一个重点是在系统运行中动态的向某个对象提供它所需要的其他对象这一点就是通过依赖注入实现的。
例ClassA中用到了ClassB的对象b一般情况下需要在A的代码中显示的new出来一个B的对象。采用依赖注入技术之后A的代码只需要定义一个私有的B对象不需要直接new来获得这个对象而是通过相关的容器控制程序来将B的对象在外部new出来并注入到A来的引用中。
依赖注入与控制反转的区别是依赖注入更倾向于实现而控制反转更倾向于一个法则。
控制反转创建对象实例的控制权从代码控制剥离到IOC容器控制。依赖注入创建对象实例时为这个对象注入属性值或其他对象的实现。
注入的方式
构造器注入、字段注入
Spring中Bean的作用域
作用域限定了Spring Bean的作用范围在Spring配置文件定义Bean时通过声明scope配置项可以灵活定义Bean的作用范围。
singleton单例唯一bean实例IOC只会创建并返回一个bean。Spring中的bean默认都是单例的。prototype原型每次请求都会创建一个新的bean实例。request只有HTTP请求才会创建每一次请求都会创建一个新的bean该bean只在当前HTTP request内有效适用于WebApplicationContext环境。session只有HTTP请求才会创建每一次请求都会创建一个新的bean该bean只在当前HTTP session内有效。global-session全局session作用域Spring5中没有。
Spring中单例Bean的线程安全问题
单例Bean存在线程安全问题当前多个线程操作同一个对象的时候对该对象的非静态成员变量的写操作会发生线程安全问题。
解决方案
把bean的作用域改成prototype在类或接口上加上Scope(“prototype”)表示每次调用该接口都会生成一个新的Bean。在类中定义一个TreadLocal成员变量将不安全的可变成员变量保存在ThreadLocal中。TreadLocal意味每一个线程提供一个独立的变量副本从而隔离了多个线程对数据的访问冲突因为每一个线程都有自己的变量副本。
Spring中Bean的生命周期 实例化BeanSpring启动查找并加载需要被Spring管理的bean进行Bean的实例化。 对于BeanFactory容器当客户向容器请求一个尚未初始化的bean时或初始化bean的时候需要注入另一个尚未初始化的依赖时容器就会调用createBean进行实例化。对于ApplicationContext容器当容器启动结束后便实例化所有的bean。容器通过获取BeanDefinition对象中的信息进行实例化并且只是简单的实例化并没有完成依赖注入。实例化Bean被包装在BeanWrapper中BeanWrapper提供了设置对象属性的接口从而避免了使用反射机制设置属性。 设置Bean属性Bean实例化后对将Bean的引入和值注入到Bean的属性中。Spring根据BeanDefinition中的信息和BeanWrapper提供的设置属性接口进行依赖注入。 注入Aware接口检测该对象是否实现了xxxAware接口并将相关的接口注入给Bean。 如果Bean实现了BeanNameAware接口的话Spring将Bean的Id传递给setBeanName()方法如果Bean实现了BeanFactoryAware接口的话Spring将调用setBeanFactory()方法将BeanFactory容器实例传入。如果Bean实现了ApplicationContextAware接口的话Spring将调用Bean的setApplicationContext()方法将bean所在应用上下文引用传入进来。 进行自定义处理当经过上述的步骤后Bean已经被正确的构造如果想要对象被使用前添加一些自定义的处理通过BeanPostProcessor接口实现。 postProcessBeforeInitialzation( Object bean, String beanName ) 当前正在初始化的bean对象会被传递进来我们就可以对这个bean作任何处理。 这个函数会先于InitialzationBean执行因此称为前置处理。 所有Aware接口的注入就是在这一步完成的。postProcessAfterInitialzation( Object bean, String beanName ) 当前正在初始化的bean对象会被传递进来我们就可以对这个bean作任何处理。 这个函数会在InitialzationBean完成后执行因此称为后置处理。 InitializingBean与init-method 如果Bean实现了InitializingBean接口Spring将调用他们的afterPropertiesSet()方法。类似的如果bean使用init-method声明了初始化方法该方法也会被调用。Spring为了降低对客户代码的侵入性给bean的配置提供了init-method属性该属性指定了在这一阶段需要执行的函数名。Spring便会在初始化阶段执行我们设置的函数。init-method本质上仍然使用了InitializingBean接口。可以重写这些方法 DisposableBean和destroy-method 和init-method一样通过给destroy-method指定函数就可以在bean销毁前执行指定的逻辑。 可以重写这些方法
Spring框架中用到的设计模式
工厂模式通过BeanFactory和ApplicationContext来创建bean对象。代理模式Spring AOP的实现。单例模式Spring中的bean默认都是单例的。 减少了新生成实例的消耗Spring通过反射或者CGLIB动态代理去生成bean都是很耗性能的操作给对象分配内存也会涉及复杂的算法。减少jvm的垃圾回收由于不会给每个请求都新生成bean实例所以自然回收的对象就少了。单例获取bean操作除了第一次生成之外其余都是从缓存里获取。 模板方法模式Spring中的jdbcTemplate、hibernateTemplate等以Template结尾的对数据库进行操作的类。观察者模式定义对象见一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都会得到通知被制动更新如Spring中listener的实现–ApplicationListener。Spring事件模型。适配器模式Spring AOP的增强或通知Advice使用到了适配器模式、Spring MVC中也是用到了适配器模式适配Controller。
Spring中的事务
事务逻辑上的一组操作组成这组操作的各个逻辑单元要么一起成功要么一起失败。
事务管理方式
编程式事务在代码中硬编码TransactionTemplate不推荐声明式事务在配置文件中配置分为基于XML的声明式事务和基于注解的声明式事务。是建立在AOP上的本质通过AOP功能对方法前后进行拦截将事务处理的功能编织到拦截的方法中。即在目标方法开始之前加入一个事务在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务的最大优点就是不需要在业务逻辑代码中掺杂事务管理的代码只需要在配置文件中做相关的配置或通过Transactional注解便可以将事务规则应用到业务逻辑中。唯一不足的是最细粒度只能到方法级别而不能像编程式事务到代码块的级别。
事务的传播
当多个事务同时存在的时候Spring如何处理这些事务的行为
PROPAGETION_REQUIRED如果当前没有事务就创建一个新的事务如果有事务则加入该事务。是最常见的设置。PROPAGATION_SUPPORTS支持当前事务如果当前存在事务就加入该事务如果当前不存在事务就以非事务执行。PROPAGATION_MANDATORY支持当前事务如果当前存在事务就加入该事务如果当前不存在事务就抛出异常。PROPAGATION_REQUIRES_NEW创建新事务无论当前存不存在事务都创建新事务。PROPAGATION_NOT_SUPPORTED以非事务方式执行操作如果当前存在事务就把当前事务挂起。PROPAGATION_NEVER以非事务方式执行如果当前存在事务则抛出异常。PROPAGATION_NESTED如果当前存在事务则在嵌套事务内执行。如果当前没有事务则按REQUIRED属性执行。
Spring的通知机制
前置通知Before advice在某连接点join point之前执行的通知但这个通知不能阻止连接点前的执行除非它抛出一个异常。返回后通知After returning advice在某连接点join point正常完成后执行的通知例如一个方法没有抛出任何异常正常返回。抛出异常后通知After throwing advice在方法抛出异常退出时执行的通知。后通知After (finally) advice当某连接点退出的时候执行的通知不论是正常返回还是异常退出。环绕通知Around Advice包围一个连接点join point的通知如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。 环绕通知是最常用的一种通知类型。大部分基于拦截的AOP框架例如Nanning和JBoss4都只提供环绕通知。
Spring的三级缓存与循环依赖
Spring在启动的过程中使用到了三个map称为三级缓存。
singletonObjects一级缓存earlySingletonObjects二级缓存singletonFactories三级缓存
Spring的启动过程
加载配置文件解析配置文件转化beanDefination获取到bean的所有属性、依赖及初始化用到的各类处理器等创建beanFactory并初始化所有的单例bean注册所有的单例bean并返回可用的容器一般为扩展的applicationContext
一级缓存
在启动过程的第三步创建beanFactory并初始化所有单例bean中所有单例的bean初始化完成后会存放在一个Map(singletonObjects)中beanName为key单例bean为value。这就是一级缓存
在第三步单例bean初始化的过程如下 bean标记为创建中 new出bean对象 如果支持循环依赖则生成三级缓存可以提前暴露bean 填充bean属性解决属性依赖 初始化bean处理Aware接口并执行各类bean后处理器执行初始化方法如果需要生成aop代理对象 如果之前解决了aop的循环依赖则缓存中放置了提前生成的代理对象然后使用原始bean继续执行初始化所以需要再返回最终bean前把原始bean置换为代理对象返回。 此时bean已经可以被使用进行bean注册并注册销毁方法 将bean放入容器中一级缓存移除创建中标记及二三级缓存
循环依赖问题
假设初始化A时发现A依赖于B即A初始化到了第2步此时B还没有初始化则需要暂停A去初始化B那么此时需要一个可以标记A创建中的Map提前的暴露正在创建的bean提供给其他的bean依赖。如果在初始化A所依赖的bean B时发现B也需要注入一个A的依赖则B可以从创建中的beanMap中直接获取A创建中对象去注入然后完成B的初始化返回给正在注入属性的A最终A也完成初始化。
如果配置不允许循环依赖就用不到上述缓存了。一般来说复杂的的业务例如一个service中需要注入其他的serviceservice互相引用就会出现循环依赖。所以出现循环依赖就去解决不出现就不解决虽然支持循环依赖但是只有在出现循环依赖时才真正暴露早期对象否则只暴露一个获取bean的方法并没有真正暴露bean因为这个方法不会被执行到。这块的实现就是三级缓存只缓存了一个单例bean工厂。
这个bean工厂不仅可以暴露早期bean还可以暴露代理bean如果存在aop代理则依赖的应该是代理对象而不是原始的bean。
二级缓存
三级缓存中提到的出现循环依赖才去解决也就是说出现循环依赖时才会执行工厂的getObject生成获取早期的依赖这个时候就需要给它换个地方存储了因为暴露的不是工厂而是对象所以需要使用一个新的缓存去保存暴露的早期对象earlySingletonObjects同时移除提前暴露的工厂也不需要在多重循环依赖时每次去执行getObject。
Spring Bean的自动装配
Spring中对象无须自己查找或者创建与其关联的其他对象由容器负责把需要相互协作的对象引用赋给各个对象。
基于xml no默认的方式是不进行自动装配通过手动设置ref属性来进行装配BeanBean依赖关系必须通过property元素定义byName根据属性名自动装配。BeanFactory查找容器中的全部Bean找出id与属性的setter方法入参匹配的Bean。byType表示根据property的数据类型进行自动装配。BeanFactory查找容器中的全部Bean。 如果正好有一个与依赖属性类型相同的Bean就自动装配这个属性。如果有多个这样的BeanSpring无法决定注入哪个Bean就抛出一个UnsatisfiedDependencyException异常。如果没有匹配的Bean就什么都不会发生属性不会被设置。 constructor使用构造方法完成对象注入其实也是根据构造方法的参数类型进行对象查找相当于采用byType的方式。即Spring会寻找与参数数据类型相同的bean通过构造函数将其注入。default表示默认采用上一级标签的自动装配的取值。如果存在多个配置文件的话那么每一个配置文件的自动装配方式都是独立的。 基于注解Autowired 使用Autowired注解之前需要在Spring配置文件进行配置context:annotation-config /在启动Spring时容器自动装在了一个AutowiredAnnotationBeanPostProcessor后置处理器当容器扫描到AutowiredResource或者Inject时就会在IOC容器自动查找需要的bean并装配给该对象属性。使用Autowired首先会在容器中查询对应类型的bean类型就是bean class名称就是bean id 如果查询结果刚好为一个就将该bean进行装配。如果查询结果不止一个那么Autowired会根据名称来查找。如果查不到则抛出异常解决方法就是Autowired(required false) Autowired可用于构造函数成员变量setter方法。开发中也用在service或者mapper接口上
注意Autowired和Resource之间的区别
Autowired默认是按照类型装配注入的查询到多个结果会按照名称来查找。默认情况下它要求依赖对象必须存在可以设置它required属性为false。Resource默认是按照名称来装配注入的只有当找不到与名称匹配的bean才会按照类型来装配注入。
Component和Bean的区别
作用对象不同Component作用于类而Bean作用于方法 Component注解通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中我们可以使用ComponentScan注解定义要扫描的路径。 Bean注解通常是在标有该注解的方法中定义产生这个bean告诉Spring这是某个类的实例当我需要用它的时候还给我。Bean注解比Component注解的自定义性更强而且很多地方只能通过Bean注解来注册bean。比如当引用第三方库的类需要装配到Spring容器的时候就只能通过Bean注解来实现。 例如 Configuration
public class AppConfig {Beanpublic TransferService transferService() {return new TransferServiceImpl();}
}等价于 beansbean idtransferService classcom.hty.TransferServiceImpl/
/beans如果说一个方法中有switch语句且其中调用了其他的方法用Component是无法实现的。
将一个类声明为Spring的bean的注解有哪些
一般使用Autowired注解去自动装配bean而想要把一个类标识为可以用Autowired注解自动装配的bean可以采用以下的注解实现。
Component通用可标注任意类为Spring的Bean如果一个类不知道属于哪一个层可以使用Component注解标注。Component一般用于各种组件中。Repository对应DAO层主要用于数据库的相关操作。Service对应服务层主要涉及一些复杂的业务逻辑需要用到DAO层。Controller对应Spring MVC的控制层主要用于接受用户的请求并调用Service层的方法返回数据给前端页面。Configuration标注一个类是配置类用来替换XML。
Required和Qualifier
Required表明bean的属性必须在配置的时候进行配置通过一个bean定义的显示属性值或者通过自动装配没有则抛异常BeanInitializationException。
Qualifier在Controller中需要注入service如果该service有多个实现类如何区分开这两个impl呢就用该注解表明即可。
*SpringMVC的执行流程
用户发送请求到前端控制器DispatcherServlet。DispatcherServlet收到请求后调用HandlerMapping处理器映射器请求获取Handler。HandlerMapping根据请求url找到具体的处理器生成处理器对象及处理器拦截器有则生成一并返回给DispatcherServlet。DispathcerServlet调用HandlerAdapter处理器适配器。HandlerAdapter经过适配调用具体的HandlerController进行执行Handler执行完成返回ModelAndView给DispatcherServlet。DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析。ViewResolver解析后返回具体的View给DispatcherServlet。DispatcherServlet对View进行渲染视图将模型数据填充到视图中然后响应用户。
SpringMVC的主要组件
前端控制器DispatcherServlet接受请求、响应结果。相当于转发器处理器映射器HandlerMapping根据请求的URL来查找Handler处理器适配器HandlerAdapter负责执行Handler视图解析器ViewResolver进行视图的解析根据视图逻辑名解析成真正的View视图ViewJSPThymeleaf
SpringMVC解决了什么问题
SpringMVC是一个基于MVC的框架主要解决了前端页面和后台代码分离的问题以及一个请求对应一个方法。
SpringMVC如何重定向和转发如何解决乱码
转发返回值前面加forward
重定向返回值前面加redirect
POST配置一个CharacterEncodingFilter过滤器设置成utf-8
GET修改tomcat配置文件添加编码与工程编码一致
SpringMVC的控制器是否单例有什么问题如何解决
是单例在多线程下会有线程安全的问题。不要直接在Controller中写同步逻辑而是在具体的Service中写不要在Controller层中写字段。
SpringMVC开发常用注解
RequestMapping用于处理请求url映射的注释可用于类或者方法上。用于类上则表示类中所有的响应请求方法都是以该地址作为父路径。
value指明请求的实际地址例如value “/list”。其中如果是以数组的形式则表示多个请求映射到一个方法上。也可以以正则表达式的形式。method指明请求的方法类型例如GET、POST、DELETE、PUT等。params指定请求地址中必须包含某些参数值才让该方法处理。可以有多个值并且支持与非或运算。consumes指定处理请求的提交内容类型Content-Type例如application/jsontext/html等。produces指定返回的内容类型仅当request请求头中的Accept类型中包含该指定类型才返回。headers指定request中必须包含某些指定的header值才能让该方法处理请求。
PathVariable将URL中的占位符参数绑定到方法的参数上例如RequestMapping(“show5/{id}/{name}”) 用该注解可以获取。
RequestParam将URL中后面的参数绑定到方法的参数上例如一urllocalhost:8080/hty?namehty 使用该注解可以获取如果不确定后面有无参数可以加个required false。
RequestBody实现接受HTTP请求的JSON数据用于方法参数上。只能用于PostMapping
ResponseBody将controller方法对象转换为json对象响应给前端
RestControllerResponseBody Controller即所有的方法默认返回json
GetMapping方法返回对应的请求是GETPOSTDELETEPUT同理少用
SpringBoot循环依赖
循环依赖是什么
Bean A 依赖 BBean B 依赖 A这种情况下出现循环依赖即Bean A → Bean B → Bean A。
更复杂的间接依赖造成的循环依赖如下Bean A → Bean B → Bean C → Bean D → Bean E → Bean A。当存在该依赖的时候Spring加载Bean时无法决定先创建哪个Bean而产生异常。如何解决
进行代码重构在配置文件中给相互依赖的两个bean中任意一个加上lazy-init属性在注入的bean的Autowire注解后加入Lazy注解使用Setter/Field注入给Bean A中的setterB加Autowired使用PostConstruct三级缓存 A执行doGetBean、查询缓存、createBean创建实例实例化完成放入三级缓存singleFactories中接着执行populateBean方法装配属性但是发现有一个属性时B的对象此时调用B的doGetBean、查询缓存、createBean去创建实例实例化完成之后放入三级缓存singleFactories中执行populateBean装配属性但是此时又发现有一个属性是A的对象。此时调用doGetBean来创建A的实例但是执行到getSingleton查询缓存的时候从三级缓存中查询到了A的实例此时直接返回A不用执行后续的流程去创建A了此时B完成了属性装配此时完整的B对象放入以及缓存singletonObjects中。B创建完成了A自然完成了属性装配也创建完成放入了一级缓存singletonObjects中
MyBatis优点
减少代码量上手简单。不会对应用程序或者数据库的现有设计造成影响SQL写在XML里从程序代码中彻底分离降低了耦合度。提供XML标签支持编写动态SQL语句。提供映射标签支持对象与数据库的ORM字段关系映射。
MyBatis中#{}和${}的区别是什么
#{}是预编译处理而${}是字符串替换。Mybatis在处理#{}时会将sql中的#{}替换为?号调用PreparedStatement的set方法来赋值。Mybatis在处理时把{}时把时把{}替换成变量的值。使用#{}能有效地防止SQL注入提高系统的安全性。
xml映射文件和Mapper接口工作原理是什么
接口的全限定名就是映射文件中的namespace值接口的方法名就是映射文件中Mapper的Statement的id接口方法参数就是传给sql的参数。Mapper接口没有实现类当调用接口方法时接口全限定类名方法名拼接成字符串作为key值可以唯一定位一个MapperStatement。 在Mybatis中每一个、、、标签都会被解析为一个MapperStatement对象。Mapper接口里的方法是不能重载的因为是使用 全限名方法名 的保存和寻找策略。Mapper 接口的工作原理是JDK动态代理Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy代理对象会拦截接口方法转而执行MapperStatement所代表的sql然后将sql执行结果返回。
Mybatis的一二级缓存
MyBatis的缓存在执行一次SQL查询或者SQL更新之后这条SQL语句并不会消失而是被MyBatis缓存起来当再次执行相同的SQL语句就会直接从缓存中进行提取而不是再次执行SQL。其中MyBatis分一级二级缓存一级是sqlSession级别的二级是表级别的一个mapper一个缓存。
一级缓存基于 PerpetualCache 的 HashMap 本地缓存其存储作用域为 sqlSession当 Session flush 或 close 之后该 Session 中的所有缓存清空默认打开一级缓存。
在同一个SqlSession中, Mybatis 会把执行的方法和参数通过算法生成缓存的键值将键值和结果存放在一个Map中如果后续的键值一样则直接从 Map 中获取数据不同的SqlSession之间的缓存是相互隔离的用一个SqlSession可以通过配置使得在查询前清空缓存任何的UPDATEINSERTDELETE语句都会清空缓存。失效的情况 sqlSession不同即使SQL语句相同依然会执行两次。sqlSession相同但查询条件不同。sqlSession相同查询条件也相同但两次查询之间执行了增删改操作清空缓存。sqlSeesion对象相同两次查询条件相同中间无增删改但是调用了clearCache()方法。 MyBatis认为对于两次查询如果以下条件都完全一样那么就认为它们是完全相同的两次查询。 传入的statementId。查询时要求的结果集中的结果范围.这次查询所产生的最重要传递给PreparedStatement的SQL语句字符串以及要设置的参数值。
二级缓存多个sqlSession需要共享缓存则需要开启二级缓存开启二级缓存后会使用CachingExecutor装饰Executor进入一级缓存的查询流程前先在CachingExecutor进行二级缓存的查询。 二级缓存默认是不开启的需要手动开启实现二级缓存MyBatis要求返回的POJO必须是可序列化的开启二级缓存需要在MyBatis的配置文件中进行配置 settingssetting name cacheEnabled value true /
/settings开启二级缓存还需要在Mapper的XML配置文件中加入标签。 失效条件 第一次SqlSession未提交此时SQL语句产生的查询结果还没有放入二级缓存中此时第二次SqlSession在查询的时候是感受不到二级缓存的存在的。如果出现了UPDATE、INSERT、DELETE操作缓存将被清空
慎用缓存多表操作下在某张表中做了刷新缓存的操作在另一张表中的缓存是仍然有效的这样会导致查询结果不正确。
MyBatis执行过程
读取Mybatis配置文件mybatis-config.xml为Mybatis的全局配置文件配置了MyBatis的运行环境等信息例如数据库连接信息加载映射文件SQL映射文件该文件中配置了操作数据库的SQL语句需要在MyBatis配置文件中加载构造会话工厂SqlSessionFactory通过MyBatis的环境等配置信息构建创建会话对象由SqlSessionFactory来创建SqlSession对象该对象中包含了执行SQL的所有方法Executor执行器Mybatis底层定义了一个Executor接口来操作数据库它根据SqlSession传递的参数动态的生成需要执行的SQL语句同时负责查询缓存的维护MappedStatement对象在Executor接口的执行方法中有一个MappedStatement类型的参数该参数是对映射信息的封装用于存储要映射的SQL语句的id、参数等信息输入参数映射输入参数类型可以使Map、List等集合类型也可以是基本数据类型和POJO类型。该过程类似JDBC对preparedStatement对象设置参数的过程输出结果映射
在mapper中如何传递多个参数 顺序传参即#{0} #{1} Param注解传参法 Map传参法 Java Bean传参法 select idselectUser parameterTypecom.hty.pojo.User resultMapUserResultMapRESTful
一种网络应用程序的设计风格和开发方式基于HTTP可以使用XML或者JSON格式定义。
每一个URI代表一种资源客户端使用GET、POST、PUT、DELETE四个操作方式对服务端的资源进行操作。GET用来获取、POST用来新建或者更新、PUT用来更新、DELETE用来删除资源 文章转载自: http://www.morning.lcbt.cn.gov.cn.lcbt.cn http://www.morning.huayaosteel.cn.gov.cn.huayaosteel.cn http://www.morning.fglyb.cn.gov.cn.fglyb.cn http://www.morning.wmyqw.com.gov.cn.wmyqw.com http://www.morning.xlwpz.cn.gov.cn.xlwpz.cn http://www.morning.mftdq.cn.gov.cn.mftdq.cn http://www.morning.rkwwy.cn.gov.cn.rkwwy.cn http://www.morning.ghwdm.cn.gov.cn.ghwdm.cn http://www.morning.xxgfl.cn.gov.cn.xxgfl.cn http://www.morning.phlrp.cn.gov.cn.phlrp.cn http://www.morning.rhsg.cn.gov.cn.rhsg.cn http://www.morning.tphjl.cn.gov.cn.tphjl.cn http://www.morning.qpfmh.cn.gov.cn.qpfmh.cn http://www.morning.shnqh.cn.gov.cn.shnqh.cn http://www.morning.zlgth.cn.gov.cn.zlgth.cn http://www.morning.bchgl.cn.gov.cn.bchgl.cn http://www.morning.ryysc.cn.gov.cn.ryysc.cn http://www.morning.fwblh.cn.gov.cn.fwblh.cn http://www.morning.xznrk.cn.gov.cn.xznrk.cn http://www.morning.ynwdk.cn.gov.cn.ynwdk.cn http://www.morning.darwallet.cn.gov.cn.darwallet.cn http://www.morning.grpfj.cn.gov.cn.grpfj.cn http://www.morning.ydryk.cn.gov.cn.ydryk.cn http://www.morning.tsgxz.cn.gov.cn.tsgxz.cn http://www.morning.wpqcj.cn.gov.cn.wpqcj.cn http://www.morning.sgnjg.cn.gov.cn.sgnjg.cn http://www.morning.kyjyt.cn.gov.cn.kyjyt.cn http://www.morning.qwyms.cn.gov.cn.qwyms.cn http://www.morning.mdfxn.cn.gov.cn.mdfxn.cn http://www.morning.hxrg.cn.gov.cn.hxrg.cn http://www.morning.rnpnn.cn.gov.cn.rnpnn.cn http://www.morning.stfdh.cn.gov.cn.stfdh.cn http://www.morning.lhrxq.cn.gov.cn.lhrxq.cn http://www.morning.cflxx.cn.gov.cn.cflxx.cn http://www.morning.bfycr.cn.gov.cn.bfycr.cn http://www.morning.jngdh.cn.gov.cn.jngdh.cn http://www.morning.fmry.cn.gov.cn.fmry.cn http://www.morning.zdbfl.cn.gov.cn.zdbfl.cn http://www.morning.divocn.com.gov.cn.divocn.com http://www.morning.kjmcq.cn.gov.cn.kjmcq.cn http://www.morning.ysdwq.cn.gov.cn.ysdwq.cn http://www.morning.pqkgb.cn.gov.cn.pqkgb.cn http://www.morning.wctqc.cn.gov.cn.wctqc.cn http://www.morning.rdtp.cn.gov.cn.rdtp.cn http://www.morning.kmlmf.cn.gov.cn.kmlmf.cn http://www.morning.bryyb.cn.gov.cn.bryyb.cn http://www.morning.xbyyd.cn.gov.cn.xbyyd.cn http://www.morning.jsljr.cn.gov.cn.jsljr.cn http://www.morning.nbqwt.cn.gov.cn.nbqwt.cn http://www.morning.hhfwj.cn.gov.cn.hhfwj.cn http://www.morning.rdzgm.cn.gov.cn.rdzgm.cn http://www.morning.bfmrq.cn.gov.cn.bfmrq.cn http://www.morning.jcbmm.cn.gov.cn.jcbmm.cn http://www.morning.wnhsw.cn.gov.cn.wnhsw.cn http://www.morning.lgxzj.cn.gov.cn.lgxzj.cn http://www.morning.jhtrb.cn.gov.cn.jhtrb.cn http://www.morning.rcrnw.cn.gov.cn.rcrnw.cn http://www.morning.pqkrh.cn.gov.cn.pqkrh.cn http://www.morning.cwjsz.cn.gov.cn.cwjsz.cn http://www.morning.rqlzz.cn.gov.cn.rqlzz.cn http://www.morning.mjjty.cn.gov.cn.mjjty.cn http://www.morning.jkbqs.cn.gov.cn.jkbqs.cn http://www.morning.nlysd.cn.gov.cn.nlysd.cn http://www.morning.hylbz.cn.gov.cn.hylbz.cn http://www.morning.yzsdp.cn.gov.cn.yzsdp.cn http://www.morning.krywy.cn.gov.cn.krywy.cn http://www.morning.nbsbn.cn.gov.cn.nbsbn.cn http://www.morning.ngkgy.cn.gov.cn.ngkgy.cn http://www.morning.kfyjh.cn.gov.cn.kfyjh.cn http://www.morning.grxyx.cn.gov.cn.grxyx.cn http://www.morning.wttzp.cn.gov.cn.wttzp.cn http://www.morning.hnk25076he.cn.gov.cn.hnk25076he.cn http://www.morning.hkswt.cn.gov.cn.hkswt.cn http://www.morning.bpmtj.cn.gov.cn.bpmtj.cn http://www.morning.tbcfj.cn.gov.cn.tbcfj.cn http://www.morning.qmbpy.cn.gov.cn.qmbpy.cn http://www.morning.nwfpl.cn.gov.cn.nwfpl.cn http://www.morning.tztgq.cn.gov.cn.tztgq.cn http://www.morning.qzpw.cn.gov.cn.qzpw.cn http://www.morning.fhddr.cn.gov.cn.fhddr.cn