您好,欢迎访问一九零五行业门户网

收藏!Spring必须掌握的内容

mysql教程栏目为大家介绍spring必须掌握的内容。
大家好!我是热心的朝阳群众。
spring框架在面试中是一个必问点,里面究竟有哪些内容呢?让我们一起来看看。这也是我在面试中经常会问到的问题,也是体现一个程序员对框架理解的能力。
介绍一下spring框架 spring是一种轻量级框架,旨在提高开发人员的开发效率以及系统的可维护性。
我们一般说的spring框架就是spring framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。这些模块是核心容器、数据访问/集成、web、aop(面向切面编程)、工具、消息和测试模块。比如core container中的core组件是spring所有组件的核心,beans组件和context组件是实现ioc和di的基础,aop组件用来实现面向切面编程。
spring的6个特征:
核心技术:依赖注入(di),aop,事件(events),资源,i18n,验证,数据绑定,类型转换,spel;测试:模拟对象,testcontext框架,spring mvc测试,webtestclient;数据访问:事务,dao支持,jdbc,orm,编组xml;web支持:spring mvc和spring webflux web框架;集成:远程处理,jms,jca,jmx,电子邮件,任务,调度,缓存;语言:kotlin,groovy,动态语言;列举一些重要的spring模块 下图对应的是spring 4.x的版本,目前最新的5.x版本中web模块的portlet组件已经被废弃掉,同时增加了用于异步响应式处理的webflux组件。
spring core:基础,可以说spring其他所有的功能都依赖于该类库。主要提供ioc和di功能。spring aspects:该模块为与aspectj的集成提供支持。spring aop:提供面向方面的编程实现。spring jdbc:java数据库连接。spring jms:java消息服务。spring orm:用于支持hibernate等orm工具。spring web:为创建web应用程序提供支持。spring test:提供了对junit和testng测试的支持。谈谈自己对于spring ioc和aop的理解 iocioc(inversion of controll,控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由给spring框架来管理。ioc在其他语言中也有应用,并非spring特有。ioc容器是spring用来实现ioc的载体,ioc容器实际上就是一个map(key, value),map中存放的是各种对象。
将对象之间的相互依赖关系交给ioc容器来管理,并由ioc容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。ioc容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。在实际项目中一个service类可能由几百甚至上千个类作为它的底层,假如我们需要实例化这个service,可能要每次都搞清楚这个service所有底层类的构造函数,这可能会把人逼疯。如果利用ioc的话,你只需要配置好,然后在需要的地方引用就行了,大大增加了项目的可维护性且降低了开发难度。
spring时代我们一般通过xml文件来配置bean,后来开发人员觉得用xml文件来配置不太好,于是sprng boot注解配置就慢慢开始流行起来。
aopaop(aspect-oriented programming,面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可扩展性和可维护性。
spring aop是基于动态代理的,如果要代理的对象实现了某个接口,那么spring aop就会使用jdk动态代理去创建代理对象;而对于没有实现接口的对象,就无法使用jdk动态代理,转而使用cglib动态代理生成一个被代理对象的子类来作为代理。
当然也可以使用aspectj,spring aop中已经集成了aspectj,aspectj应该算得上是java生态系统中最完整的aop框架了。使用aop之后我们可以把一些通用功能抽象出来,在需要用到的地方直接使用即可,这样可以大大简化代码量。我们需要增加新功能也方便,提高了系统的扩展性。日志功能、事务管理和权限管理等场景都用到了aop。
spring aop和aspectj aop的区别 spring aop是属于运行时增强,而aspectj是编译时增强。spring aop基于代理(proxying),而aspectj基于字节码操作(bytecode manipulation)。
spring aop已经集成了aspectj,aspectj应该算得上是java生态系统中最完整的aop框架了。aspectj相比于spring aop功能更加强大,但是spring aop相对来说更简单。
如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择aspectj,它比springaop快很多。
spring中的bean的作用域有哪些? singleton:唯一bean实例,spring中的bean默认都是单例的。prototype:每次请求都会创建一个新的bean实例。request:每一次http请求都会产生一个新的bean,该bean仅在当前http request内有效。session:每一次http请求都会产生一个新的bean,该bean仅在当前http session内有效。global-session:全局session作用域,仅仅在基于portlet的web应用中才有意义,spring5中已经没有了。portlet是能够生成语义代码(例如html)片段的小型java web插件。它们基于portlet容器,可以像servlet一样处理http请求。但是与servlet不同,每个portlet都有不同的会话。spring中的单例bean的线程安全问题了解吗? 大部分时候我们并没有在系统中使用多线程,所以很少有人会关注这个问题。单例bean存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。
有两种常见的解决方案:
在bean对象中尽量避免定义可变的成员变量(不太现实)。在类中定义一个threadlocal成员变量,将需要的可变成员变量保存在threadlocal中(推荐的一种方式)。spring中的bean生命周期?
bean容器找到配置文件中spring bean的定义。bean容器利用java reflection api创建一个bean的实例。如果涉及到一些属性值,利用set()方法设置一些属性值。如果bean实现了beannameaware接口,调用setbeanname()方法,传入bean的名字。如果bean实现了beanclassloaderaware接口,调用setbeanclassloader()方法,传入classloader对象的实例。如果bean实现了beanfactoryaware接口,调用setbeanclassfacotory()方法,传入classloader对象的实例。与上面的类似,如果实现了其他*aware接口,就调用相应的方法。如果有和加载这个bean的spring容器相关的beanpostprocessor对象,执行postprocessbeforeinitialization()方法。如果bean实现了initializingbean接口,执行afeterpropertiesset()方法。如果bean在配置文件中的定义包含init-method属性,执行指定的方法。如果有和加载这个bean的spring容器相关的beanpostprocess对象,执行postprocessafterinitialization()方法。当要销毁bean的时候,如果bean实现了disposablebean接口,执行destroy()方法。当要销毁bean的时候,如果bean在配置文件中的定义包含destroy-method属性,执行指定的方法。说说自己对于spring mvc的了解? 谈到这个问题,我们不得不提提之前model1和model2这两个没有spring mvc的时代。
**model1时代:**很多学java比较晚的后端程序员可能并没有接触过model1模式下的javaweb应用开发。在model1模式下,整个web应用几乎全部用jsp页面组成,只用少量的javabean来处理数据库连接,访问等操作。这个模式下jsp即是控制层又是表现层。显而易见,这种模式存在很多问题。比如将控制逻辑和表现逻辑混杂在一起,导致代码重用率极低;又比如前端和后端相互依赖,难以进行测试并且开发效率极低。
model2时代:学过servlet并做过相关demo的朋友应该了解java bean(model)+jsp(view)+servlet(controller)这种开发模式,这就是早期的java web mvc开发模式。model是系统中涉及的数据,也就是dao和bean;view是用来展示模型中的数据,只是用来展示;controller是将用户请求都发送给servlet做处理,返回数据给jsp并展示给用户。
model2模式下还存在很多问题,model2的抽象和封装程度还远远不够,使用model2进行开发时不可避免地会重复造轮子,这就大大降低了程序的可维护性和可复用性。于是很多java web开发相关的mvc框架应运而生,比如struts2,但是由于struts2比较笨重,随着spring轻量级开发框架的流行,spring生态圈出现了spring mvc框架。spring mvc是当前最优秀的mvc框架,相比于struts2,spring mvc使用更加简单和方便,开发效率更高,并且spring mvc运行速度更快。
mvc是一种设计模式,spring mvc是一款很优秀的mvc框架。spring mvc可以帮助我们进行更简洁的web层的开发,并且它天生与spring框架集成。spring mvc下我们一般把后端项目分为service层(处理业务)、dao层(数据库操作)、entity层(实体类)、controller层(控制层,返回数据给前台页面)。
spring mvc的简单原理图如下:
谈谈spring mvc的工作原理 流程说明:
1.客户端(浏览器)发送请求,直接请求到dispatcherservlet。
2.dispatcherservlet根据请求信息调用handlermapping,解析请求对应的handler。
3.解析到对应的handler(也就是我们平常说的controller控制器)。
4.handleradapter会根据handler来调用真正的处理器来处理请求和执行相对应的业务逻辑。
5.处理器处理完业务后,会返回一个modelandview对象,model是返回的数据对象,view是逻辑上的view。
6.viewresolver会根据逻辑view去查找实际的view。
7.dispatcherservlet把返回的model传给view(视图渲染)。
8.把view返回给请求者(浏览器)。
##spring框架中用到了哪些设计模式?
工厂设计模式:spring使用工厂模式通过beanfactory和applicationcontext创建bean对象。代理设计模式:spring aop功能的实现。单例设计模式:spring中的bean默认都是单例的。模板方法模式:spring中的jdbctemplate、hibernatetemplate等以template结尾的对数据库操作的类,它们就使用到了模板模式。包装器设计模式:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。观察者模式:spring事件驱动模型就是观察者模式很经典的一个应用。适配器模式:spring aop的增强或通知(advice)使用到了适配器模式、spring mvc中也是用到了适配器模式适配controller。@component和@bean的区别是什么? 作用对象不同。@component注解作用于类,而@bean注解作用于方法。@component注解通常是通过类路径扫描来自动侦测以及自动装配到spring容器中(我们可以使用@componentscan注解定义要扫描的路径)。@bean注解通常是在标有该注解的方法中定义产生这个bean,告诉spring这是某个类的实例,当我需要用它的时候还给我。@bean注解比@component注解的自定义性更强,而且很多地方只能通过@bean注解来注册bean。比如当引用第三方库的类需要装配到spring容器的时候,就只能通过@bean注解来实现。@bean注解的使用示例:
@configurationpublic class appconfig { @bean public transferservice transferservice() { return new transferserviceimpl(); }}复制代码
上面的代码相当于下面的xml配置:
<beans> <bean id="transferservice" class="com.common.transferserviceimpl"/></beans>复制代码
下面这个例子是无法通过@component注解实现的:
@beanpublic oneservice getservice(status) { case (status) { when 1: return new serviceimpl1(); when 2: return new serviceimpl2(); when 3: return new serviceimpl3(); }}复制代码
将一个类声明为spring的bean的注解有哪些? 我们一般使用@autowired注解去自动装配bean。而想要把一个类标识为可以用@autowired注解自动装配的bean,可以采用以下的注解实现:
@component注解。通用的注解,可标注任意类为spring组件。如果一个bean不知道属于哪一个层,可以使用@component注解标注。@repository注解。对应持久层,即dao层,主要用于数据库相关操作。@service注解。对应服务层,即service层,主要涉及一些复杂的逻辑,需要用到dao层(注入)。@controller注解。对应spring mvc的控制层,即controller层,主要用于接受用户请求并调用service层的方法返回数据给前端页面。spring事务管理的方式有几种? 编程式事务:在代码中硬编码(不推荐使用)。声明式事务:在配置文件中配置(推荐使用),分为基于xml的声明式事务和基于注解的声明式事务。spring事务中的隔离级别有哪几种? 在transactiondefinition接口中定义了五个表示隔离级别的常量:
**isolation_default:**使用后端数据库默认的隔离级别,mysql默认采用的repeatable_read隔离级别;oracle默认采用的read_committed隔离级别。
**isolation_read_uncommitted:**最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
**isolation_read_committed:**允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
**isolation_repeatable_read:**对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
**isolation_serializable:**最高的隔离级别,完全服从acid的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
spring事务中有哪几种事务传播行为? 在transactiondefinition接口中定义了八个表示事务传播行为的常量。
支持当前事务的情况:**propagation_required:**如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
propagation_supports: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
propagation_mandatory: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)。
不支持当前事务的情况:propagation_requires_new: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
propagation_not_supported: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
propagation_never: 以非事务方式运行,如果当前存在事务,则抛出异常。
###其他情况:
propagation_nested: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于propagation_required。
结束 希望大家能掌握这些内容,也能够继续支持我,感谢。
更多相关免费学习推荐:mysql教程(视频)
以上就是收藏!spring必须掌握的内容的详细内容。
其它类似信息

推荐信息