1、什么是spring
Spring:包含有多个技术的生态。
可以构建java应用 所需要的的基础设施。
但是通常说的是springframe
• 核心解释:
1. Spring frame: Spring底层技术容器框架,是其他spring技术的基础,所有技术都依赖spring框架才能运行;
2. spring是为了解决企业开发业务各层和对象直接耦合的问题;
ioc控制翻转为解决耦合问题
3. spring是ioc 和aop的容器框架,
4. aop面向切面,做增强。
5. 容器:包含并管理应用对象的生命周期
技术生态--基础:framework--目的--ioc、aop-容器
2、spring有什么优缺点?
ioc - 1. 集中管理对象 2. 对象与对象之间耦合度降低 3. 方便维护对象。方便单例设置、懒加载等bean对象的配置 ##### aop 在不修改代码的情况下对业务进行增强,减少重复代码,提高开发效率,维护方便 在增删改查中添加方法的监控,等和主要业务不想关的公共功能,没有aop就得到代码中修改,使用aop就可以在不修改代码的情况下增强,并且减少重复的代码。 ###### 声明事务 4. 提高开发效率,可以从单调烦闷的事务代码中解脱出来,只需@Transactonal注解 ###### 测试 5. 方便程序的测试,可以结合junit非常方便的测试Springbean ###### 优秀框架 6. 集成优秀的框架,有非常强大的集成功能,只需简单配置就可以完成第三方集成,归功于底层有非常多的扩展接口 ###### 降低javaEEapi使用难度 7. 简化开发,封装很多功能性代码,jdbc,异步调用 ###### 学习 8. spring底层反射、设计模式都是值得学习,提供非常多的扩展接口供外部拓展 ##### 缺点 简化开发,应用层面是没有缺点的,但是简化开发上层使用越简单底层代码就越复杂,很难深入了解底层,集成很多拓展点,和代码迭代,代码量非常庞大。二、Spring IOC
3、控制翻转的作用
作用:集中管理对象,方便维护,解耦降低耦合度
控制翻转,控制了什么?对象的创建,以前由程序员new创建对象,但是由程序员维护就非常复杂,同时耦合度太高很不方便。所以ioc实现的话,由spring容器进行维护,省去复杂的步骤
实现了解耦:交给ioc创建,bean对象实现高内聚低耦合的特征,再通过DI注入@Autowired实现自动注入等于就是程序员把对象的控制能力交给程序。
4、spring ioc实现机制
工厂+反射;工厂设计模式:通过一个方法创建相应的对象并返回。
反射讲完整类路径放进去,
5、spirng ioc和di区别?
ioc控制翻转,控制对象的创建权。交由spring控制,然后通过autowired注入。di是实现ioc重要的一环。 Spring最新全家桶面试题
6、紧耦合和松耦合有什么区别?
方便更换;
紧耦合:
紧密耦合是指类之间高度依赖。
松耦合:
松耦合是通过设计原则,面向对象的五大原则三大特性,
单一职责:将不同功能代码抽取到一个类。
接口分离原则:模块间通过抽象类接口隔离开,鼠标更换、
依赖倒置:
的设计原则来实现的。
7、BeanFactory的作用
BeanFactory是Spring中非常核心的一个顶层接口; 它实现了简单工厂的设计模式,通过调用getBean传入标识生产一Bean,它的主要职责就是生产Bean; 它有非常多的实现类、每个工厂都有不同的职责(单一职责)功能; BeanFactory它也是容器 Spring容器(管理着Bean的生命周期)
8、BeanDefinition的作用
bean的定义信息、指标,bean是哪种类,id是什么,作用域是单例,是不是懒加载的,是不是抽象的,自动装配方式等很多属性都可以进行配置;还可以配置需要注入的属性值。都称作bean的定义信息,在创建bean之前需要拿到bean的定义信息读入到beandefinition中配置一个bean就会产生一个beandefinnation,多了就会用map进行存储,后续就交给bean工厂进行处理,所以它决定着bean的生产方式
newapplication之前,会对定义文件进行读取,beandefination封装定义指标,最后由bean工厂生产对应的对象。
9、BeanFactory 和 ApplicationContext有什么区别?4s、工厂
生产bean,也是一个容器,管理bean的生命周期。applicationcontext称作bean的上下文。也可以说是spring的容器也管理着spring的声明周期。两个都有getbean方法因为app实现了beanfactory的接口。application生产bean需要通知beanfactory方法,一般使用context,因为做的事情更多, context可以自动注入为beandifination,factory需要手动注入。 1注册2环境变量3多语言4事件监听5对外扩展 factory:优点,内存占用小,用于嵌入式设备
BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。 依赖关系 BeanFactory:是Spring里面最顶层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。BeanFactory 简单粗暴,可以理解为就是个 HashMap,Key 是 BeanName,Value 是 Bean 实例。通常只提供注册(put),获取(get)这两个功能。我们可以称之为 “低级容器”。 ApplicationContext 可以称之为 “高级容器”。因为他比 BeanFactory 多了更多的功能。他继承了多个接口。因此具备了更多的功能。例如资源的获取,支持多种消息(例如 JSP tag 的支持),对 BeanFactory 多了工具级别的支持等 待。所以你看他的名字,已经不是 BeanFactory 之类的工厂了,而是 “应用上下文”, 代表着整个大容器的所有功能。该接口定义了一个 refresh 方法,此方法是所有阅读 Spring 源码的人的最熟悉的方法,用于刷新整个容器,即重新加载/刷新所有的 bean。 ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能。
10、beanfacory和fanctorybean的区别?
BeanFactory是一个工厂,也就是一个容器,是来管理和生产bean的; FactoryBean是一个bean,但是它是一个特殊的bean,所以也是由BeanFactory来管理的, 它是一个接口,他必须被一个bean去实现,可以理解成一个工厂方法,是一个能产生或者修饰对象生成的工厂Bean,里面的getObject()就是用来获取FactoryBean产生的对象。所以在BeanFactory中使用“&”来得到FactoryBean本身,而factorybean本身变成懒加载。
**IOC容器的加载过程**
从概念态--->定义态的过程 1、创建一个spring的容器:实例化一个ApplicationContext的对象; 2:调用bean工厂后置处理器(invoke)完成扫描,解析配置类; 3:循环解析扫描出来的类信息。class信息,其中有@componet注解会被注册为beandefination; 4、实例化一个BeanDefinition对象来存储解析出来的信息存入map对象; 5、把实例化好的beanDefinition对象put到beanDefinitionMap当中缓存起来, 以便后面实例化bean; 6、再次调用其他bean工厂后置处理器; 从定义态到纯净态 7:当然spring还会干很多事情,比如国际化,比如注册BeanPostProcessor等 等,如果我们只关心如何实例化一个bean的话那么这一步就是spring调用 finishBeanFactoryInitialization方法来实例化单例的bean,实例化之前spring要做验证, 需要遍历所有扫描出来的类,依次判断这个bean是否Lazy,是否prototype,是否 abstract等等; 8:如果验证完成spring在实例化一个bean之前需要推断构造方法,因为spring实 例化对象是通过构造方法反射,故而需要知道用哪个构造方法; 9:推断完构造方法之后spring调用构造方法反射实例化一个对象;注意我这里说 的是对象、对象、对象;这个时候对象已经实例化出来了,但是并不是一个完整的bean, 最简单的体现是这个时候实例化出来的对象属性是没有注入,所以不是一个完整的bean; 从纯净态到成熟态 10:spring处理合并后的beanDefinition 11:判断是否需要完成属性注入 12:如果需要完成属性注入,则开始注入属性 初始化 13、判断bean的类型回调Aware接口 14、调用生命周期回调方法 15、如果需要代理则完成代理 创建完成 16、put到单例池——bean完成——存在spring容器当中
每一条bean的语句,通过invokebeanfacrotypostprocessors(解析配置类中的注解,获取包中所有的.class文件,检索其中的component转换成beandefination。 然后交给beanfactory生产bean,调用getbean通过工厂设计模式生产bean。过程中会判断是否符合生产标准,{单例、不是懒加载、不是抽象}才会在ioc加载过程进行生产。
然后进行实例化。和属性赋值也就是di的实现,会根据自动注入的类型,最后进行初始化会存入map中,key是bean的名字,value是bean的对象getkey就可以拿到当前bean
11.你知道Spring的哪些扩展点,在什么时候调用?
扩展接口的种类,注册beandefination过程当中,可以用来动态注册beandefintion的beandefinitionregistryPostProcessor可以注册bean定义的扩展接口,还有可以拿到bean工厂做任何扩展的一个beanfactorypostprocess,在注册bean定义时候会调用这两个扩展接口。
然后在bean生产的过程当中,会调用9次bean后置处理器,beanpostprocessor成为bean的后置处理器。
然后在初始化阶段,会调用很多aware接口。会调用很多的生命周期回调方法,就是初始化和销毁的回调方法



