1. 什么是spring?

两大功能,依赖注入和面向切面编程(DI & AOP)

为了降低 Java 开发的复杂性,Spring 采取了以下4种关键策略

  • 基于 POJO 的轻量级和最小侵入性编程;

  • 通过依赖注入和面向接口实现松耦合;

  • 基于切面和惯例进行声明式编程;

  • 通过切面和模板减少样板式代码;

优点

  • 方便解耦,简化开发,可以将所有对象的创建和依赖关系的维护,交给 Spring 管理。

  • Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。

  • 声明式事务的支持只需要通过配置就可以完成对事务的管理,而无需手动编程。

  • 方便程序的测试,可以通过注解方便的测试Spring程序。

  • 方便集成各种优秀框架。(如:Struts、Hibernate、MyBatis等)

  • Spring 对 JavaEE 开发中非常难用的一些API(JDBC、JavaMail、远程调用 等),都提供了封装,使这些API应用难度大大降低。

缺点

  • Spring依赖反射,反射影响性能

  • 使用门槛升高,入门 Spring 需要较长时间

1、依赖注入和面向接口编程,实现了程序上的松耦合;

2、AOP 面向切面编程和注解的形式,实现声明式编程,减少样板式代码;

3、IOC 容器和依赖注入,简化开发,能够让程序员专注于业务;


2. Spring由哪些模块组成?

spring core:IOC 容器 + DI 依赖注入;

spring beans:BeanFactory,提供管理 bean 的功能;

spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法吗,spring 常用的注解都在这个包中;

spring jdbc:提供了一个JDBC的抽象层,消除了烦琐的 JDBC 编码和数据库厂商特有的错误代码解析,用于简化 JDBC;

spring aop:提供面向切面编程的功能;

spring web:提供了针对 Web 开发的集成特性;

spring test:提供测试功能;


3. Spring 框架中都用到了哪些设计模式?

1、单例模式:bean 默认是单例模式;

2、工厂方法模式:BeanFactory 创建 bean 实例;

3、模板方法模式:这可太多了,几乎每一个虚构类及其子类的实现,都实现了该模式;

4、动态代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术;

5、观察者模式:Spring 中 listener 的实现,ApplicationListener;定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新;

实际上,spring 作为一个非常优秀的框架,基本实现了所有的设计模式;


4. Spring框架中有哪些不同类型的事件

1、ContextRefreshedEvent:容器刷新的时候,触发该事件;

2、ContextStartedEvent:容器加载完成,开始工作的时候,触发该事件;

3、ContextStoppedEvent:容器停止的时候,触发该事件;

4、ContextClosedEvent:容器关闭的时候,触发该事件;


5. 什么是 Spring IOC 容器?

1、管理对象的创建和依赖关系的维护;

2、解耦,由容器去维护具体的对象;

Spring 中的【DefaultListableBeanFactory】类就是常说的 IOC 容器;

DefaultListableBeanFactory 类当中有很多 ConcurrentHashMap;

Map 中的 key 是 String 类型,一般都是 bean 对应类名首字母小写,value 就是 bean 对象;


6. Spring IOC 的实现机制

Spring 中的 IOC 的实现原理就是工厂模式加反射机制;


7. BeanFactory 和 ApplicationContext有什么区别?

BeanFactory 和 ApplicationContext 是 Spring 的两大核心接口,都可以当做 Spring 的容器;

其中 ApplicationContext 是 BeanFactory 的子接口;

BeanFactory:是 Spring 里面最底层的接口,包含了各种 Bean 的定义信息,读取 bean 配置文档,管理 bean 的加载、实例化,控制 bean 的生命周期,维护 bean 之间的依赖关系;

ApplicationContext:作为 BeanFactory 的派生,除了提供 BeanFactory 所具有的功能外,还提供了更完整的框架功能:

  • 继承MessageSource,因此支持国际化,统一的资源文件访问方式。

  • 提供在监听器中注册bean的事件。

  • 同时加载多个配置文件。

  • 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的 web 层。


8. 一个 Spring Bean 定义信息包含什么?

bean 定义信息也就是 BeanDefinition 接口的实现类,用于存储创建一个 bean 所需的元数据、bean 的生命周期、bean 的依赖;

spring 首先从 xml 配置文件或者注解形式或者 Java 代码配置的方式,获取将要创建的 bean 的定义信息,封装为 BeanDefinition 接口实现类;

这些 BeanDefinition 存储在 DefaultListableBeanFactory 中;

当 spirng 开始创建这些 bean 的时候,就从 DefaultListableBeanFactory 中取出 BeanDefinition 集合;

依次遍历该集合,调用执行 createBean 方法;


9. 怎样定义类的作用域?

当定义一个在 Spring 里,我们还能给这个 bean 声明一个作用域;

它可以通过 bean 定义中的 scope 属性来定义;

如,当 Spring 要在需要的时候每次生产一个新的 bean 实例,bean 的 scope 属性被指定为 prototype;

另一方面,一个 bean 每次使用的时候必须返回同一个实例,这个 bean 的 scope 属性必须设为 singleton;


10. Spring框架中的单例bean是线程安全的吗?

不是线程安全的;

spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理;

