Spring知识汇总(面试题)

IoC和DI概述

IoC(Inversion of Control )中文翻译叫作控制反转,也可以叫作依赖注入
控制反转首先需要理解的就是工厂模式反射,另外需要说明就是Spring的Bean简单来说就是一个类的实例化对象。
控制反转中控制指的的是什么,传统实例化一个对象通常通过构造参数或者工厂方法参数,那么每次使用都需要自己先去实例化构造参数或者方法参数,以及实例化对象以后针对属性的配置,如果每次使用实例化对象都需要走一遍这个流程必将增加开发和维护的工作量。
Spring IoC 容器将这个对象实例化接管了且将实例化后的对象直接纳管(通过容器可以直接获取指定类或者接口的实例化对象),容器根据XML配置,注解配置或Java 编程借助反射的手段帮助开发者自动地实例化对象。这个过程就是将一个对象实例化交给了IoC容器从而让开发者从对象手工实例化操作中解脱,从而叫做控制反转
依赖注入又是怎么来的呢?Spring容器在帮助利用反射进行对象实例化时需要用到构造参数,以及对象实例化以后针对一些属性赋值,此刻,Spring就会根据构造参数或者属性的XML配置,注解来自动完成对应的类实例化。如果这些构造参数或者属性还没有被Spring IoC容器管理,那么Spring会先去实例化这些构造参数和属性,最后完成依赖注入

Spring Beans加载过程

假设使用ClassPathXmlApplicationContext进行BeanFactory的实例化,主要阐述Bean的示例话流程。

  1. 实例化BeanFactory
  2. 加载和解析配置文件生成BeanDefinition Map。
  3. 实例化配置信息=>Environment
  4. 实例化所有Bean后置处理器=>BeanPostProcessor
  5. 实例化消息源(国际化)=>MessageSource
  6. 初始化事件派发器、注册所有监听器=>ApplicationListener
  7. 实例化所有非懒加载单例对象。
  8. BeanFactory的善后工作。

Spring Bean初始化过程

  1. 判断是否存在初始化构造依赖,如果存在依赖则先去初始化依赖Bean。
  2. 读取BeanDefintion进行实例化工作。
  3. 解析和注入属性依赖。
  4. 注入感知接口依赖=>*Aware
  5. 执行BeanPostProcessor方法postProcessBeforeInitialization
  6. 调用InitializingBean接口方法afterPropertiesSet
  7. 执行BeanPostProcessor方法postProcessAfterInitialization
  8. 注册DisposableBean待后续使用完调用方法destroy

Spring Bean Scope

  • singleton IoC容器只有一个对象。注意:此处单例和设计模式中的单例不同,单例模式是同一个类加载器只有一个对象实例,Spring Bean的单例只是指Spring容器只存一个类实例,而开发人员可以手动建立类的不同对象。
  • prototype IoC容器不存储该对象,只有在使用的时候(依赖注入)才会对其进行实例化。注意:此处需要注意如果容器一个单例对象依赖一个原型对象,那么每次调用单例对象进行操作时,原型对象始终时初始化时依赖注入的对象。此外,没有特殊需求的情况下不要使用原型对象,因为每次注入都会生成一个新的对象驻留在内存中。这也是为什么Spring 中Bean的默认Scope是singleton的原因。
  • request 每次Web请求时创建新的对象。
  • session 每次新的Session调用时创建新的底线。

@Component@Bean区别

  • 作用目标不同@Component作用于类上,@Bean作用于方法上。
  • 应用场景不同@Component应用于注解配置,配合注解扫描@ComponentScan使用;@Bean应用于Java编程,通常配合@Configuration使用,但是@Bean也可以配和@Component使用,但是后者不支持同一个类中方法注入其他的@Bean注解的实例注入,而是作为一个普通方法调用。总而言之,开发中互联这种场景就对了。
  • 功能范围不同@Component一般用于项目的业务类,当然存在一些变体@Controller@Service@Repository@Bean一般情况下都是配合项目外部Jar中便于初始化时实例化复杂逻辑配置的类。

BeanFactoryApplicationContext区别

  • BeanFactory 是IoC容器的最基本接口,提供Bean的解析和加载实例化。ApplicationContextBeanFactory 的子接口, BeanFactory 有的ApplicationContext都有,实际开发中基本没有理由使用BeanFactory
  • ApplicationContext 接口比BeanFactory增加多个功能接口
    • 消息源(国际化)支持。
    • 增加事件注册和监听。
    • 资源文件访问。
    • Bean的生命周期管理

AOP 概述

AOP即面向切面编程,首先需要理解的就是代理模式,代理模式能够实现针对方法执行前后做一些特殊化处理逻辑。Spring AOP就是利用代理模式之动态代理在方法执行前后增加切面逻辑实现特定的业务操作。
AOP常用术语:

  • 切面(Aspect):横跨多个类关注点的模块化,简单应用理解就是定义AOP 切面编程的地方。通常使用注解@Aspect
  • 切入点(Join point):很多地方叫做连接点,接入点,个人喜欢切入点,在Spring中就是一个方法执行对象。
  • 通知(Advice):切面增强的操作,通知类型有切入点环绕增强,切入点之前增强,切入点之后增加。在Spring中一个通知增强操作就是一个拦截器。因此,拦截器链也就可以支持多个不同的通知增强切面操作。
    Spring中注解Advice:
    • @Before :可拿到方法入参。
    • @Around :可拿到方法入参,返回值,异常。
    • @After:可拿到方法入参。
    • @AfterReturning:可拿到方法返回值,只读不可修改。
    • @AfterThrowing:可到方法异常。

@Around前 ->@Before ->执行方法 -> @Around后 ->@After ->@AfterReturning
@Around前 ->@Before ->执行报错 -> @After ->@AfterThrowing

  • 切入点表达式(Pointcut):用来定义切入点,默认使用AspectJ切入点表达式。
  • 目标对象:被一个或多个切面通知的对象,也叫做被通知对象,因为Spring AOP是使用运行时代理(动态代理)实现,这个对象也可以叫做被代理对象。
  • 代理对象:AOP框架为了实现切面约束(通知方法执行等)创建的对象。在Spring中,一个AOP代理就是一个JDK动态代理或者是一个CGLIB代理。
  • 织入:就是实现切面的时候增加的逻辑。一般在编译期(需要使用特殊的编译器,如使用AspectJ 编译器),加载期,运行期。Spring AOP就是在运行期执行织入的功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值