1 什么是Spring:

  • 概念: 一个轻量级开源的java框架,提供开发中提供一站式轻量级开发平台,目标是开发高内聚低耦合的系统
  • 核心思想:①IOC控制反转,由IOC容器负责对象和资源的创建及管理,应用程序只需要依赖IOC容器即可,这样在程序运行期间IOC容器可通过DI技术动态给应用程序提供运行时所需的对象,实现解耦,这意味着有之前的主动创建变成了被动接收②AOP:面向切面编程,也就是在程序运行期间,将指定的代码(四类通知方法)动态的插入到方法的指定位置(方法运行前,方法异常,方法返回时,finally块),这种设计具有高重用性和扩展性
  • 采取的策略:四种基本策略①基于POJO低侵入式编程②ioc控制反转+面向接口编程实现低耦合③基于切面和管理进行声明式编程④模板和切面减少重复

2 Spring依赖注入DI和IOC容器
最易懂的Spring IOC原理讲解

3 spring优点

  • 基于POJO低侵入式编程
  • ioc控制反转+面向接口编程实现低耦合
  • 不排斥其它优秀框架
  • 声明式事物管理,只需要一个注解即可完成事物
  • 支持junit4,方法测试
  • 降低java开发难度
    缺点:①大量使用注解使得程序运行效率低②难度大

4 bena组件的各个属性

  • id:唯一标识一个组件
  • class:组件所对应的类
  • scope:bean的作用域是通过scope进行声明的,有五种,如下
1 单实例模式singleton:是scope的默认值,在容器初始化时就已经加载并实例化了所有组件(如果是懒加载,也就是在类上标注了@Lazy后,那么就在获取对象时加载这个组件),
之后程序中使用组件直接去容器中拿,无论调用多少次最终拿到的都是同一个对象,当容器关闭时则销毁里面的组件,可以理解为组件的单例模式,但同一个类多个组件,同一组件
无论获取多少次只能获取一个组件,不同组件还是可以拿到不同的对象的2 原型模式prototype:容器初始化时不实例化组件,之后每次从容器中通过getBean()获取组件时再实例化对象,所以每次调用都是获取到的都是不同的对象# 以下两种只适合于webApplicationContext环境下
3 request:每次http请求都会创建一个新的bean对象,不同的请求对应不同的bean对象
4 session:同一个session域共享一个bean,不同session对应不同的bean
  • name:可忽略
  • autowired:通过ref相当于手动为引用类型的属性赋值,而autowired则相当于让该组件自动去容器中找对应的组件,完成自动装配,装配策略如下
案例:Book类中有一个属性private Car car
byName:通过名字来寻找,也就是以属性名作为id,去容器中寻找,相当于ioc.getBean('car'),
byType:以类型为依据去容器中寻找,相当于ioc.getBean(Car.class),如果容器有多个这种类型的组件就会报错
constructor:以构造器参数为依据类型去寻找,找不到返回null,找到了多个按参数名进行匹配返回
  • lazy-init:懒加载,单例模式下会在容器启动时加载组件,懒加载则是在获取组件对象时再加载
  • parent:表示配置信息继承于xxx组件
  • depend-on:表示依赖哪个组件,被依赖的组件和依赖的组件之间不考虑代码位置顺序,一定是被依赖组件先被创建
  • factory-method:工厂方法名,通过这个组件class来标识一个工厂类,相当于通过这个工厂的静态方法直接来创建对象,适用于静态工厂
  • factory-bean:指定工程类,和factory-method搭配使用
  • init-method:组件初始化方法,该方法必须位于pojo类中,顺序参考下文。
  • init-destory:组件销毁方法,该方法必须位于pojo类中,顺序参考下文。

补充:
① bean组件配置的子标签property是属性标签,组件就指默认调用setter方法来进行赋值,property有以下属性:

  • name代表属性名:这是由setter/getter方法决定的,如setLastName,那么这个bean的名称就叫lastName
  • ref:如果这个属性是个pojo类型的属性,那么通过情况在这个bean的外部定义一个bean,用ref引用外部这个bean
  • value是为这个属性赋的值;

