失效链接处理 |
Java高级工程师面试大全 PDF 下载
本站整理下载:
相关截图:
主要内容:
Spring框架的七大模块
Spring Core:框架的最基础部分,提供 IoC 容器,对 bean 进行管理。
Spring Context:继承BeanFactory,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化等功能。
Spring DAO:提供了JDBC的抽象层,还提供了声明性事务管理方法。
Spring ORM:提供了JPA、JDO、Hibernate、MyBatis 等ORM映射层.
Spring AOP:集成了所有AOP功能
Spring Web:提供了基础的 Web 开发的上下文信息,现有的Web框架,如JSF、Tapestry、Structs等,提供了集成
Spring Web MVC:提供了 Web 应用的 Model-View-Controller 全功能实现。
Bean定义5种作用域
singleton(单例) prototype(原型) request session global session
spring ioc初始化流程?
resource定位 即寻找用户定义的bean资源,由 ResourceLoader通过统一的接口Resource接口来完成 beanDefinition载入 BeanDefinitionReader读取、解析Resource定位的资源 成BeanDefinition 载入到ioc中(通过HashMap进行维护BD) BeanDefinition注册 即向IOC容器注册这些BeanDefinition, 通过BeanDefinitionRegistery实现
BeanDefinition加载流程?
定义BeanDefinitionReader解析xml的document BeanDefinitionDocumentReader解析document成beanDefinition
DI依赖注入流程? (实例化,处理Bean之间的依赖关系)
过程在Ioc初始化后,依赖注入的过程是用户第一次向IoC容器索要Bean时触发
如果设置lazy-init=true,会在第一次getBean的时候才初始化bean, lazy-init=false,会容器启动的时候直接初始化(singleton bean);
调用BeanFactory.getBean()生成bean的;
生成bean过程运用装饰器模式产生的bean都是beanWrapper(bean的增强);
依赖注入怎么处理bean之间的依赖关系?
其实就是通过在beanDefinition载入时,如果bean有依赖关系,通过占位符来代替,在调用getbean时候,如果遇到占位符,从ioc里获取bean注入到本实例来
Bean的生命周期(bean的创建过程)?
实例化Bean:Ioc容器通过获取BeanDefinition对象中的信息进行实例化,实例化对象被包装在BeanWrapper对象中
设置对象属性(DI):通过BeanWrapper提供的设置属性的接口完成属性依赖注入;
注入Aware接口(BeanFactoryAware, 可以用这个方式来获取其它 Bean,ApplicationContextAware):Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给bean
BeanPostProcessor:自定义的处理(分前置处理和后置处理)
执行InitializingBean接口的afterPropertiesSet()方法
<bean init-method =xxx> 执行我们自己定义的初始化方法,调用它配置的init-method方法,还有执行@PostConstruct 注解的方法在,在构造函数之后执行,init()方法之前执行。
使用bean
执行 DisposableBean 接口的实现类的destroy()方法
destroy:bean的销毁
IOC:控制反转:将对象的创建权,由Spring管理. DI(依赖注入):在Spring创建对象的过程中,把对象依赖的属性注入到类中。
Spring的IOC注入方式
构造器注入 setter方法注入 注解注入 接口注入
Spring的bean怎么解决线程安全问题?
1.spring容器本身没有提供bean的线程安全策略,因此,可以说spring容器的bean不是线程安全的。
2.如何处理:
针对spring的bean的作用域,singleton,prototype,request,session,global-session分别不同处理:
☐ 对于prototype作用域,每次都生成新的对象,就不存在线程安全问题
☐ singleton是单例的,默认是线程不安全,但是对于开发中大部分的bean是无状态的,不需要保证线程安全
【无状态表示中国实力没有属性对象,是不变的类,比如controller,service,dao是不需要属性对象的】
【有状态,表示有属性对象,可以保存数据,比如pojo】
要保证线程安全,可以把bean作用域改成prototype,比如想modelAndView;另外还有使用ThreadLocal为每个线程保存一个副本变量,每个线程只操作自己的副本变量。
怎么检测是否存在循环依赖?
Bean在创建的时候可以给该Bean打标,如果递归调用回来发现正在创建中的话,即说明了循环依赖了。
Spring如解决Bean循环依赖问题?
Spring中循环依赖场景有:
构造器的循环依赖
属性的循环依赖
singletonObjects:第一级缓存,里面放置的是实例化好的单例对象;earlySingletonObjects:第二级缓存,里面存放的是提前曝光的单例对象;singletonFactories:第三级缓存,里面存放的是要被实例化的对象的对象工厂
创建bean的时候Spring首先从一级缓存singletonObjects中获取。如果获取不到,并且对象正在创建中,就再从二级缓存earlySingletonObjects中获取,如果还是获取不到就从三级缓存singletonFactories中取(Bean调用构造函数进行实例化后,即使属性还未填充,就可以通过三级缓存向外提前暴露依赖的引用值(提前曝光),根据对象引用能定位到堆中的对象,其原理是基于Java的引用传递),取到后从三级缓存移动到了二级缓存完全初始化之后将自己放入到一级缓存中供其他使用。核心代码就在DefaultSingletonBeanRegistry的getSingleton()方法。
|