文章目录
- 1什么是Spring框架?
- 2对于Spring I0c的认识
- 3谈谈自己对于AOP的理解
- 4 Spring AOP和AspectJ AOP有什么区别?
- 5 Spring中的单例bean的线程安全问题
- 6 Spring中的bean生命周期?
- 7 Spring框架中都用到了哪些设计模式?
- 8你用到Spring中的哪些注解?
- 9 Spring事务管理的方式有几种?
- 10 Spring事务中的隔离级别有哪几种?
- 11 Spring中什么时候@Transactional会失效?
- 12 Spring的事务传播行为
- 13 Spring中的事务是如何实现的?
- 14使用@Autowired注解自动装配的过程是怎样的?
- 15 spring自动装配bean有哪些方式?
- l6 Spring支特的几种bean的作用域Scope?
- 17什么是SpringMVC简单介绍下你对springMVC的理解?
- 18 描述一下SpringMVC的工作流程?springMVC的优点
- 19 SpringMVC常用的注解有哪些?
- 20在浏览器输入地址到服务器响应数据的过程
- 21 springl的优点
- 22 spring有哪些模块组成
- 23 Spring容器启动流程是怎样的?
- 24 Spring如何处理线程并发问题?
- 25什么是循环引用,如何解决循环引用?
- 26 Spring Refresh
- 27 Spring核心类有哪些,各有什么作用
- 28如果解决P0ST请求/GET请求中文乱码问题?
- 29 SpringMvc.里面的拦截器怎么写
- 30 SpringMVC.怎么跟AJAX互相调用
- 31 SpringMVC的异常处理
- 32 SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决
- 33 SpringMVC中函数的返回值是什么?
1什么是Spring框架?
我们一般说的Spring框架就是Spring Framework,旨在提高开发人员的开发效率以及系统的可维护性。
这些模块是:核心容器、数据访问/集成、Web、AOP(面向切面编程)、工具、消息和测试模块。
2对于Spring I0c的认识
IOC(控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由给Spring框架来管理。IOC容器实际上就是一个Map(key, value),Map中存放的是各种对象
DI:依赖注入,从spring容器获取对象,并给属性赋值
3谈谈自己对于AOP的理解
在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。
Spring AOP底层是基于动态代理实现的,在不改变原始代码的基础上进行功能增强.
4 Spring AOP和AspectJ AOP有什么区别?
1 Spring AOP是属于运行时增强,而AspectJ是编译时增强。
2 Spring AOP基于代理(Proxying),而AspectJ基于字节码操作(Bytecode Manipulation)是指通过XML文件来定义切面、切入点及通知,所有的切面切入点通知都必须是定义在aop的config元素内。
3 Spring AOP已经集成了AspectJ,AspectJ应该算得上是Java生态系统中最完整的AOP框架了。
4 AspectJ相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单。
如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择AspectJ,它比SpringAOP快很多
5 Spring中的单例bean的线程安全问题
单例bean存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。
有两种常见的解决方案:
1.在bean对象中尽量避免定义可变的成员变量(不太现实)。
2.在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中(推荐的一种方式)
6 Spring中的bean生命周期?
1.详细版
1.Bean容器找到配置文件中Spring Bean的定义。
2.Bean容器利用Java Reflection API创建一个Bean的实例。
3.如果涉及到一些属性值,利用set()方法设置一些属性值。
4.如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。
5.如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
6.如果Bean实现了BeanFactoryAware接口,调用setBeanClassFacotory()方法,传入ClassLoader对象的实例。
7.与上面的类似,如果实现了其他*Aware接口,就调用相应的方法。
8.如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执行postProcessBeforeInitialization()方法。
9.如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。
10.如果Bean在配置文件中的定义包含init-method属性,执行指定的方法。
11.如果有和加载这个Bean的Spring容器相关的BeanPostProcess对象,执行postProcessAfterInitialization()方法。
12.当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy()方法。
13.当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法。
2.图例非常详细
https://www.cnblogs.com/zrtqsk/p/3735273.html
3.简单版
生命周期分为:
实例化(Instantiation):
调用springframework中的createBeanInstance()方法给Bean对象分配内存空间,此时属性是默认值,并未进行属性的依赖注入.
初始化-属性赋值(Populate):
1.调用springframework中的populateBean()方法来对用户自定义的对象的属性的赋值.
2.调用springframework中的invokeAwareMethods()方法对引用的容器级别对象的属性的赋值
初始化-增强实现(PostProcessor)
通过BeanPostProcessor接口来对Bean增强实现
1.执行前置处理方法(前置处理):postProcessBeforeInitialization ()完成所有xxxAware接口的注入,即对引用的容器级别对象的属性的赋值/依赖注入操作
2.执行初始化调用方法invokeInitMethods()Java中前置处理已经完成属性赋值,所以无特殊含义.
3.执行后置处理方法.postProcessAfterInitialization()
其中只有一个方法afterPropertiesSet(),来给用户最后一次机会来手动进行属性的赋值或方法的调用操作.
使用和销毁(Destruction):
当Bean不再需要时就会进入销毁阶段,使用destroy方法销毁
7 Spring框架中都用到了哪些设计模式?
1 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
2 单例模式:Bean默认为单例模式。
3 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
4 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
5 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的 对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener
6.适配器模式:是结构型模式,也是各种结构型模式的起源 将一个接口转换为调用方需要的接口 适配器使得接口不兼容的类之间可以一起工作.适配器又被称为包装器Wrapper
7.装饰器模式:动态地给对象添加一些额外的属性或者行为 和继承相比,装饰器模式更加灵活
8.策略模式:一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
8你用到Spring中的哪些注解?
@Component:标识了一个受Spring管理的组件,泛指组件
@Respository: 标识持久层,数据访问组件,即DAO组件
@Service: 标识业务层组件
@Controller :标识表现层,控制层组件
@RequestMapping 是用来处理请求地址映射的注解,可用于类或方法上
@Resource和**@Autowired**都是做bean的注入时使用,都可以写在字段上,或者是setter方法上
9 Spring事务管理的方式有几种?
1.编程式事务:在代码中硬编码(不推荐使用)。
2.声明式事务:在配置文件中配置(推荐使用),分为基于XML的声明式事务和基于注解的声明式事务。
10 Spring事务中的隔离级别有哪几种?
在TransactionDefinition接口中定义了五个表示隔离级别的常量:
ISOLATION_DEFAULT:使用后端数据库默认的隔离级别,Mysql默认采用的REPEATABLE_READ隔离级别;Oracle默认采用的READ_COMMITTED隔离级别。
ISOLATION_READ_UNCOMMITTED:读未提交
ISOLATION_READ_COMMITTED:读已提交
ISOLATION_REPEATABLE_READ:可重复读
ISOLATION_SERIALIZABLE:串行化
11 Spring中什么时候@Transactional会失效?
同时如果某个⽅法是private的,那么@Transactional会失效,
因为底层cglib是基于⽗⼦类来实现的,⼦类是不能重载⽗类的private⽅法的,
所以⽆法很好的利⽤代理,也会导致@Transactianal失效
12 Spring的事务传播行为
可以在事务属性中通过propagation属性来指定事务传播行为 :
PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就 加入该事务,该设置是最常用的设置。
PROPAGATION_SUPPORTS(默认):支持当前事务,如果当前存在事务,就加入该事务,如果当前不 存在事务,就以非事务执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前 不存在事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前 事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则 按REQUIRED属性执行。
13 Spring中的事务是如何实现的?
1 Spring事务底层是基于数据库事务和AOP机制的
2 ⾸先对于使⽤了@Transactional注解的Bean,Spring会创建⼀个代理对象作为Bean
3 当调⽤代理对象的⽅法时,会先判断该⽅法上是否加了@Transactional注解
4 如果加了,那么则利⽤事务管理器创建⼀个数据库连接
5 并且修改数据库连接的autocommit属性为false,禁⽌此连接的⾃动提交,这是实现Spring事务⾮ 常重要的⼀步
6 然后执⾏当前⽅法,⽅法中会执⾏sql
7 执⾏完当前⽅法后,如果没有出现异常就直接提交事务
8 如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
9 Spring事务的隔离级别对应的就是数据库的隔离级别
10 Spring事务的传播机制是Spring事务⾃⼰实现的,也是Spring事务中最复杂的
11 Spring事务的传播机制是基于数据库连接来做的,⼀个数据库连接⼀个事务,
如果传播机制配置为需要新开⼀个事务,那么实际上就是先建⽴⼀个数据库连接,在此新数据库连接上执⾏sql
14使用@Autowired注解自动装配的过程是怎样的?
使用@Autowired注解来自动装配指定的bean。
1 在使用@Autowired注解之前需要在Spring配置文件进行配置
2 启动spring IOC后,容器自动装载了一个后置处理器,当容器扫描到@Autowied、@Resource时,
就会自动查找需要的bean, 并装配给该对象的属性。
在使用@Autowired时,首先在容器中查询对应类型的bean:
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
如果查询的结果不止一个,那么@Autowired会根据名称来查找;
如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false
15 spring自动装配bean有哪些方式?
在Spring框架xml配置中共有5种自动装配:
no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean
byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相 同,就进行自动装配。
byType:通过参数的数据类型进行自动装配。
constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。
l6 Spring支特的几种bean的作用域Scope?
Spring框架支持以下五种bean的作用域:
singleton
prototype
request
session
global-session
17什么是SpringMVC简单介绍下你对springMVC的理解?
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,
通过把Model(模型),View(视图),==Controller(控制器)==分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,
简化开发,减少出错,方便组内开发人员之间的配合。
优点:
1.可以支持各种视图技术,而不仅仅局限于JSP
2.与Spring框架集成
3.清晰的角色分配:前端控制器,请求到处理器映射,处理器适配器,视图解析器
4.支持各种请求资源的映射策略
18 描述一下SpringMVC的工作流程?springMVC的优点
1 用户发送请求至前端控制器DispatcherServlet;
2 DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
3 处理器映射器 根据请求url找到具体的处理器,生成 处理器对象 及 处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
4 DispatcherServlet 调用 HandlerAdapter处理器适配器;
5 HandlerAdapter 经过适配调用具体处理器(Handler,也叫后端控制器);
6 Handler执行完成返回ModelAndView;
7 HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
8 DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
9 ViewResolver解析后返回具体View;
10 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
11 DispatcherServlet响应用户。
(1)用户端将请求统一提交到DispatcherServlet;
(2)DispatcherServlet会将请求交给HandlerMapping进行请求映射,匹配该请求的Handler;
(3)DispatcherServlet再请求HandlerAdapter调用相应的Handler处理请求,并向前端控制器返回一个ModelAndView对象;
(4)DispatcherServlet将ModelAndView对象交给ViewResoler视图解析器处理,返回指定的视图View;
(5)DispatcherServlet 对 View 进行渲染(即将模型数据填充至视图中);
(6)DispatcherServlet 将页面响应给用户;
19 SpringMVC常用的注解有哪些?
@RestController : @Controller和@ResponseBody的组合注解
@RequestMapping : 接口请求映射
@GetMapping : GET请求方式映射
@PutMapping : PUT请求方式映射
@PostMapping : PUT请求方式映射
@DeleteMapping : DELETE请求方式映射
@RequestBody : 接收请求体数据,JSON会自动转对象
@ResponseBody : 响应数据自动转JSON
@RequestParam : 接收请求参数
@Cookie : 接收请求中的cookie
@RequestHeader : 接收请求头
@PathVariable : 声明路径变量
20在浏览器输入地址到服务器响应数据的过程
1、在浏览器中输入url,直接输入ip或者输入域名
2、如果输入的是域名就需要通过DNS解析将域名解析成IP地址,通过IP来确认访问的是哪个服务器
3、建立TCP请求(即三次握手)
4、发送http请求
5、服务器处理请求,并将结果返回给浏览器
6、最后断开TCP连接(即四次挥手)
7、浏览器根据返回结果进行处理以及页面渲染
21 springl的优点
a)spring属于低侵入式设计,代码的污染极低
b)spring的DI机制将对象之间的依赖关系交由框架处理、降低组件的耦合性
c)spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用
22 spring有哪些模块组成
(1)Spring Core:核心类库,提供IOC服务
(2)Spring Context:提供框架式的Bean访问方式,以及企业级功能(定时任务等)
(3)Spring AOP:AOP服务
(4)Spring DAO:对JDBC的抽象,简化了数据访问异常的处理
(5)Spring ORM:对现有的ORM框架的支持
(6)Spring Web:提供了基本的面向Web的重合特性,例如多方文件上传
(7)Spring MVC:提供面向Web应用的Model-View-Controller实现
23 Spring容器启动流程是怎样的?
创建Spring容器,也就是启动Spring时⾸先会进⾏扫描,扫描得到所有的BeanDefinition对象,并存在⼀个Map中 ,
然后筛选出⾮懒加载的单例BeanDefinition进⾏创建Bean , 利⽤BeanDefinition创建Bean就是Bean的创建⽣命周期,
这期间包括了合并BeanDefinition、推断 构造⽅法、实例化、属性填充、初始化前、初始化、初始化后等步骤,
其中AOP就是发⽣在初始化后这⼀步骤中 , 单例Bean创建完了之后,Spring会发布⼀个容器启动事件 ,之后 Spring启动结束
24 Spring如何处理线程并发问题?
1 在一般情况下,只有无状态的Bean才可以在多线程环境下共享,
在Spring中,绝大部分Bean都可 以声明为singleton作用域,
因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题
2 ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。
同步机制采用了 “时间换空间”的方式,仅提供一份变量,
不同的线程在访问前需要获取锁,没获得锁的线程则需要排队,
ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突
25什么是循环引用,如何解决循环引用?
循环引用的bean之间会构成一个环,要想打破这个环,
那么这个环中至少需要有一个bean可以在自身的依赖还没有得到满足前,就能够被创建出来(最起码要被实例化出来,可以先不注入其需要的依赖)
这种bean只能是通过属性注入依赖的类,因为它们可以先使用默认构造器创建出实例,
然后再通过setter方法注入依赖。而通过构造器注入依赖的类,
在它的依赖没有被满足前,无法被实例化
26 Spring Refresh
Spring容器创建之后,会调用它的refresh方法刷新Spring应用的上下文。
27 Spring核心类有哪些,各有什么作用
1.BeanFactory:产生一个新的实例,可以实现单例模式
2.BeanWrapper:提供统一的get及set方法
3.ApplicationContext:提供框架的实现,包括BeanFactory所有功能
28如果解决P0ST请求/GET请求中文乱码问题?
1.解决post请求乱码问题:在web.xml配置一个CharacterEncodingFiltre过滤器设置为utf-8
2.get请求中文参数出现乱码解决方法有两个
(1)修改tomcat配置文件添加编码与工程编码一致
(2)对参数进行重写编码
29 SpringMvc.里面的拦截器怎么写
1.一种是实现HandlerInterceptor接口
2.另一种是继承适配器类,接着在接口方法当中实现处理逻辑
30 SpringMVC.怎么跟AJAX互相调用
1.通过Jackson框架就可以把Java里面的对象之间转化成Js可以识别JSON对象,步骤如下:
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法里面可以直接返回Object、List等,但方法前面要加上ResponseBody注解
31 SpringMVC的异常处理
可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添加视图页面即可
32 SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决
是单例模式,在多线程访问的时候有线程安全问题,
解决方法是在控制器里面不能写可变状态量,
如果需要使用这些可变状态,可以使用ThreadLocal机制解决,
为每个线程单独生成一份变量副本独立操作,互不影响
33 SpringMVC中函数的返回值是什么?
String、ModelAndView。ModerlAndView类把试图和数据都合并的一起