② bean组件的子标签constructor,则是代表使用有参构造器来为属性赋值,name和value与property标签中的作用相同

5 bean组件的依赖关系

6 从对象创建的角度深入分析

单实例对象:构造方法 -> setter方法(如果bean组件有propertiy标签时)
->后置器BeanPostProcessor处理的before方法 -> 初始化方法init-method,此时对象初始化工作完毕
-> AOP ->获取代理类对象xxxProxy
-> 后置处理器的After方法 -> 容器关闭接着调用销毁方法 destory-method
  • 解析类(通过ComponentScan解析那种被@Controller等注解修饰的类)得到BeanDefination
  • 推断类的构造器,通过构造器初始化对象
  • 对@AutoWired修饰的属性进行对象填充
  • 回调Aware,比如BeanNameAware,相当于让创建好的bean组件知道自己的名字等属性
  • 执行BeanPostProcessor的前置方法
  • 执行初始化init-method方法
  • 通过AOP获取代理类对象
  • 执行beanProcessor的前置的后置方法,至此组件创建工作基本完毕,如果时单例模式那么需要将创建好的bean放入到单例池中
  • 使用bean
  • ioc容器关闭,调用destory-method

2 spring的事物传播属性

事物的传播行为:事物主要是在service层中,当前一个方法运行在一个开启事物的方法中是,是选择使用事物方法原有的事物,还是选择自己开启一个新事物
REQUIRE_NEW: 不管什么情况,都需要创建一个新的独立事物,如果当前所在方法中存在事物,那么要关挂起事务
REQUIRE:默认值,m1调用m2,如果m1中有事物,m2直接使用m1中的事物,如果m1没有事物,m2在创建自己的事物,这样保证整体的原子性
REQUIRE_NEVER:以非实物方法运行,有事物则报错
REQUIRE_SUPPORT:支持当前事物,没有的话就以非事物方法运行

参考文章:事务的三种并发问题及四种隔离级别

3 spring如何解决中文乱码
GET请求乱码问题在tomcat的配置文件夹下的server.xml文件中配置,如果是tomcat8及以上版本就不需要这一步

<!--    配置一个字符编码过滤器,此类过滤器一般都在其他Filter之前,因为POST请求编码设置需要在请求发起前进行编码设置-->
<!--    而HiddenHttpMethodFilter的工作机制是先发起请求,这样的话put和delete请依然会存在乱码问题--><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--        针对全部的POST请求的乱码解决方式(GET请求乱码问题在tomcat的配置文件夹下的server.xml文件中配置)--><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
<!--        forceEncoding顺手解决响应乱码问题,但只是设置了 --><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping>
<!--        按以上字符编码规则过滤所有的请求和响应--><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

扩展

<!--    #javaweb中:post请求乱码解决如下-->
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");

8 spring的组成
spring core:包含IOC和DI功能的核心包
spring aop:AOP功能的核心包
spring test:juint4测试包
spring jdbc:简化jdbc操作
spring web :简化web层操作
spring beans:提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称为Bean。
spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法。

9 spring中用到的设计模式

  • 工厂模式
  • 动态代理
  • 建造者模式
  • 单例模式
  • 观察者模式

10、Spring IoC 的实现机制
Spring 中的 IoC 的实现原理就是工厂模式加反射机制。

11 BeanFactory 和 ApplicationContext有什么区别?
ApplicationContext是BeanFactory的子接口,BeanFactory是Spring最底层的接口,主要任务是赋值实例的初始化,懒加载,依赖管理,生命周期;ApplicationContext在其基础上还支持国际化,配置文件夹加载…

12 ApplicationContext通常的实现是什么?

  • FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。

  • ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。

  • WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。

14 IoC 和 DI 的关系
IoC 是 Spring 中一个极为重要的概念,而 DI 则是实现 IoC 的方法和手段。DI的实现方式如下

  • 构造器注入
