Spring(Spring复习一)

1. Spring是什么

Spring是一个轻量级的IOC和AOP的容器框架。主要作用是解决企业应用开发的复杂性,提供主流框架的集成以及对象的统一管理等功能。

2. Spring的优点

  1. 对代码低侵入性,低污染,且可以自主选择使用Spring的部分功能
  2. 集合了主流的框架,使开发人员开发更为方便
  3. 通过依赖注入降低了业务对象替换的复杂性
  4. 通过AOP技术,可将重复的代码抽离出来,提升代码的可维护性

3. Spring的AOP理解

AOP是面向切面编程,将代码中重复的逻辑进行抽离,作为一个切面统一处理,提高代码的可维护性,主要的应用场景为事务,日志打印,权限校验等。

  • AOP分类
    • AspectJ
      • 实现方式:是静态代理,在编译器直接将切面的代码织如字节码中,实现切面的功能
      • 优点:在编译器织入,性能较好
      • 缺点:需要特定的编译器
    • Spring AOP
      • JDK动态代理:通过写入一个代理类的字节码文件,该代理类的构造方法中传入了用户实现的InvocationHandler接口的代理对象,在调用代理对象的方法时,会调用接口实现的invoke方法,并将代理类和方法及参数传给Invoke方法;被代理类需要实现一个接口,原因是基于接口进行代理
      • CGLIB动态代理:通过生成被代理类的子类代理对象,在代理类中加入调用拦截器的增强方法实现;被代理类不能是final的,原因是需要通过构造子类代理对象实现
      • 优点:无需特定的编译器
      • 缺点:性能相对静态代理慢

一张图看懂jdk动态代理机制
一张图看懂cglib动态代理机制

4. Spring的IOC的理解

  • IOC:叫做控制反转,就是将对象的创建权交给容器,用户无需自己创建对象,只需在配置文件中配置或者加入注解即可,容器会通过反射的方式创建对象,并加入到容器中,用户可从容器中获取
  • DI:就是将容器中的对象赋值给需要调用对象
  • 依赖注入方式
    • 根据属性注入
    • 根据构造器注入
    • 根据注解注入

5. BeanFactory和ApplicationContext有什么区别

  • BeanFactory:是Spring的最底层接口
  • ApplicationContext:1.所有的Bean在容器启动时就会一次性加载,若存在配置错误,可直接排查,较为方便,但是不足是更占用内存空间;2.是BeanFactory的子接口;3.相对来说有更多的功能,如Web、AOP、国际化以及事件机制等。

6. bean的作用域

  1. singleton:这是默认的,单例模式
  2. prototype:每次请求就有一个实例
  3. request:每一次request请求一个实例
  4. session:每一个session一个实例
  5. gloab-session:全局的session下一个实例

7. Spring如何保证线程安全

  1. 将bean的作用域配置成prototype,每次获取bean都是一个对象,从而保证线程安全
  2. 使用ThreadLocal变量,每个线程使用该变量时,只会使用本线程的变量值,也就是每个线程都有一个该变量的副本,通过空间换取时间

8. Spring中使用的设计模式

  1. 代理模式——AOP
  2. 工厂模式——BeanFactory
  3. 单例模式——bean的单例作用域
  4. 模板模式——JmsTemplate,RedisTemplate
  5. 依赖注入——IOC

9. 事务的传播行为

事务的传播行为是调用一个方法后,被调用的方法的事务改如何操作

  1. PROPAGATION_REQUIRED:被调用的方法有事务就用,没有就创建
  2. PROPAGATION_REQUIRES_NEW:被调用的方法不管有没有事务,都创建一个事物(使用场景为:不希望外部事物影响内部的事务)
  3. PROPAGATION_SUPPORTS:被调用的方法有事务就用,没有就挂起
  4. PROPAGATION_MANDATORY:被调用的方法有事务就用,没有就报错
  5. PROPAGATION_NOT_SUPPORTED:被调用的方法有事务就挂起,没有也没有事务
  6. PROPAGATION_NEVER:被调用的方法有事务就报错,没有就没有事务执行
  7. PROPAGATION_NESTED:被调用的方法有事务就嵌套事务执行,没有就创建一个事务

注:PROPAGATION_REQUIRES_NEW与PROPAGATION_NESTED区别:

  • PROPAGATION_REQUIRES_NEW 不会被外部事物影响(若内部事务失败,外部事物可通过catch方式自行决定是否回滚,下同)
