Spring相关面试笔记

Spring

Spring是开源的轻量级Java开发框架.主要分为两个最主要的模块.IOC 控制反转
AOP面向切面编程
IOC指的是把创建对象的过程交给spring来完成.换一个角度,spring把我们需要的对象创建出来给到我们,就叫做依赖注入.这是从两个不同的角度去解释IOC的过程
AOP指面向切面编程,也可以理解为面向方面编程,就是编程的时候只关心我们当前要做的功能,把其他的功能抽取出来,等到最后在进行组装.

Spring比较核心的模块(了解即可)

  1. Spring Core
    核心模块,主要提供IOC依赖注入的功能.
  2. Spring AOP
    提供了面向切面的编程实现
  3. Spring Aspects
    为AspectJ提供技术支持
    AspectJ实际上是对AOP编程思想的一个实践
  4. Spring Data Access/Integration
    Spring-jdbc 提供了对数据库访问的jdbc
    Spring-tx 提供对事物的支持
    Spring-orm 提供对Hibernate等orm框架的支持
    Spring-oxm 提供对Castor等oxm框架的支持
    Spring-jms Java消息服务
  5. Spring Web
    Spring-web 对web功能实现,提供最基本的支持
    Spring-webMVC 提供对SpringMVC的实现
    Spring-webSocket 提供了对WebSocket的支持,可以实现,客户端和服务端双向通信
    Spring-webflux 提供对WebFlux的支持,WebFlux.它与SpringMVC不同,不需要ServletAPI,是完全异步的.
  6. Spring Test
    提供测试模块
    谈谈自己对Spring IOC的理解
    IOC控制反转是一种设计思想.表示将创建对象的控制权交给spring框架来管理.并由IOC容器完成对象的依赖注入.IOC容器就像一个工厂,我们需要一个对象的时候只需要配置好配置文件或者注解即可.
    IOC容器实际上就是个Map(key,value)键值对的形式,Map中存放的是各种对象
    目前来说,主流的是通过SpringBoot注解配置开发.

谈谈自己对AOP的理解(掌握)

将那些与业务无关的,却被业务模块共同调用的逻辑或者责任(例如日志管理,事物处理等)封装起来,减少系统代码的重复性,降低代码的耦合度,有利于未来的可拓展性和可维护性.Spring AOP是基于动态代理的,如果代理的对象,实现了某个接口,AOP就会使用JDK Proxy,去创建代理对象,没实现接口的就没办法通过上述方法创建对象,这时就会使用Cglib生成一个被代理的子类对象来作为代理.当然也可以使用AspectJ

SpringAOP和AspectJ AOP 有什么区别(了解)

SpringAOP属于运行时增强,而AspectJ是编译时增强.SpringAOP基于代理(Proxying),而AspectJ基于字节码操作.
SpringAOP已经集成了AspectJ,AspectJ算是Java生态系统中最完整的AOP框架.AspectJ相比较SpringAOP功能更加强大.SpringAOP相对来说更加简单如果我们的切面少,两者的差距不大.如果切面太多,最好选择AspectJ,它会快很多.

Spring bean(掌握)

什么是bean
简单来说,bean指的是那些被IOC容器管理的对象
一般来说我们需要告诉IoC容器帮助我们管理哪些对象.可以通过配置XML文件或者注解(推荐)或者Java配置类的形式实现

Bean的作用域有哪些
Singleton 唯一bean实例.Spring中默认bean都是的.也是对单例设计模式的一种应用**(掌握)**
Prototype 每次请求都会创建一个bean实例
Request 每次请求都会产生一个新的bean,这个bean只在当前HTTPrequest内有效
Global-session 全局session作用域

单例bean的线程安全问题了解吗(了解)

单例bean的线程安全问题,主要是因为多线程操作同一个对象的时候是存在资源竞争的.
常见的解决办法

  1. 在bean中尽量避免定义可变的成员变量
  2. 在类中定义一个ThreadLocal成员变量,将可变成员变量保存在ThreadLocal中(推荐)
    不过大部分bean实际是无状态(没有实例变量)的(比如Dao,service),这种情况下bean是线程安全的
    @Component和@Bean的区别是什么
    1.@Component注解作用于类 而@Bean注解作用于方法
    2.@Component 通常是通过类路径扫描来自动侦测,以及自动装配到Spring容器中(我们可以使用@CompanentScan注解定 义要扫描的路径.)
    @Bean注解通常是我们在标有该注解的方法中定义产生这个Bean,@Bean告诉spring这是某个类的实例,当我们需要它的时候还给我
    3.@Bean注解比@Component注解自定义性更强,而且很多地方只能通过@Bean注解来注册Bean,比如我们要将第三方类库里的类装到Spring容器中的时候,只能通过@Bean来实现.

**

将一个类声明为bean的注解有哪些

**
一般使用@Autowired注解自动装配Bean,想要把类标识成可@Autowired 注解自动装配的bean的类,采用以下注解可实现
@Component 通用的注解,可标注任意类为Spring组件.如果一个Bean不知道属于哪个层.就可以用这个注解来标注
@Repository 对应持久层即Dao层,主要用于数据库相关的操作
@Service 对应服务层,主要涉及复杂的逻辑,需要用到Dao层
@Controller 对应Spring MVC 主要用于接受用户请求并调用Service层返回数据给前端页面

Bean的生命周期(掌握)

SpringBean的生命周期大致可以分为五个阶段,分别是创建前准备,创建实例化,依赖注入,容器缓存和销毁实例这五个阶段
创建前准备
这个阶段的主要作用是,Bean在开始加载之前要从上下文和一些配置中去解析和查找Bean有关的扩展实现例如init_method这种在容器在初始化Bean的时候会调用的方法,destroy method 容器在销毁bean的时候会调用的方法,以及Bean在加载的过程中会调用的一些前置或者后置的扩展实现.等

创建实例化
通过反射去创建Bean的实例对象,并且会扫描和解析Bean声明的一些属性.

依赖注入阶段
如果被实例化的Bean存在依赖其他Bean对象的一些情况,则需要对这些依赖的Bean进行对象注入.比如常见的@Autowired等配置形式,还会触发一些扩展的调用比如常见的BeanPostProcessor,用来实现bean初始化前后的扩展回调,以及一系列aware的方法

容器缓存阶段
把Bean保存到容器,以及Spring的缓存中,到了这个阶段的Bean就可以被开发者使用了
销毁实例阶段
当Spring’的应用上下文被关闭的时候,上下文中的所有的Bean会被销毁.

说说自己对SpringMVC的理解

MVC是模型,视图,控制器的简写,核心思想是通过将业务逻辑,数据,显示分离来组织代码.我们一般把项目分为Service层(处理业务),Dao层(数据库操作),Entity层(实体类),Controller层(控制层,返回数据给前端页面).

Spring框架中用到了哪些设计模式(掌握)

**工厂设计模式 bean工厂**
**代理设计模式	AOP**
**单例设计模式 bean都是单例的,controller也是单例的**
模板方法模式	以Template结尾的对数据库操作的类,使用了模板设计模式
适配器模式 AOP的增强就用到了适配器模式,SpringMVC中也用到了适配器模式controller
观察者设计模式 Spring事件驱动模型就是观察者模式
包装器设计模式 项目有多个数据库,这种模式可以让用户动态的切换不同的数据源. 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值