单例在多线程的情况下意味着不要设置没有 final 关键字修饰的成员变量,如果必须使用,就需要程序员自己处理可能出现的多线程问题;


11. Spring 如何处理线程并发问题?

使用 ThreadLocal 处理线程并发问题;


12. 使用@Autowired注解自动装配的过程是怎样的?

在启动 spring IOC 时,容器自动装载了一个 AutowiredAnnotationBeanPostProcessor 后置处理器;

当容器扫描到 @Autowied、@Resource 时,就会在IoC容器自动查找需要的 bean,并装配给该对象的属性;

  • 如果查询结果刚好为一个,就将该bean装配给 @Autowired 指定的数据;

  • 如果查询的结果不止一个,那么 @Autowired 会根据名称来查找;

  • 如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false;


备注:本文内容部分来自马士兵学院、大厂学院,部分是我自己的理解和体会,感兴趣的同学,可以百度搜索马士兵或者大厂学院;


Spring 常见问题 - 1的更多相关文章

  1. Spring常见问题总结

    1. 什么是 Spring 框架? Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性.Spring 官网:https://spring.io/. 我们一般说 Sprin ...

  2. spring常见问题

    问题1:提示说:cvc-elt.1: Cannot find the declaration of element 'beans' 解决方法:从网上搜了一些,有的说是因为网络原因访问不到xsd文件,因 ...

  3. 【面试】【Spring常见问题总结】【09】

    81.SimpleJdbcTemplate SimpleJdbcTemplate类也是基于JdbcTemplate类,但利用Java5+的可变參数列表和自己主动装箱和拆箱从而获取更简洁的代码. Sim ...

  4. 【专访】【Spring常见问题汇总】【05】

    种: 传播行为:传播行为定义了client与彼调用方法之间的事务边界. 隔离级别:隔离级别定义了一个事务可能受其它并发事务影响的程度. 仅仅读:表明事务是否是仅仅读的. 事务超时:指定事务执行的最长时 ...

  5. Struts+Hibernate+Spring常见问题

    http://wanglihu.iteye.com/blog/1897718 1.java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisi ...

  6. 【面试】【Spring常见问题总结】【07】

    [常见面试问题总结文件夹>>>] 61.Spring IoC容器的依赖有两层含义: Bean依赖容器:也就是说Bean要依赖于容器,这里的依赖是指容器负责创建Bean并管理Bean的 ...

  7. Spring常见问题大全

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

  8. Spring常见问题(五)

    1.静态资源访问配置 绝对路径:访问静态资源. <mvc:resources location="/js/" mapping="/js/**">&l ...

  9. Spring常见问题-通配符的匹配很全面, 但无法找到元素 'aop:aspectj-autoproxy' 的声明

  10. [Spring常见问题]java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

    这个问题是因为部署在tomcat下的项目中没有springweb包 但是问题来了,但是我的项目中有呀,maven都引了呀,然后我就懵B啦!看到这个博客我就豁然开朗了:http://my.oschina ...

随机推荐

  1. DDD(三)DDD实战、贫血模型与充血模型

    DDD(三)DDD实战.贫血模型与充血模型 如果觉得样式不好:跳转即可 http://www.lifengying.site/(md文件复制过来有些样式会不一样) 贫血模型与充血模型 1.贫血模型:一 ...

  2. 在linux环境中安装node,npm,express

    linux安装node 连接运程命令: 进入usr/local 文件夹 cd /usr/local 1.下载 wget https://nodejs.org/dist/v14.17.6/node-v1 ...

  3. TypeScript String(字符串)

    TypeScript String(字符串) String 对象用于处理文本(字符串). 语法 var txt = new String("string"); 或者更简单方式: v ...

  4. centos7部署elasticsearch-7.16.2分布式集群(此版本修复了log4j2漏洞)

    简介 Elasticsearch 是一个分布式.RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例. 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之 ...

  5. Ajax JavaScript传参-javascript加载本地文件

    get请求需要拼接到url里面 post请求,需要放到send方法里面,后端取值的时候,Ajax用JavaScript传输跟用postman传输,取值方式有些区别,这里做一下详细记录 传参格式{'id ...

  6. npm config get prefer-offline

    npm config get prefer-offline

  7. 解决:pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it‘s not in your PATH. See README file for more information.

    问题:使用pytesseract库识别图片中文字时出现报错 代码: import pytesseract from PIL import Image,ImageEnhance img=Image.op ...

  8. Word技巧:ALT+X快捷键

    Word技巧:ALT+X快捷键 在Word中输入数字,然后使用键盘快捷键「ALT + X」,即可快速生成一个文字图形. 部分数字的对比参照: 2564 ╤ 2582 ▂ 2600 2618 ☘ 256 ...

  9. 【APT】Bitter APT组织针对巴基斯坦航空综合部门攻击活动分析

    前言 蔓灵花(Bitter)是一个被广泛认为来自印度的APT组织,该组织长期针对我国及巴基斯坦的政府.军工.电力.核等部门发动网络攻击,窃取敏感数据,具有较强的政治背景.本次分享一个蔓灵花组织针对巴基 ...

  10. Mysql存储类型长度

    分析MySQL数据类型的长度 MySQL有几种数据类型可以限制类型的"长度",有CHAR(Length).VARCHAR(Length).TINYINT(Length).SMALL ...