什么是spring
- spring 是一个轻量级的java开发框架
- spring的根本使命就是解决企业级应用开发的复杂性,即**简化Java开发**
- spring的核心就是**IOC控制反转(依赖注入 DI注入)和AOP**面向切面编程
- 为了降低Java的开发的复杂度,采取了四种策略
- 基于pojo 的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模板减少版式代码
spring框架是设计目标 设计理念 核心
- Spring设计目标:为开发者提供一个一站式轻量级应用开发平台
- Spring设计理念:支持POJO和JavaBean开发模式,使应用面向接口开发,充分支持面向对象设计方法,Spring通过IOC容器实现对象耦合关系的管理
- Spring框架的核心:IOC容器和AOP模块
spring的优缺点
优点
- 方便解耦 简化开发 :将对象的创建和以来关系的维护交给Spring
- AOP编程的支持 :方便的实现对程序进行权限拦截、运行监控等
- 声明式事务的支持 :只需要通过配置就可以完成对事物的管理 无需手动编程
- 方便程序的测试 :可以通过注解方便的测试Spring程序
- **方便集成各种优秀的框架 **:不排斥开源框架 内部提供了直接支持
- 降低javaeeAPI的使用难度 :对javaee中难用的API都提供了封装
缺点
- Spring是轻量级的框架 却给人感觉大而全
- Spring依赖反射 但是**反射 影响性能**
- 使用门槛高,入门时间较长
Springu框架中都用到了那些设计模式
- 工厂模式:BeanFactory就是简单的工厂模式
- 单例模式:Bean默认为单例模式
- 代理模式:AOP用到了JDK的动态代理和CGLIB字节码生成技术
- 模板方法:解决代码重复问题
- 观察者模式:建立一对多模式,一个对象改变,所有依赖他的对象都会被动更新
什么是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的几种方法
- Set方法注入
- 构造器注入:可以通过index来设置参数的位置 也可以通过type设置参数的类型
- 静态工厂注入
- 实力工厂
Spring框架中的单例bean是线程安全吗
不是线程安全的
Spring框架并没有对单例bean进行多线程的封装处理
那些事重要的bean生命周期方法,能都重载
- setup:在容器加载bean的时候被调用
- 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
- 静态代理:就是AOP框架在编译阶段生成AOP代理类,因此成为==编译时增强。==在编译阶段将切面(AspectJ)织入Java字节码中。运行的就是增强后的对象
- 动态代理:就是AOP框架不会修改字节码,俄日是在每次运行时在内存中临时为方法生成一个AOP对象。这个对象包含目标对象的全部方法,在特定切点做增强处理。并且回调原对象的方法
JDK动态代理和CGLIB动态代理的区别
- JDK动态:只提供接口的代理,不支持类的代理
- 如果代理类没有实现 InvocationHandler 接口,SpringAOP会选择使用CGLIB来动态代理目标类。他是一个代码生成的类库,可以在运行是动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP