面试篇——Spring
1.Spring特点
(1)为何使用Spring
Spring是一个轻量级J2EE框架。它的主要功能有控制反转(IOC)、面向切面编程(AOP)、面向接口开发、事务管理、还可以包容其他框架,使系统中用到的其它框架耦合度大大降低,扩展性强、简单易用好管理。
2.IOC
(1)Spring中,如何给对象的属性赋值?
1.通过构造函数
2.通过set方法给属性注入值
3.自动装配(了解)
byName 通过参数名自动装配,如果一个bean的name 和另外一个bean的 property 相同就自动装配。
byType 通过参数的数据类型自动自动装配,如果一个bean的数据类型和另外一个bean的property属性的数据类型兼容,就自动装配必须确保该类型在IOC容器中只有一个对象;否则报错。
4.注解
使用注解步骤:
1)先引入context名称空间 xmlns:context=“http://www.springframework.org/schema/context”
2)开启注解扫描
<context:component-scan base-package=“cn.itcast.e_anno2”></context:component-scan>
3)使用注解
通过注解的方式,把对象加入ioc容器。
创建对象以及处理对象依赖关系,相关的注解:
@Component 指定把一个对象加入IOC容器
@Repository 作用同@Component; 在持久层使用
@Service 作用同@Component; 在业务逻辑层使用
@Controller 作用同@Component; 在控制层使用
@Resource 属性注入
总结:
(1) 使用注解,可以简化配置,且可以把对象加入IOC容器,及处理依赖关系(DI)
(2) 注解可以和XML配置一起使用。
(3) @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了
(2)bean对象创建的细节
(1)对象创建:单例/多例
scope=“singleton”, 默认值, 即 默认是单例 【service/dao/工具类】
scope=“prototype”, 多例;【Action对象】
Spring的单例bean是线程安全的
(2)什么时候创建?
scope=“prototype” 在用到对象的时候,才创建对象。
scope=“singleton” 在启动(容器初始化之前), 就已经创建了bean,且整个应用只有一个。
(3)是否延迟创建
lazy-init=“false” 默认为false, 不延迟创建,即在启动时候就创建对象
lazy-init=“true” 延迟初始化, 在用到对象的时候才创建对象(只对单例有效)
(4) 创建对象之后,初始化/销毁
init-method=“init_user” 【对应对象的init_user方法,在对象创建爱之后执行】
destroy-method=“destroy_user” 【在调用容器对象的destriy方法时候执行,(容器用实现类)】
(3)Bean的作用域?
(1)singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。
(2)prototype:原型范围与单例范围相反,为每一个bean请求提供一个实例。
(3)request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成后,bean会失效并被垃圾回收器回收。
(4)Session:与请求范围类似,确保每一个session中有一个bean的实例,在session过期后,bean会随之失效。
(4)IOC容器对Bean的生命周期
(1)通过构造器或工厂方法创建Bean实例
(2)为Bean的属性设置值和对其他Bean的引用
(3)将 Bean实例传递 给 Bean 后 置 处 理 器 的
postProcessBeforeInitialization 方法
(4)调用Bean的初始化方法(init-method)将Bean实例传递给Bean后置处理器的postProcessAfterInitialization 方法,Bean 可以使用了
(5)当容器关闭时,调用Bean的销毁方法(destory-method)
(5)讲下BeanFactory和ApplicationContext的区别?
(1)BeanFactory是Spring容器顶级核心接口,比较早,但功能比较少,getBean就是BeanFactory定义的。
(2)ApplicationContext是Spring里面的另外一个容器顶级接口,它继承于BeanFactory,但是提供的功能譬如校验,国际化,监听,对Bean的管理功能比较多,一般使用ApplicationContext。
3.AOP
(1)代理模式
代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式;即通过代理访问目标对象。 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作。(扩展目标对象的功能)。
静态代理:要实现与目标对象一样的接口
总结静态代理:
优点:
(1)可以做到在不修改目标对象的功能的前提下,对目标对象功能扩展。
缺点:
(1)因为代理对象,需要与目标对象实现一样的接口,所以会有很多代理类,类太多
(2)一旦接口增加方法,目标对象与代理对象都要维护。解决方法:使用动态代理
动态代理:
(1)代理对象,不需要实现接口
(2)代理对象的生成是利用JDKAPI,动态的在内存中构建代理对象
总结动态代理:
代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理!
Cglib代理:
(1)也叫作子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的类,就可以使用CGLIB实现。
(2)CGLIB是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用,例如SpringAOP和dynaop,为他们提供方法的interception(拦截)。
(3)CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
(2)AOP
AOP:aspect object programming 面向切面编程
功能:让关注点代码与业务代码分离
关注点:重复代码就叫做关注点
切面:关注点形成的类就叫切面类;面向切面编程就是指对很多功能都有的重复代码的抽取,再在运行的时候往业务方法上动态植入“切面类代码”
切入点:执行目标对象的方法,动态植入切面代码。可以通过切入点表达式,指定拦截哪些类的哪些方法,给指定的类在运行的时候植入切面类代码。
分析总结:业务代码与关注点代码分离的好处:
→关注点代码写一次即可
→开发者只需要关注核心业务
→运行时期,执行核心业务代码时候动态植入关注点代码;
→【代理】AOP一般使用的场景:缓存、权限、错误处理、持久化、资源池、同步、事务、日志跟踪等
4.事务
(1)描述在系统中如何使用了Spring的事务控制
Spring事务包括编程式事务和声明式事务。 在系统中使用了声明式的事务管理是用Spring的AOP来实现的;配置了只读事务和回滚事务(传播行为为REQUIRED)当出现错误后进行回滚操作。在项目中通过aop切入事务到serivce层,这样做能使一次业务逻辑操作如果包括几个数据库操作都控制在一个事务中。
(2)如何管理事务,事务是只读的还是读写的,对于查询的find()是只读,对于保存的save()是读写?
如果一次执行单条查询语句,则没有必要启用事务支持,数据库默认支持SQL执行期间的读一致性;
如果一次执行多条查询语句,例如统计查询,报表查询,在这种场景下,多条查询SQL必须保证整体的读一致性,否则,在前条SQL查询之后,后条SQL查询之前,数据被其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态,此时,应该启用事务支持
read-only="true"表示该事务为只读事务,比如上面说的多条查询的这种情况可以使用只读事务,由于只读事务不存在数据的修改,因此数据库将会为只读事务提供一些优化手段。例如Oracle对于只读事务,不启动回滚段,不记录回滚log。
指定只读事务的办法为:
bean配置文件中,prop属性增加“read-Only”
或者用注解方式@Transactional(readOnly =true)
Spring中设置只读事务是利用上面两种方式(根据实际情况)
在将事务设置成只读后,相当于将数据库设置成只读数据库,此时若要进行写的操作,会出现错误。
(3)Spring的事务是如何配置的?
先配置事务管理器TransactionManager,不同的框架有不同属性。
再配置事务通知和属性,通过tx:advice。
配置aop:config,设置那些方法或者类需要加入事务。
(4)事务传播行为
Propagation.REQUIRED(spring默认的事务)
指定当前的方法必须在事务的环境下执行;
如果当前运行的方法,已经存在事务, 就会加入当前的事务;
Propagation.SUPPORTS 如果有事务则加入事务,没有则无事务运行。
Propagation.REQUIRED_NEW
指定当前的方法必须在事务的环境下执行;
如果当前运行的方法,已经存在事务: 事务会挂起; 会始终开启一个新的事务,执行完后; 刚才挂起的事务才继续运行。
(5)事务并发会引起什么问题?怎么解决?
事务并发会引起脏读,幻读,不可重复读等问题,设置事务的隔离级别可以解决。
(6)SSH集成方式
- 在web.xml中配置struts的servlet或filter入口类,同时在web.xml中配置 spring的listener和配置文件路径
- 引用SSH所需的jar包放在WEB-INF/lib下,需要有struts-spring-plugin.jar
- 在struts.xml配置中,把Struts的Action类交由Spring托管
- 把Hibernate所需的DataSource, SessionFactory, Transcation, HibernateTemplate配置在Spring的配置文件中
- Dao层的类有时需要继承HiberateDaoSupport类,如果有HibernateTemplate 时,可以不继承
- 把Action、Service、Dao等类注册到Spring中管理
面试篇——Spring相关推荐
- ElasticSearch实战篇 - Spring Boot 整合 ElasticSearch
点击上方 Java后端,选择 设为星标 优质文章,及时送达 作者:冯文议 链接:segmentfault.com/a/1190000018625101 当前Spring Boot很是流行,包括我自己, ...
- 面试篇之JVM(GC 可达性分析 回收算法 卡表 G1)
面试篇之JVM 面试篇之JVM GC 对象存活判断 分代回收理论 常见回收算法 HotSpot实现细节 记忆集与卡表 读写屏障 回收器 并发标记 G1 面试篇之JVM GC 美团 1.JVM怎么判断一 ...
- eureka集群只注册一个_Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇
Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇 本文主要内容: 1:spring cloud整合Eureka总结 本文是由凯哥(凯哥Java:kagejava ...
- Elasticsearch实战篇——Spring Boot整合ElasticSearch
2019独角兽企业重金招聘Python工程师标准>>> 当前Spring Boot很是流行,包括我自己,也是在用Spring Boot集成其他框架进行项目开发,所以这一节,我们一起来 ...
- Java框架篇---spring aop两种配置方式
Java框架篇---spring aop两种配置方式 第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中 ...
- 2018前端开发面试备忘录(1年以上经验初中级别前端开发)-面试篇
2018前端开发面试备忘录-面试篇 -面试篇 -简历篇 -跳槽选择篇 18年过年之前离职了,在家闲着也没事就去面试了下,试试水. 2018前端开发面试备忘录,主要是查漏补缺,我自己的面试作答,后面会在 ...
- 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)...
前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...
- 【面试篇】ConcurrentHashMap1.7和1.8详解对比
ConcurrentHashMap1.7和1.8详解对比 [面试篇]数据结构-哈希表 [面试篇]HashMap常见面试题目 [面试篇]HashMap1.7和HashMap1.8的详细区别对比 [面试篇 ...
- ⑪(面试篇 2/3)、《史上最全iOS八股文面试题》2022年,金三银四我为你准备了,iOS《1000条》笔试题以及面试题(包含答案)。带面试你过关斩将,(赶紧过来背iOS八股文)
iOS面试题 一共分为笔试题和面试题两部分 笔试题 一共分为10个 总共613题 面试题 一共400题 笔试题 一个10个系列 分别为 ①(语法篇) 共147题 已更新 ②(常识篇) 共72题 已更新 ...
最新文章
- Coding之路——重新学习C++(2):static的详细理解
- 基于词典的逆向最大匹配中文分词算法,更好实现中英文数字混合分词
- 【持久化框架】SpringMVC+Spring4+Mybatis3集成,开发简单Web项目+源码下载【转】
- Codeforces 868F Yet Another Minimization Problem 决策单调性 (看题解)
- (转)无边框窗口实现拖垃效果
- php里怎么添加计时器,如何使用php显示计时器?
- 300米远程深度估计:港科大重磅开源自动驾驶深度感知新技术,远超现有雷达|CVPR2020
- [jQuery] event.stopPropagation()报错
- 河南科技大学计算机系宿舍,河南科技大学宿舍条件怎么样—河南科技大学宿舍图片...
- 推荐几个阿里、美团、腾讯大佬的公众号,一起学习!
- YbSoftwareFactory 代码生成插件【八】:基于JQuery EasyUI、Web Api的 ASP.NET MVC 代码生成插件...
- java阶段培训内容报告_周报告及Java学习笔记
- 深入理解Linux网络技术内幕学习笔记第二章:一些重要的数据结构
- XJTU_选课小助手
- 晶振负载电容是什么意思?关于晶振负载电容
- 辩证的看待IDE工具(Java与Python学习通法)
- linux ssd做raid1,linux 磁盘阵列 raid1搭建教程
- Java汉字转拼音(简繁体转换)库之JPinYin
- python爬虫京东口红销售排行
- 数字网络监控和传统模拟监控的区别