public class UserController {private UserService userService;public UserController(UserService userService){this.userService = userService;}
}
<bean name="userController" class="com.learning.controller.UserController">  <!-- 依赖注入 -->  <constructor-arg ref="userService"></constructor-arg>
</bean>
<bean name="userService" class="com.learning.dao.impl.UserServiceImpl"></bean>  
  • setter注入,参考案例如下
public class UserController {// 注入 UserService 对象private UserService userService;public void setUserService(UserService userService){this.userService = userService;}
}
<bean name="userController" class="com.learning.controller.UserController">  <!-- 依赖注入 -->  <property name="userService" ref="userService"></property>
</bean>
<bean name="userService" class="com.learning.dao.impl.UserServiceImpl"></bean>
  • 注解注入
@Controller
public class UserController {// 使用注解自动注入@Autowired()private UserService userService;// do something
}// 创建依赖对象
@Service
public class UserService {// do something
}

15 AOP
16 五大通知方法
参考:https://blog.csdn.net/wwwwwww31311/article/details/113577090

17 @Value 注解的作用是什么?

答:基于 @Value 的注解可以读取 properties 配置文件,使用如下:

@Component 和 @Bean 有什么区别

  • 前者是作用于类上,表示动态的侦测并装配该类路径下的对象资源
  • 后者作用于配置类的配置方法上,配置类@Configuration修饰,等价于spring.xml,相当于Spring中的ioc容器,@Bean修饰的方法等于xml配置文件中的bean组件,相当于告诉spring这是某个类的实例,当我需要这个对象资源时就把它给我,因此它的作用域比前者更广,例如某些第三方类库就可以通过@Bean装配都IOC容器中

Spring中如何实现事物

  • 声明式事务管理:Spring的AOP原理,这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。优点是低侵入式编程,方便维护和管理,灵活性低,体现在配置上必须统一配置,范围只能作用在方法范围
  • 编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。

15.Spring 中的 Bean 是线程安全的吗?

答:Spring 中的 Bean 默认是单例模式,Spring 框架并没有对单例 Bean 进行多线程的封装处理,因此默认的情况 Bean 并非是安全的,最简单保证 Bean 安全的举措就是设置 Bean 的作用域为 Prototype(原型)模式,这样每次请求都会新建一个 Bean。

详细参考:https://blog.csdn.net/wwwwwww31311/article/details/115296736

16.Spring 声明式事务无效可能的原因有哪些?

  • MySQL 使用的是 MyISAM 引擎,而 MyISAM 是不支持事务的;
  • @Transactional 使用在非 public 方法上,@Transactional 注解只能支持 public 级别,其他类型声明的事务不会生效,或者@Transactional 在同一个类中无事务方法 A() 内部调用有事务方法 B(),那么此时 B() 事物不会生效。
  • 方法的调用者并非是aop创建的代理类对象,比如使用了this,而没有通过自动装配来获取到组件

15.Spring 中的 Bean 是线程安全的吗?

答:Spring 中的 Bean 默认是单例模式,Spring 框架并没有对单例 Bean 进行多线程的封装处理,因此默认的情况 Bean 并非是安全的,最简单保证 Bean 安全的举措就是设置 Bean 的作用域为 Prototype(原型)模式,这样每次请求都会新建一个 Bean。

16 组件的生命周期
1 容器启动时实例化组件
2 依赖注入,通过构造器,setter,组件,工厂模式…
3 后置处理器的before方法
4 初始化方法init
5 后置处理器的after方法
6 容器关闭时调用destory方法

class => 推断构造方法,利用反射进行对象实例化,此后的两步相当于对实例化对象的加工 =>通过DI依赖注入属性填充 => init-method,执行完这一步可以获得完整的bean => 判断是否受AOP切面影响,AOP动态代理获取bean的代理类对象 => bean

17 什么是Spring beans?
Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。

18 ①Spring定义bean的几种方式

  • Set方法注入;
  • 构造器注入;
  • 静态工厂注入;
  • 实例工厂;
  • 基于注解@Controller,@Service,@Component

②依赖注入的几种方式

  • 通过@Autowired自动装配,进行构造器注入,setter注入,方法参数注入,接口实现类对象注入
  • 通过setter注入
  • 通过constructor注入
  • 通过静态工厂注入
  • 通过实例工厂注入

