# Spring应用程序有哪些不同组件

  • 接口,定义功能
  • Bean类,它包含属性,setter和getter方法,函数等
  • spring面向切面编程(AOP)-提供面向切面的编程
  • Bean的配置文件-包含类的信息以及如何配置它们
  • 用户程序-它使用接口

# 什么是spring ioc容器?

spring框架的核心是Spring容器,容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期,spring容器使用依赖注入来管理组成应用程序的组件。容器 通过读取提供的配置元数据来接收对象进行实例化,该元数据可以通过XML,java注解或java代码提供

IOC,DI,DL的关系 spring-ioc

spring 启动时读取应用程序提供的bean配置信息,并在spring容器中生成一份相应的bean配置注册表,然后根据这张注册表去实例化bean,装配好bean之间的依赖 关系, 为上层提供准备就绪的运行环境,spring提供一个配置文件,描述bean之间的依赖关系,利用java语言的反射功能去实例化bean,并建立应用程序之间的 依赖关系

# spring IOC支持的功能

  • 依赖注入
  • 依赖检查
  • 自动装配
  • 支持集合
  • 指定初始化方法和销毁方法
  • 支持回调某些方法,这个是略带一些侵入性的,应谨慎使用

# spring IOC的核心接口

  • BeanFactory
  • ApplicationContext

# BeanDefinition

BeanDefinition主要用来描述Bean的定义

BeanDefintion

# 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容器的生命周期流程如下:

  1. Spring容器根据配置中的bean定义中实例化bean。
  2. Spring使用依赖注入填充所有属性,如bean中所定义的配置。
  3. 如果bean实现BeanNameAware接口,则工厂通过传递bean的ID来调用setBeanName()。
  4. 如果bean实现BeanFactoryAware接口,工厂通过传递自身的实例来调用setBeanFactory()。
  5. 如果存在与bean关联的任何BeanPostProcessors,则调用preProcessBeforeInitialization()方法。
  6. 如果为bean指定了init方法(的init-method属性),那么将调用它。
  7. 最后,如果存在与bean关联的任何BeanPosProcessors,则将调用postProcessAfterInittialization()方法。
  8. 如果bean实现DisposableBean接口,当spring容器关闭时,会调用destory()。
  9. 如果为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
  • 销毁过程
  1. 若实现了DisposableBean接口,则会调用destroy方法
  2. 若配置了destry-method属性,则会调用其配置的销毁方法

# AOP的介绍与使用

关注点分离:不同的问题交给不同的部分去解决

# AOP 的三种织入方式

  • 编译时织入:需要特殊的Java编译器,如AspectJ
  • 类加载时织入:需要特殊的Java编译器,如AspectJ和AspectWerkz
  • 运行时织入:Spring采用的方式,通过动态代理的方式,实现简单

# 按属性注入时,字段是private,是如何赋值的

    @Resource(name = "userOracleDao")
    private IUserDao userDao;
或者
@Autowired
    private IUserDao userDao;
1
2
3
4
5

答:IoC反射给属性赋值时,会先将private修改成public,赋值完毕后,再public将修改成private

# 面试题相关导航

java面试题
redis面试题
spring面试题
回到主导航页

# 支持我-微信扫一扫-加入微信公众号

Aseven公众号

# 赞赏作者

赞赏作者