# Spring应用程序有哪些不同组件
- 接口,定义功能
- Bean类,它包含属性,setter和getter方法,函数等
- spring面向切面编程(AOP)-提供面向切面的编程
- Bean的配置文件-包含类的信息以及如何配置它们
- 用户程序-它使用接口
# 什么是spring ioc容器?
spring框架的核心是Spring容器,容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期,spring容器使用依赖注入来管理组成应用程序的组件。容器 通过读取提供的配置元数据来接收对象进行实例化,该元数据可以通过XML,java注解或java代码提供
spring 启动时读取应用程序提供的bean配置信息,并在spring容器中生成一份相应的bean配置注册表,然后根据这张注册表去实例化bean,装配好bean之间的依赖 关系, 为上层提供准备就绪的运行环境,spring提供一个配置文件,描述bean之间的依赖关系,利用java语言的反射功能去实例化bean,并建立应用程序之间的 依赖关系
# spring IOC支持的功能
- 依赖注入
- 依赖检查
- 自动装配
- 支持集合
- 指定初始化方法和销毁方法
- 支持回调某些方法,这个是略带一些侵入性的,应谨慎使用
# spring IOC的核心接口
- BeanFactory
- ApplicationContext
# BeanDefinition
BeanDefinition主要用来描述Bean的定义
# BeanDefinitionRegistry
- 提供向IOC容器注册手工BeanDefintion对象的方法
# 什么是依赖注入?
在依赖注入中,你不必创建对象,但必须描述如何创建它们,您不是直接在代码中将组件和服务直接连接在一起,而是描述配置文件中哪些组件需要哪些服务,由IOC容器将 它们装配在一起
# 可以通过多少中方式完成依赖注入
- 构造函数注入
- setter注入
- 接口注入
- 注解注入
# spring 中有多少种IOC容器?
- BeanFactory:就像一个包含bean集合的工厂类,它会在客户端要求实例化bean;
- ApplicationContext:ApplicationContext接口扩展了BeanFactory接口,它在BeanFactory基础上提供了一些额外的功能
# BeanFactory
- 提供了IOC的配置机制
- 包含Bean的各种定义,便于实例化Bean
- 建立Bean之间的依赖关系
- Bean生命周期的控制
BeanFactory是Spring框架中最核心的接口,它提供了IOC的配置机制,
# BeanFactory与ApplicationContext的比较?
ApplicationContext是BeanFactory的子接口之一,在Spring的体系中,BeanFactory和ApplicationContext是最为重要的接口设计
- BeanFactory是Spring框架的基础设施,面向Spring本身
- ApplicationContext面向使用Spring框架的开发者
# ApplicationContext的功能(继承了多个接口)
- 继承了BeanFactory:能够管理、装配Bean
- 继承了ResourcePatternResoler:能够加载资源文件
- 继承了MessageSource:能够实现国际化功能
- 继承了ApplicationEventPublisher: 能够注册监听器,实现监听机制
标注了Autowired的注解,它会根据属性的内容,在spring容器中找到对应的bean,进行注入,它注入的机制,最基本的一条就是根据类型进行注入。 @Componet注解是告诉spring容器,注入到spring容器中,以供使用
# SpringIOC的refresh源码解析
this.refreshContext()
# spring bean容器的生命周期是什么样的?
spring bean容器的生命周期流程如下:
- Spring容器根据配置中的bean定义中实例化bean。
- Spring使用依赖注入填充所有属性,如bean中所定义的配置。
- 如果bean实现BeanNameAware接口,则工厂通过传递bean的ID来调用setBeanName()。
- 如果bean实现BeanFactoryAware接口,工厂通过传递自身的实例来调用setBeanFactory()。
- 如果存在与bean关联的任何BeanPostProcessors,则调用preProcessBeforeInitialization()方法。
- 如果为bean指定了init方法(的init-method属性),那么将调用它。
- 最后,如果存在与bean关联的任何BeanPosProcessors,则将调用postProcessAfterInittialization()方法。
- 如果bean实现DisposableBean接口,当spring容器关闭时,会调用destory()。
- 如果为bean指定了destroy方法(的destroy-method属性),那么将调用它。
# 什么是spring装配
当bean在Spring容器中组合在一起时,它被称为装配或bean装配。Spring容器需要知道需要什么bean以及容器应该如何使用依赖注入来将 bean绑定在一起,同时装配bean。
# @Component,@Controller,@Repository,@Service有何区别?
@Component:这将java类标记为bean。它是任何Spring管理组件的通用构造型。spring的组件扫描机制现在可以将其拾取并将其拉入
应用程序环境中。
@Controller:这将一个类标记为Spring Web MVC 控制器。标有它的Bean会自动导入到IoC容器中。
@Service:此注解是组件注解的,它不会对@Component注解提供任何其他行为。您可以在服务层类中使用@Service而不是@Component,
因为它以更好的方式指定了意图。
@Repository:这个注解是具有类似用途和功能的@Component注解。它为DAO提供了额外的好处。它将DAO导入IoC容器,并使未经检测的
异常有资格转换为Spring DataAccessException。
# @Required注解有什么用?
@Required应用bean属性setter方法。此注解仅指示必须在配置时使用bean定义中的显示属性值或使用自动装配填充受影响的bean属性。 如果尚未填充受影响的bean属性,则容器将抛出eanlnitalizationException。
# @Autowired注解有什么用?
@Autowired可以更准确地控制应该在何处以及如何进行自动装配。此注解用于在setter方法,构造函数,具有任意名称或多个参数的属性 或方法上自动装配bean。默认情况先,它是类型驱动的注入。
# Spring getBean的方法代码逻辑
- 转换beanName
- 从缓存中加载实例
- 初始化bean
- 检测parentBeanFactory
- 初始化依赖的Bean
- 创建Bean
# Spring Bean的作用域
- singleton:spring 的默认作用域,容器里拥有唯一的Bean实例,适合无状态的bean,无状态就是:没有共享字段
- prototype:针对每个getBean请求,容器都会创建一个Bean实例,适合有状态的bean,有状态就是:有字段
- request: 会为每个Http请求创建一个Bean实例
- session: 会为每个session创建一个Bean实例
- globalSession:会为每个全局Http Session创建一个Bean实例,该作用域仅对Portlet有效
# spring bean的生命周期
- 创建过程 实例化bean-->Aware(注入bean ID、BeanFactory和AppCtx)-->BeanPostProcessor(s).postProcessBefore
- 销毁过程
- 若实现了DisposableBean接口,则会调用destroy方法
- 若配置了destry-method属性,则会调用其配置的销毁方法
# AOP的介绍与使用
关注点分离:不同的问题交给不同的部分去解决
# AOP 的三种织入方式
- 编译时织入:需要特殊的Java编译器,如AspectJ
- 类加载时织入:需要特殊的Java编译器,如AspectJ和AspectWerkz
- 运行时织入:Spring采用的方式,通过动态代理的方式,实现简单
# 按属性注入时,字段是private,是如何赋值的
@Resource(name = "userOracleDao")
private IUserDao userDao;
或者
@Autowired
private IUserDao userDao;
2
3
4
5
答:IoC反射给属性赋值时,会先将private修改成public,赋值完毕后,再public将修改成private
# 面试题相关导航
java面试题
redis面试题
spring面试题
回到主导航页