19 如何给Spring 容器提供配置元数据?Spring有几种配置方式

  • XML配置文件。
  • 基于注解的配置。
  • 基于java的配置。

20 @Autowired注解
本质:容器会在自动包扫描路线下扫描带有这个注解的属性,一单发现这个组件就要去容器中找到相应的组件并进入注入,相当于给这个属性赋值
功能:用于给指定字段(field,setter,constructor,method’s param)注入所需的外部资源,完成自动装配,默认是①byType,如果同一类型有多个组件再以byName的方式寻找,可以通过@Qualifier和@AutoWired进行指定组件名称的查找②如果没找到会报错,只有设置required=false才可以

21 @Autowired注解和@Resource区别

  • 作用范围不相同(field,setter,constructor,method’s param)
@Autowired作用域:@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})@Resource作用域:@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
  • 策略不同,前者默认按类型操作,如果找到多个再按组件名字查找,或者通过@Qualifier判断,后者默认按名字查找,即使没有指定名字也会安装注解作用的对象名来匹配,按默认组件名没有查找到再按类型查找

22 java对象,javaben,springbean区别

  • java对象是java类的对象,如String对象,Integer对象,Map对象…
  • javabean,特殊的java对象,自定义类,属性全为private,对外提供getter和setter方法
  • springbean:在spring容器中定义bean组件,在应用程序中通过主动获取或者

23 spring常见的设计模式

  • 简单工厂模式,通过BeanFactory的getBean方法,传入一个对象名即可获取到对象
  • 工厂模式:一些实现了factorybean并重写getObject方法的对象,再次通过getBean加载对象时获取的不是这个bean,而是调用这个bean中重写的getObject方法获取到对象
  • 适配器模式:通过请求到handlerMapping中获取到handler后根据handlerAdaptor获取到该handler的适配器,并根据适配器调用hander中的方法进行处理
  • 观察者模式:Spring的事件驱动组件,如listerner的实现
  • 代理模式:①aop获取代理类对象②sql映射文件对象
  • 单例模式:加载beanFacory,也就是加载ioc容器时保证只加载一份

24 spring的事物实现方式
①编程式,手动编写事物

try{connection.setAutoCommit(false); //aop前置方法,关闭自动提交operation sql   //执行sql语句,aop主方法connection.commit()  //aop后置方法,手动提交
}catch(Exception e){connection.rollback();//aop异常方法,出现异常回滚
}finally{connection.close();//aop结束方法,归还连接到连接池
}

②声明式,通过@Transactional注解来,被该组件修饰的类最终被加载到ioc容器的不失原生的bean,而是通过aop的cglib生成的代理类对象,同时将通知方法(关闭自动提交,回滚,手动提交,关闭资源)切入到了核心方法(sql操作语句)中,通过代理类对象执行的就是事物方法

25 sping事物无效

  • 事物本身时通过AOP机制,获取到service的代理类对象,由代理类对象执行的才是事物方法,所有,如果我们使用this来调用就相当于普通的调用,解决方式通过@Autowired将service对象注入进来
  • 事物方法是非public
  • 当前service并未注册到ioc容器中
  • 方法中的异常被try-catch处理了
  • 数据库本身不支持事物


26 实现一个IOC容器

  • 配置自动包扫描路径
  • 使用注解,如@mapper,@service,@controller在被扫描的路径下定义相关的类
  • 反射期间获取这些类的.class文件,存储在一个Set集合中
  • 遍历Set集合,如主要是通过反射期间调用构造器构造这些对象,并用一个安全的map集合进行存储,期间还要判断对象中是否还依赖其它的实例,是的话就递归注入
  • 如果有@Autowired修饰的属性按照@Autowiired为他们注入相关的对象

