* ❖ Spring 的核心是控制反转(IOC) 和 面向切面编程(AOP)
*
* ❖ Spring 由20多个模块组成,它们可以分 Data Access/Integration、Web(MVC)、AOP、Aspects、Instrumentation、Messaging、Core Container 和 Test.
*
* ?Spring有哪些特定?
* ◇ Spring 具有非侵入性、容器(加载配置文件、Bean生命周期、Bean的作用域、线程安全性)、IOC(概念、IOC的过程)、AOP(定义、实现方式、事务管理[管理事务的方式、事务 的传播特性、事务的隔离级别])、
*
* ?Spring作为容器盛放Bean的,Bean通常在XMl中定义,Spring如何加载XML的?
* ➢ ApplicationContext接口和BeanFactory接口都定义加载配置文件的方法,两者以下的区别。
* ▹ ApplicationContext容器,会在容器对象初始化时,将其中的所有对象一次性全部装配好。
* --以后代码中若是使用到这些对象,只需要从内存中直接获取即可.执行效率较高。但占用内存。
* ▹ BeanFactory容器,对容器中对象的装配与加载采用延迟加载策略,即在第一次调用getBean()时,才真正装配该对象。
*
* ?描述一下Bean的生命周期?
* ▹ 实例化
* -容器通过BeanDefinition对象中的信息进行实例化;
* -实例化的对象被包装在BeanWrapper对象中;
* ▹ 设置属性
* -BeanWrapper对象提供了设置对象属性的接口;
* ▹ 初始化
* ▹ 销毁
*
* ?Spring创建的Bean是单例的还是多例的?
* ▹ 这个是通过 scope 属性,为Bean指定特定的作用域。Spring中支持5中作用域:
* ▵ singleton: 单例模式,即在整个Spring容器中,只有一个实例。该Bean是在容器被创建时即被装配好了。
* ▵ prototype: 原型模式,即每次使用getBean方法获取的同一个Bean的实例都是一个新的实例。
* ▵ request: 对于每次Http请求,都将会产生一个不同的Bean实例。
* ▵ session: 对于每个不同的HttpSession,都将会产生一个不同的Bean实例。
* ▵ global session: 每个全局的Http session对应一个Bean实例.仅在使用,portlet集群时有效。
*
* ?Spring创建的Bean是如何处理线程安全性的?
* ▹ Spring 是没有对Bean的多线程安全问题作出任何保证和措施的;
* ▹ 不要在Bean中声明任何有状态的实例变量或类变量;
* ▹ 如果必须如此的话,那么就使用ThreadLoad把变量变为线程私有的;
* ▹ 如果Bean的实例变量或者类变量需要在多个线程之间共享,那么就只用使用 synchronized、lock、CAS等这些实现线程同步的。
*
* ?描述一个你对IOC的理解?
* ◆ IOC:Inversion of Control 调用者不创建被调用者的实例,而是由Spring容器创建被调用者并注入调用者。
* ◆ IOC是一个概念,是一种思想,当前比较流行的实现方式有DL和DI。
* ➢DL(Dependency Lookup)依赖查找
* -容器提供回调接口和上下文环境给组件,比较典型的因公是JNDI.
* ➢DI(Dependency Injection)依赖注入
* -是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,
* 而是依赖于外部容器,由外部容器创建后传递给程序。
* ✮ Soring DI = 工厂 + 反射 + 配置文件;来完成的。
*
* ?Spring是如何实现的IOC的??
* ◆ Spring 启动时读取应用程序,提供的Bean配置信息;
* ◆ 在 Spring 容器中生成一份相应的 Bean配置注册表;
* ◆ 根据这张注册表实例化 Bean,装配好Bean之间的依赖关系,为上层应用提供 准备就绪的运行环境;
* ◆ 其中Bean缓存池为HashMap实现.
*
* ?Spring循坏依赖是如何解决的?
* ▹ 循环依赖在,就是两个或者多个Bean之间相互持有对象的引用,形成了环装的结构。
* ▹ Spring 对于属性方式的,引用采用的三级缓存机制(1级-存储完整bean对象 2级-存储半成品bean对象 3级-Bean工厂对象),可以解决循环引用的问题。
* ▹ Spring 对于构造函数的方式,造成的循环引用是不能解决的。
*
* ?谈一下,对Spring Aop 的理解:
* Aop:面向切面编程就是将交叉业务逻辑封闭成切面,利用AOP的功能将切面织入到主业务逻辑中。
* ▵ 面向切面编程是面向对象编程OOP的一种补充;
* ▵ 面向对象是从静态角度考虑程序的结构;
* ▵ 面向切面编程是从动态角度考虑程序运行过程;
* ▵ AOP底层,就是采用动态代理模式实现的。
*
* ?Spring 如何实现的AOP(谈一下代理模式吧)?
* ◆ 代理类和被代理类实现共同的接口(或继承);
* ◆ 代理类中存有指向被被代理类的引用,实际执行时通过代理类的方法、实际执行的是被代理类的方法;
* ◆ Spring 提供两种方式来生成代理对象: JDKProxy 和 Cglib(底层ASM,动态码策略);
* ◆ 默认的策略是如果目标类是接口,则使用JDK动态代理技术,否则使用 Cglib来生成代理;
*
* ?项目中什么业务场景使用到了 AOP ?
* 1、Authentication 权限
* 2、Caching 缓存
* 3、Context passing 内容传递
* 4、Error handing 错误处理
* 5、Lazy loading 懒加载
* 6、Debugging 调试
* 7、logging,tracing,profiling and monitoring 记录跟踪、优化、校准
* 8、Performance optimization 性能优化
* 9、Persistence 持久化
* 10、Resource pooling 资源池
* 11、Synchronization 同步
* 12、Transactions 事务
*
* ?Spring 的 AOP?
* ? Spring 是如何管理AOP-事务的.(指管理DAO层的事务,隐式关联数据库的事务关系)
* 1、直接调用事务的API;
* 2、直接事务代理工厂bean管理TransactionProxyFactoryBean
* 3、基于事务的注解管理@Transactional
* 4、基于AspectJ AOP配置事务
*
* ?Spring设置事务的隔离级别?
* 1、Default : 采用DB默认的事务隔离级别.Mysql默认Repeatable_Read(RR)可重复读;Oracle默认Read_Committed(RC)
* 2、Read_Uncommitted(RU): 读未提交,未解决任何并发问题。
* 3、Read_Committed(RC): 读已提交,解决脏读,存在不可重复读与幻读。
* 4、Repeatable_Read(RR): 可重复读。解决脏读,不可重复读,存在幻读。
* 5、Serializable: 串形化,不存在并发问题。
*
* ?Spring 如何管理事务的传播行为的:
* ‣ 所谓事务传播行为是指,处于不同事务中的方法在相互调用时,执行期间事务的维护情况.
* ‣ 如,A事务中的方法 doSome()调用 B 事务中的方法 doOther();
* ‣ 事务传播行为是加在方法上的;
* ‣ Spring管理事务的传播行为一种七种;
*
* 1-Required : 指定的方法必须在事务内执行。若当前有事务则加入,没有则新建,默认的传播行为。(仅存有一个事务)
* 2-Requires_new : 总要新建一个事务,若当前存在事务,就将当前事务挂起,直到新事务执行完毕。(完全两个事务,内外事务互不干扰)
* 3-Nested : 指定的方法必须在事务内执行。若当前存在事务,则在嵌套事务内执行;若当前没有事务,则创建新事务。(内部事务是外部事务的一部分)
*
* 4-Supports : 指定的方法支持当前事务,但若当前没有事务,也可以以非事务方式执行。
* 5-Mandatory : 指定的方法必须在当前事务内执行,若当前没有事务,则直接抛出异常。
* 6-Not_Supported : 指定的方法不能在事务环境中执行,若当前存在事务,就将当前事务挂起。
* 7-Never : 指定的方法不能在事务环境下执行,若当前存在事务,就直接抛出异常。
*
* 传播特性 适用场景
* Required(必需的) : 将操作合并在一个事务内,任何一部分出现问题就一起回滚。
* Requires_new : 完全是两个事务,内外事务互不干扰;如果内部事务发生回滚,外部事务不受影响,如果外部事务发生回滚,内部事务正常提交。
* Nested(嵌套的) : 内部事务是外部事务的一部分;如果内部事务发生回滚,则只回滚内部事务的部分,如果外部事务发生回滚,会将内外部事务一起回滚。
*
* ?Spring中体现的设计模式??
* ?开发过程中,使用过那些设计模式??
* 设计模式(Design pattern) 代表了最佳的实际。是软件开发人员在软件开发过程中面临的一般问题的解决方案。
* 这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的,可以借鉴。
*
* 1-工厂设计模式 : Spring使用工厂模式通过 BeanFactory、 ApplicationContext 创建Bean对象;
* 2-代理设计模式 : Spring Aop 功能的实现;
* 3-单例设计模式 : Spring 中的 Bean 默认都是单例的;
*
* MVC MVC MVC MVC MVC
* SpringMVC的运行原理?
* 描述SpringMVC的执行过程?
* ◇ Spring 的模型-视图-控制器(MVC)框架是围绕一个 DispatcherServlet 来设计的;
* ◇ 这个 Servlet 会把请求分给各个处理器;
* ◇ 支持可配置的处理器映射、视图渲染、本地化、文件上传等。
* ?SpringBoot的配置文件有哪些规定??
* ◇ SpringBoot的核心文件是 Application 和 Bootstrap 配置文件;
* ◇ Application 配置文件,主要用于Spring Boot项目的自动化配置;
* ◇ Bootstrap 系统级别的一些参数配置,里面的属性不能被覆盖;
* ◇ Bootstrap 由父 ApplicationContext 加载,比 Application 优先加载;
* ◇ 配置文件的格式上有 yml 和 properties 两种配置文件;
* ◇ .yml格式不支持 @PropertySource注解导入配置;
*
* ?SpringBoot 如何自动加载配置文件的?
* Spring boot 的开启注解是:@SpringBootApplication,其实它就是由下面三个注解组成的:
* ◦ @Configuration : 它是Spring自带的,实现配置文件的功能;
* ◦ @ComponentScan : Spring 组件扫描的注解;
* ◦ @EnableAutoConfiguration : 打开自动配置的功能,也可以关闭某个自动配置的选项
* -此注解自动载入应用程序所需的所以Bean-这依赖于Spring Boot在类路径中的查找,
* -它能根据类路径下的 jar 包和配置,动态加载配置和注入 Bean。
*
* ??SpringCloud 和 SpringBoot 的关系 ?
*
* ◆ Spring boot 是Spring的一套快速配置脚手架,可以基于Springboot开发单个微服务。
* ◆ Spring cloud 是一个基于Springboot实现的云应用开发工具.
*
* ◆ Spring boot 专注于快速、方便集成的单个微服务个体。
* ◆ Spring cloud 关注全局的服务治理框架。
*
* ◆ Spring boot 使用了约束大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置。
*
* ◆ Spring cloud 很大的一部分是基于Spring boot来实现。
* ◆ Spring boot 可以离开Spring cloud 独立使用开发项目,但是Spring cloud离不开 Spring boot。
点击-源代码Spring地址:CodeChina
点击-源代码SpringBoot地址:CodeChina