- 1.Spring的优缺点是什么?
- 2.Spring由哪些模块组成?
- 3.Spring 框架中都用到了哪些设计模式?
- 4.详细讲解一下核心容器(Spring context应用上下文)
- 5.详细说说Spring IOC容器?
- 6.Spring Ioc的实现机制
- 7.BeanFactory和ApplicationContext有什么区别?
- 8.依赖注入的方式有哪些?
- 9.Spring框架中的单例bean是线程安全的吗,如果线程不安全,怎么解决的?
- 10.Spring bean的生命周期?
- 11.Spring AOP的原理?
- 12.使用AOP的例子,具体怎么实现的?
- 13.SpringBoot自动装配的过程?
- 14.Spring Aop什么时候会失效?
1.Spring的优缺点是什么?
1).方便解耦,简便开发
2).AOP编程的支持Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
3).声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程。
4)集成各种优秀框架
2.Spring由哪些模块组成?
主要由Core Container(核心容器)、AOP、设备支持、数据访问与集成、
Web、消息、Test
3.Spring 框架中都用到了哪些设计模式?
1.工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象实例;
2.单例模式:Bean默认为单例模式
3.代理模式:Spring的Aop用到了JDK的动态代理和CGLIB字节码生成技术
4.模板方法:用来解决代码重复问题。比如RestTemplate、JmsTemplate、JpaTemplate
5.观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有
依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现-ApplicationListener
4.详细讲解一下核心容器(Spring context应用上下文)
这是最基本的Spring模块,提供Spring框架的基础功能,BeanFactory是任何以Spring为基础的应用的核心。
Bean工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离。
5.详细说说Spring IOC容器?
控制反转即IOC,他把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现
对象组件的装配和管理。所谓的”控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移
到了外部容器。
作用:
1).解耦,由容器本身去维护具体的对象
2).托管了类的产生过程,比如我们需要在类的产生过程中做一些处理,最直接的例子就是代理
,如果有容器程序可以把这部分处理交给容器,应用程序则无需去关心类是如何完成代理的。
控制反转:
就是依赖倒置原则的一种代码设计思路。具体采用的方法就是所谓的依赖注入。
1.松耦合
Spring将各层的对象以松耦合的方式组织在一起,Action对象无需关心service对象的具体实现,
Service对象无需关心持久层对象的具体实现,各层对象的调用完全面对接口。当系统需要重构的
时候,代码的改写量将大大减少。
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.依赖注入的方式有哪些?
构造函数注入,setter注入
9.Spring框架中的单例bean是线程安全的吗,如果线程不安全,怎么解决的?
不是线程安全的,Spring中bean默认是单例模式,Spring框架并没有对实例bean进行多线程的封装处理。
一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以
声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决
线程安全问题。
ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了”时间换空间”
的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。而ThreadLocal
采用了”时间换空间”的方式。
ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突,因为每一个线程
都有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写
多线程代码时,可以把不安全的变量封装进ThreadLocal。
10.Spring bean的生命周期?
在传统的java应用中,bean的生命周期很简单。使用java关键字new进行bean实例化,然后该bean就可以使用了。
一旦该bean不再被使用,则由java进行自动垃圾回收。相比之下,Spring容器中的bean的生命周期就显得相对
复杂多了。正确理解Spring bean的生命周期非常重要,因为你或许要利用Spring提供的扩展点来定义bean的创建
过程。下图展示了bean装载到Spring应用上下文中的一个典型的生命周期过程。
实例化—->填充属性—->调用BeanNameAware的setBeanName()方法—->调用BeanFactoryAware的setBeanFactory()方法
—->调用ApplicationContextAware的setApplicationContext()方法—->调用BeanPostProcessor的预初始化方法
—->调用InitializingBean的afterPropertiesSet方法—->调用自定义的初始化方法—->
调用BeanPostProcessor的初始化后方法—->bean可以使用了—->容器关闭—->
调用DisposableBean的destory方法—->调用自定义的销毁方法—->完成
对流程详解:
1.Spring启动,查找并加载需要被Spring管理的Bean,进行Bean的实例化
2.Bean实例化后对Bean的引入和值的注入到Bean的属性中
3.如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
4.如果bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory()
方法,将BeanFactory容器实例传入
5.如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplication
6.如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
7.如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
8.如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
9.此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
10.如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。
11.Spring AOP的原理?
使用动态代理,代理有jdk动态代理和cglib代理
jdk动态代理使用反射技术生成代理类,cglib代理使用字节码技术。
12.使用AOP的例子,具体怎么实现的?
日志管理:
1.使用@Aspect注解来定义一个日志切面类
2.使用@PointCut配置切入点,配置自定义注解,或者包扫描
3.配置通知(一般用环绕通知),通知上配入切点,即使用切入点去触发通知
自定义注解原理:
使用反射去或者所有该注解的方法
13.SpringBoot自动装配的过程?
看收藏夹