methodA  PROPAGATION_REQUIRED 
	methodB  PROPAGATION_REQUIRES  

1. 若A回滚,B可以成功执行
2. 若B回滚,A catch异常可自行决定是否回滚,可作为分支处理(不推荐)
  • PROPAGATION_NESTED 外部事物失败,嵌套的事务必定失败
methodA  PROPAGATION_REQUIRED 
	methodB  PROPAGATION_NESTED 

1.  若A回滚,B一定回滚
2.  若B回滚,A catch异常可自行决定是否回滚,可作为分支处理(不推荐)

10. Spring AOP中的名词解释

  • 切面:日志、权限、事务等框架
  • 通知:切面中的方法
  • 切入点:切入的条件,符合条件,才能加入通知
  • 织入:形成代理类的过程

11. spring5.0新特性

  1. 升级到jdk8,兼容jdk9
  2. 支持函数式编程
  3. 支持响应式编程

12. Spring Bean的生命周期

  1. 实例化Bean:

    对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。对于ApplicationContext容器,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean。

  2. 设置对象属性(依赖注入):

    实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成依赖注入。

  3. 处理Aware接口:

    接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean:

    3.1 如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的就是Spring配置文件中Bean的id值;

    3.2 如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身。

    3.3 如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文;

  4. BeanPostProcessor:

    如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。

  5. InitializingBean 与 init-method:

    如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。

  6. 如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;

以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。

  1. DisposableBean:

    当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;

  2. destroy-method:

    最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

13. Spring 循环依赖解决

  1. 构造器循环依赖(无法解决)
  2. prototype范围的依赖(无法解决)
  3. 属性注入的单例依赖(可以解决)
    • A 创建过程中需要 B,于是 A 将自己放到三级缓里面 ,去实例化 B
    • B 实例化的时候发现需要 A,于是 B 先查一级缓存,没有,再查二级缓存,还是没有,再查三级缓存,找到了!
      • 然后把三级缓存里面的这个 A 放到二级缓存里面,并删除三级缓存里面的 A
      • B 顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A依然是创建中状态)
    • 然后回来接着创建 A,此时 B 已经创建结束,直接从一级缓存里面拿到 B ,然后完成创建,并将自己放到一级缓存里面
      Spring 如何解决循环依赖的问题

参考

Spring常见面试题总结(超详细回答)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 智慧社区背景与挑战 随着城市化的快速发展,社区面临健康、安全、邻里关系和服务质量等多方面的挑战。华为技术有限公司提出智慧社区解决方案,旨在通过先进的数字化技术应对这些问题,提升城市社区的生活质量。 2. 技术推动智慧社区发展 技术进步,特别是数字化、无线化、移动化和物联化,为城市社区的智慧化提供了可能。这些技术的应用不仅提高了社区的运行效率,也增强了居民的便利性和安全性。 3. 智慧社区的核心价值 智慧社区承载了智慧城市的核心价值,通过全面信息化处理,实现对城市各个方面的数字网络化管理、服务与决策功能,从而提升社会服务效率,整合社会服务资源。 4. 多层次、全方位的智慧社区服务 智慧社区通过构建和谐、温情、平安和健康四大社区模块,满足社区居民的多层次需求。这些服务模块包括社区医疗、安全监控、情感沟通和健康监测等。 5. 智慧社区技术框架 智慧社区技术框架强调统一平台的建设,设立数据中心,构建基础网络,并通过分层建设,实现平台能力及应用的可持续成长和扩展。 6. 感知统一平台与服务方案 感知统一平台是智慧社区的关键组成部分,通过统一的RFID身份识别和信息管理,实现社区服务的智能化和便捷化。同时,提供社区内外监控、紧急救助服务和便民服务等。 7. 健康社区的构建 健康社区模块专注于为居民提供健康管理服务,通过整合医疗资源和居民接入,实现远程医疗、慢性病管理和紧急救助等功能,推动医疗模式从治疗向预防转变。 8. 平安社区的安全保障 平安社区通过闭路电视监控、防盗报警和紧急求助等技术,保障社区居民的人身和财产安全,实现社区环境的实时监控和智能分析。 9. 温情社区的情感沟通 温情社区着重于建立社区居民间的情感联系,通过组织社区活动、一键呼叫服务和互帮互助平台,增强邻里间的交流和互助。 10. 和谐社区的资源整合 和谐社区作为社会资源的整合协调者,通过统一接入和身份识别,实现社区信息和服务的便捷获取,提升居民生活质量,促进社区和谐。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值