Spring重点面题总结相关推荐

  1. Leetcode重点250题

    LeetCode重点250题 这个重点题目是把LeetCode前400题进行精简.精简方法如下: 删除不常考,面试低频出现题目 删除重复代码题目(例:链表反转206题,代码在234题出现过) 删除过于 ...

  2. access 使用dsn 连接字符串_致正在备考Access的你,学习重点和题库以及b站优课请查收!...

    现在就学习! 请问你是否是正在为备考Access正在苦恼? 或者对这个软件感兴趣? 还是想屯点资料备用? 一定要划到底!! 以下是我整理的关于Access的好资源 请各位朋友查收噢! 01 数据库复习 ...

  3. 史上最全Spring面试71题与答案

    1.什么是spring? Spring是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring框架目标是简化Java企业 ...

  4. Spring 青鸟云题库

    @Autowired默认byType,@Resource byname 此题考察的是SpringIoC三种注入方式. SpringIoC三种注入方式:接口注入,设值注入,构造注入,没有指针注入这一说法 ...

  5. Spring重点总结

    文章目录 IOC创建对象 依赖注入DI 构造器注入 set注入 Bean的自动装配 注解开发 Java配置xml 代理模式 AOP 整合Myabatis spring配置事务 spring其实就是容器 ...

  6. spring单元测试无法注入bean_2019年,最新的Spring 面试108题 “ 系列 ”,附带答案.........

    选择使用Spring框架的原因? 使用Spring: 第一是使用它的IOC功能,在解耦上达到了配置级别. 第二是使用它对数据库访问事务相关的封装. 第三就是各种其他组件与Spring的融合,在Spri ...

  7. Spring面试基础题

    1. 你有没有用过Spring的AOP? 是来干嘛的? 大概会怎么使用? 答:(1)有 (2)用来实现横切关注点与他们所影响的对象之间的解耦 横切关注点:横切关注点是散布于应用中多处的功能.(横切关注 ...

  8. Java中Spring面试基础题20190302

    1. 说说Spring? 答:Spring的核心是IOC/DI(控制反转.依赖注入),Aop(面向切面).相当于把每个bean与bean之间的关系交给第 三方容器进行管理. 2.说SpringIOC. ...

  9. C语言 第六章 指针 重点 典型题

    一.概念 二.重点代码 三.重点题目 1.若有说明:int *p,m=5,n;,以下程序段正确的是( ) A.  p=&n; scanf("%d",&p); B.  ...

最新文章

  1. Windows Mobile常用程序代码(串口、图象、网络、3D、数据库、音频视频等等)
  2. jupyter notebok 调用本目录下的其他py文件
  3. CodeForces - 1291D Irreducible Anagrams(思维+构造)
  4. 10835k1_行政组织学_21秋考试
  5. python __iter____next__
  6. 力扣-1046 最后一块石头的重量
  7. Java 如何使用protobuf
  8. Linux9.0下构建FTP服务器
  9. 配置JAVA的环境变量
  10. 压缩word文档大小的方法?
  11. DRM in Android详解--转
  12. MATLAB 设置msgbox若干秒后自动关闭
  13. html实现圆形计时器特效,如何用css3实现圆形倒计时
  14. 软件设计师-数据结构知识
  15. 【01Studio MaixPy AI K210】6.PWM
  16. Linux 网络协议栈开发—— 二层桥实现原理
  17. 灵活组合复合图元模板,电路图状态图业务定义可配置,浮云E绘图软件源码开发
  18. 2022飞鱼科技--鱼苗夏令营实习--游戏客户端--一面(已挂)
  19. 老司机 iOS 周报 #56 | 2019-02-25
  20. 5G边缘云在营销领域的投资机遇

热门文章

  1. 大话图像处理之入门篇
  2. 机器学习中的数学(七)--凸优化的基础知识
  3. 7-234 两个有序序列的中位数 (25 分)
  4. PTA6、输出10个不重复的英文字母 (10 分)
  5. 在Linux下使用Vim编写C++
  6. 在Linux 中编写并运行C语言
  7. JavaWeb项目实战(2)安装JDK和Tomcat以及Eclipse构造开发环境
  8. mimo+matlab代码,mimo-matlab代码
  9. php 采集百度,PHP抓取百度内容有哪些方法
  10. git服务器文件同步,利用git让服务器网站与本地同步 ssh配置