请你说说Spring
一. Spring是什么?
- 是一个轻量级的开源容器框架,用来装JavaBean,可以把其他的一些框架进行整合使用,使得开发更快,更简洁。
- 轻量级:占用空间小,非入侵式的(Spring中的对象不依赖于Spring的特定类)
- IOC,AOP
二. IOC和AOP
谈谈你对AOP的理解?
- 将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,注入到目标对象(具体业务) 中。可以在不改变目标对象的前提下进行功能扩展,做一些额外的事。
- 在OOP的设计中,导致了大量代码的重复,不利于模块的重用。
- AOP基于动态代理:JDK动态代理和cglib动态代理
Spring通知(Advice)有哪些类型?
- 前置通知,后置通知,循环通知,返回后通知,抛出异常后通知
谈谈你对IOC的理解?
从三个方面谈:
- 容器概念:
- IOC容器就像个map一样,里面保存的是对象。这些对象通过xml,或者注解放到这个map中, 在需要的地方进行DI注入。
- 对象的创建,消亡,管理都交给容器。
- 控制反转:(获得依赖对象的过程被反转了)
- 没有IOC之前,比如A对象中依赖B对象,那么在A运行到某一点,就会主动的创建B对象或者使用之前创建的B对象,不管怎样,控制权在程序的手里。引入IOC之后,对象A和B之间失去了 直接的联系,当对象A允许到需要B对象的时候,IOC会把之前创建的B对象注入到需要的位置B对象从主动创建到被动注入,控制权交给IOC
- 依赖注入:
- 就是实现IOC的方法,在IOC容器允许中,动态的将某种依赖关系注入到对象中
三. 简述一下Spring Bean的生命周期?
- 实例化Bean,通过反射
- 属性填充,对对象中加了@autowired的属性进行注入
- 处理Aware接口,Spring会检测该对象是否实现了xxxAware接口,可以拿到一些Spring 容器资源,
- 比如BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,传入Bean的名字;
- 完成代理AOP,如果对象有AOP代理,生成代理类对象。
- BeanPostProcessor前置处理
- InitializingBean:如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法,可以完成一些属性的初始化操作。
- BeanPostProcessor后置处理
- 实例化bean,如果是单例,放在单例池中
- 调用DisposableBean()销毁bean
四. 解释一下Spring支持的几种Bean的作用域?
- singletion:单例模式(默认) 每一个IOC容器只有一个bean对象,生命周期与IOC容器一样
- prototype:原型模式,每次注入都会创建一个新的对象(每次调用getBean()创建一个新的对象)
其余的只能在web开放中使用!(让对象和web里的作用域一样)
- request:每次请求创建一个对象
- session:每个session中创建一个对象
- application:每一个ServletContent中创建一个对象
- websocket:每一个websocket中创建一个对象
- global-session:全局作用域(了解)
Spring框架中的单例Bean是线程安全的吗?
不是线程安全的
- 如果bean是无状态的,就不会保存数据。只是说一层一层的调用实例方法,比如controller调用 service,service调用dao。这样的操作是在栈中,每一个线程独有的空间,就是线程安全的。
- 如果bean是有状态的,就会有数据存储功能。那么数据保存在堆中,就需要考虑线程安全问题了
- 两种方式保证线程安全:
- 把singletion改为prototype。每次是新的对象
- 使用Threadlocal把变量变为线程私有的,如果需要共享变量,加锁。
- 两种方式保证线程安全:
五. Bean的自动装配
什么是Bean的自动装配,有哪些方式?
通俗的话来讲,就是一个Bean中。有些属性是引用类型的,这些类型就不需要手动注入,可以从IOC容器中自动注入,也就是自动装配。具体是给autowire的属性赋值。
五种自动装配的方式?
- 缺省:就是手动注入
- byType:根据类型注入
- byName:根据id注入
- construtor:根据构造器的参数类型进行注入。
- autodetect:先根据构造器参数,再根据byType。
关于@autowire
自动注入俩种方式:
- xml配置文件
- 注解:
- @autowired
- @Resource
关于@autowired的理解?
- 该注解是先ByType再ByName。可以放在属性,setter方法,构造器,任意方法上使用因为该注解使用反射进行注入。
- 它会先把 属性/成员变量的【访问控制检查】关掉,这样就算设置为private也会注入成功。
六. BeanFactory,ApplicationContext,FactoryBean
BeanFactory和ApplicationContext的区别?
- BeanFactory是Spring框架的基础设施,面向 Spring 本身;
- ApplicationContext面向使用Spring 框架的开发者,几乎所有的应用场合我们都直接使用ApplicationContext而非底层的BeanFactory。
- ApplicationContext 由 BeanFactory 派生而来,提供了更多面向实际应用的功能。
具体区别:
- ApplicationContext:
- 继承MessageSource,支持国际化
- 统一的资源文件访问方式
- 同时加载多个配置文件
- 载入多个上下文对象,使得每个上下文对象专注于一个特定的层次,比如:service层 (以上为扩展的功能)
- 在容器启动的时候,一次性创建所有的bean对象,这样在容器启动的时候,就能发现错误
- BeanFactory:
- 采用延迟加载的形式创建bean,只有调用getBean()的时候,才进行对象的创建
FactoryBean 与 BeanFactory 有什么区别?
- BeanFactory 是 IoC 底层容器,提供了 bean 的管理
- FactoryBean 是创建 Bean 的一种方式,帮助实现复杂的初始化逻辑。 比如SqlSessionFactoryBean就是继承 FactoryBean
七. Spring事务
事务这个概念是数据库层面的,Spring只是基于数据库做了扩展,提供简单的操作事务的方式
Spring事务的实现方式和原理?
两种实现方式:
- 编程式:自己关闭sql的自动提交,进行try-catch-final。
- 申明式:采用xml或者@Transaction 开启事务
- 申明式事务的原理:Spring会基于这个类生成一个代理对象,使用这个代理对象的时候,如果方法上使用@Transaction,就会把自动提交设置为false,然后执行逻辑,如果报异常,回滚,无异常,提交事务。
Spring事务的隔离级别:就是数据库的隔离级别,可以参照MYSQL事务
事务的传播特性:
PROPAGATION_REQUIRED | 如果没有,就开启一个事务;如果有,就加入当前事务(方法B看到自己已经运行在 方法A的事务内部,就不再起新的事务,直接加入方法A) |
RROPAGATION_REQUIRES_NEW | 如果没有,就开启一个事务;如果有,就将当前事务挂起。(方法A所在的事务就会挂起,方法B会起一个新的事务,等待方法B的事务完成以后,方法A才继续执行) |
PROPAGATION_NESTED | 如果没有,就开启一个事务;如果有,就在当前事务中嵌套其他事务 |
PROPAGATION_SUPPORTS | 如果没有,就以非事务方式执行;如果有,就加入当前事务(方法B看到自己已经运行在 方法A的事务内部,就不再起新的事务,直接加入方法A) |
PROPAGATION_NOT_SUPPORTED | 如果没有,就以非事务方式执行;如果有,就将当前事务挂起,(方法A所在的事务就会挂起,而方法B以非事务的状态运行完,再继续方法A的事务) |
PROPAGATION_NEVER | 如果没有,就以非事务方式执行;如果有,就抛出异常。 |
PROPAGATION_MANDATORY | 如果没有,就抛出异常;如果有,就使用当前事务 |
Spring 事务什么时候会失效?
Spring事务的原理是AOP,进行切面增强,那么失效的原因也是AOP不起作用,常见情况如下:
- 发生自调用,使用this调用本类的方法,此时这个this对象不是代理类,而是UserService 对象本身!
- 解决方式很简单,让this变为代理类
- 方法不是public的:
- @Transaction只能使用在public方法上,否则事务会失效
- @Transactional 作用于接口,使用 CGLib 动态代理
- 数据库不支持事务
- 没有被Spring管理
- 异常被吃掉,事务没有回滚
八. Spring中用到哪些设计模式
九. 循环依赖
后期更新~
寄语:透过云端的道路,只亲吻攀登者的足迹。
请你说说Spring的更多相关文章
- IntelliJ idea创建Spring MVC的Maven项目
参考:http://my.oschina.net/gaussik/blog/385697?fromerr=Pie9IlFV 创建Maven Web项目 菜单File->New Project可进 ...
- [Java面试五]Spring总结以及在面试中的一些问题.
1.谈谈你对spring IOC和DI的理解,它们有什么区别? IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spri ...
- Spring MVC 学习总结(一)——MVC概要与环境配置
一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...
- Spring面试基本问题(1)
1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...
- MyBatis使用总结+整合Spring
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .20 ...
- Spring4.1新特性——Spring MVC增强
目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异 ...
- Spring Mobile 1.1.0.RC1 和 1.0.2 发布
Spring Mobile 1.1.0.RC1 发布了,该版本包含: 支持 Firefox OS 设备的检测 修复了使用 LiteDeviceDelegatingViewResolver 处理重定向和 ...
- Spring面试题集
一.Spring简介 * Spring框架有哪几部分组成? Spring框架有七个模块组成组成,这7个模块(或组件)均可以单独存在,也可以与其它一个或多个模块联合使用,主要功能表现如下: ...
- Spring面试问题
什么是Spring框架?Spring框架有哪些主要模块? 使用Spring框架有什么好处? 什么是控制反转(IOC)?什么是依赖注入? 请解释下Spring中的IOC? BeanFactory和App ...
随机推荐
- ON UPDATE CURRENT_TIMESTAMP请慎用
大家好,我是架构摆渡人.这是实践经验系列的第七篇文章,这个系列会给大家分享很多在实际工作中有用的经验,如果有收获,还请分享给更多的朋友. 今天给大家分享一个容易忽略的问题,正是因为容易忽略,所以才要重 ...
- AI系统——梯度累积算法
明天博士论文要答辩了,只有一张12G二手卡,今晚通宵要搞定10个模型实验 挖槽,突然想出一个T9开天霹雳模型,加载不进去我那张12G的二手卡,感觉要错过今年上台Best Paper领奖 上面出现的 ...
- 服务限流 -- 自定义注解基于RateLimiter实现接口限流
1. 令牌桶限流算法 令牌桶会以一个恒定的速率向固定容量大小桶中放入令牌,当有浏览来时取走一个或者多个令牌,当发生高并发情况下拿到令牌的执行业务逻辑,没有获取到令牌的就会丢弃获取服务降级处理,提示一个 ...
- 灵雀云开源网络插件Kube-OVN 1.4.0 版发布!支持跨集群容器网络、NetworkPolicy 日志
从 1.4 开始 Kube-OVN 支持将多个 Kubernetes 集群容器网络打通,不同集群之间的 Pod 可以通过 Pod IP 直接互相通信.本版本还支持 ACL 日志,可以记录因 Netwo ...
- 【PTA】6-2 读文章(*) (31 分)
请编写函数,从文件中读出文章,将其输出到屏幕上. 函数原型 void ReadArticle(FILE *f); 说明:参数 f 为文件指针.函数读出 f 所指示文件中的文章,将其输出到屏幕上. 裁判 ...
- CUDA 入门(转)
CUDA(Compute Unified Device Architecture)的中文全称为计算统一设备架构.做图像视觉领域的同学多多少少都会接触到CUDA,毕竟要做性能速度优化,CUDA是个很重要 ...
- 华为联运游戏审核驳回:在未安装或需更新HMS Core的手机上,提示安装,点击取消后,游戏卡屏(集成的6.1.0.301版本游戏SDK)
问题描述 更新游戏SDK到6.1.0.301版本之后,游戏包被审核驳回:在未安装或需更新华为移动服务版本(HMS Core)的手机上,提示安装华为移动服务(HMS Core),点击取消,游戏卡屏.修改 ...
- golang中的排序算法实现
1. 冒泡排序算法实现 package main import "fmt" func main() { values := []int{3, 98, 55, 46, 22, 3, ...
- Android开发----RecyclerView视图的学习
RecyclerView RecyclerView是什么? RecyclerView是如今Android开发中最常用的控件,其相较于ListView和GridView的功能更为强大,优化了两者的各种不 ...
- Iptables的命令与用法
目录 一:iptables的用法 1.iptables简介 二:Iptables链的概念 1.那四个表,有哪些作用? 2.那五条链,运行在那些地方? 3.Iptables流程图 三:iptables的 ...