Spring面试题

什么是spring

  1. spring 是一个轻量级的java开发框架
  2. spring的根本使命就是解决企业级应用开发的复杂性,即**简化Java开发**
  3. spring的核心就是**IOC控制反转(依赖注入 DI注入)和AOP**面向切面编程
  4. 为了降低Java的开发的复杂度,采取了四种策略
    1. 基于pojo 的轻量级和最小侵入性编程
    2. 通过依赖注入和面向接口实现松耦合
    3. 基于切面和惯例进行声明式编程
    4. 通过切面和模板减少版式代码

spring框架是设计目标 设计理念 核心

  • Spring设计目标:为开发者提供一个一站式轻量级应用开发平台
  • Spring设计理念:支持POJO和JavaBean开发模式,使应用面向接口开发,充分支持面向对象设计方法,Spring通过IOC容器实现对象耦合关系的管理
  • Spring框架的核心:IOC容器和AOP模块

spring的优缺点

优点

  • 方便解耦 简化开发 :将对象的创建和以来关系的维护交给Spring
  • AOP编程的支持 :方便的实现对程序进行权限拦截、运行监控等
  • 声明式事务的支持 :只需要通过配置就可以完成对事物的管理 无需手动编程
  • 方便程序的测试 :可以通过注解方便的测试Spring程序
  • **方便集成各种优秀的框架 **:不排斥开源框架 内部提供了直接支持
  • 降低javaeeAPI的使用难度 :对javaee中难用的API都提供了封装

缺点

  • Spring是轻量级的框架 却给人感觉大而全
  • Spring依赖反射 但是**反射 影响性能**
  • 使用门槛高,入门时间较长

Springu框架中都用到了那些设计模式

  1. 工厂模式:BeanFactory就是简单的工厂模式
  2. 单例模式:Bean默认为单例模式
  3. 代理模式:AOP用到了JDK的动态代理和CGLIB字节码生成技术
  4. 模板方法:解决代码重复问题
  5. 观察者模式:建立一对多模式,一个对象改变,所有依赖他的对象都会被动更新

什么是SpringIOC容器

控制反转就是IOC,他把传统是自己new创建对象全部交给容器,由容器开实现对对象的配置和管理

SpringIOC负责创建对象。管理对象(依赖出入,装配对象。配置对象)并且管理对象的生命周期

控制反转IOC有什么用

  • 管理对象的创建和依赖关系
  • 解耦 由容器来维护具体对象
  • 托管类的产生过程,最直接的例子就是代理

IOC的优点

  • 把应用的**代码量降到最低**
  • 让应用**更容易测试**,单元测试不需要单例和JNDI查找机制
  • 用**最小的代码最小的侵入性松散耦合得以实现**
  • IOC支持加载符其实的**饿汉式初始化****和懒汉式初始化**

SpringIOC的实现机制

原理就是 工厂模式反射机制

IOC支持哪些功能

  • 依赖注入
  • 依赖检查
  • 自动装配
  • 支持集合
  • 支持指定初始化方法和销毁方法

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

  • XML配置文件
  • 基于注解的配置
  • 基于Java的配置

解释Spring支持的几种bean的作用域

  • singleton:bean在每个SpringIOC容器中只有一个实例
  • prototype:一个bean的定义可以有多个实例
  • request:每次请求都会创建一个bean,仅在web的SpringApplicationContext的情形下有效
  • session:在一个Session中,一个bean对应一个实例,作用域同上
  • global-session:在一个全局Session中,yigebean定义一个对应实例

什么是bean装配

在Spring容器中把bean组装到一起,前提是**容器需要知道bean的依赖关系** 如何通过依赖注入装配在一起

使用Spring有哪些方式

  • 一个成熟的SpringWeb应用程序
  • 作为第三方Web框架,使用SpringFrameworks中间层
  • 企业级JavaBean,包装现有的POJO
  • 远程使用

依赖注入有什么优势

  • 查找定位操作与应用代码完全无关
  • 不依赖于容器的API,可以很容易的在任何容器以外使用应用对象
  • 不需要特殊接口,绝大多是对象可以做到完全不必依赖容器

有哪些不同类型的依赖注入实现方式

  • 接口注入:灵活性和易用性比较差 在Spring4时被废弃
  • 构造器依赖注入:通过**容器出发类的构造器**(构造函数)实现。
  • Setter方法注入:容器通过无参构造或者午餐static工厂方法实例化bean后,调用bean的setter方法

最好是用**构造器参数实现强制依赖** setter方法实现可选依赖

Spring基于xml注入bean的几种方法

  1. Set方法注入
  2. 构造器注入:可以通过index来设置参数的位置 也可以通过type设置参数的类型
  3. 静态工厂注入
  4. 实力工厂

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

不是线程安全的

Spring框架并没有对单例bean进行多线程的封装处理

那些事重要的bean生命周期方法,能都重载

  1. setup:在容器加载bean的时候被调用
  2. teardown:在容器卸载类的时候被调用

bean有两个属性 ==init-method==和 destroy-method 可以用他们来自定义初始化和注销方法

也可以用相应的注解 @PostConstruct和**@PreDestroy**

自动装配有哪些局限性

  • 重写:总是要重写自动装配
  • 数据类型基本数据类型string字符串等 不能自动装配
  • 特性:不如显示装配精确 建议使用显示装配

怎样开启注解装配

默认是不开启的 需要在Spring配置文件中配置

<context:annotation-config/>

如果不开启 @controller @service @RequestMapping() 就用不了了

Spring事务支持有哪些

  • 编程式事务管理:通过编程的方式管理事务,极大的灵活性但是很难维护
  • 声明式事务管理:将业务代码和事务管理分离,只需要用注解XML配置管理事务

Spring事务的实现方式和实现原理

本质是数据库对事务的支持

数据库的事务提交和回滚是通过binlog和redolog实现的

Spring框架事务管理的优点

  • 为不同的事务提供一个不变的编程模式 如JTA JDBC JPA 等
  • 为编程式事务管理提供简单的API
  • 支持声明式事务管理
  • 和数据访问抽象层有很好的集成

倾向那种事务管理

大多是人选择声明式,因为他对应用代码的影响最小,更符合一个无侵入的轻量级容器思想

声明式优于编程式,虽然少了一些灵活性。

SpringAOP和AspectJAOP的区别,有那些实现方式

AOP的实现在于代理模式,代理分为动态代理静态代理动态代理的代表是SpringAOP

静态代理的代表是AspectJ

  1. 静态代理:就是AOP框架在编译阶段生成AOP代理类,因此成为==编译时增强。==在编译阶段将切面(AspectJ)织入Java字节码中。运行的就是增强后的对象
  2. 动态代理:就是AOP框架不会修改字节码,俄日是在每次运行时在内存中临时为方法生成一个AOP对象。这个对象包含目标对象的全部方法,在特定切点做增强处理。并且回调原对象的方法

JDK动态代理和CGLIB动态代理的区别

  • JDK动态:只提供接口的代理,不支持类的代理
  • 如果代理类没有实现 InvocationHandler 接口,SpringAOP会选择使用CGLIB来动态代理目标类。他是一个代码生成的类库,可以在运行是动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值