Spring进阶

发布时间:2024年01月24日

一、Spring复习

  1. 对spring的认识和理解:
    spring是一个轻量级,非侵入式,IOC和AOP一站式的Java后端框架。目的:简化企业开发。
    核心模块:AOP、数据访问层,web层,测试…

  2. spring优点:
    spring是一个容器,可以将对象管理起来(IOC);让创建对象和使用对象分离,耦合度降低;使用AOP编程思想,为程序扩展功能更加方便,可以轻松集成其他的框架
    缺点:配置量大,模板化配置,依赖的jar较多

  3. 解释IOC和AOP
    IOC:将原本在程序中手动创建对象的控制权交给Spring框架管理
    AOP:面向切面编程,面对的是处理过程中的某个步骤或阶段,使得逻辑过程中各部分之间低耦合性的隔离效果,减少重复,专注业务

  4. IOC 和 DI 的区别是什么
    IOC:是控制反转;DI是依赖注入,通过依赖注入技术,实现控制反转

  5. spring 中注入对象的方式
    xml注入
    注解注入

  6. 自动注入的注解有哪些注解

    • @Autowired:可以写在字段和setter方法上
    • @Resource:指定其name属性,为按照名称进行匹配的Bean的id
  7. Springc 中的 bean 和 new 的对象有什么区别

  8. AOP 中的术语有哪些,通知有哪些
    术语:连接点、切入点、通知、目标,代理
    通知:方法执行前通知,执行后通知,环绕通知,异常通知,最终通知

  9. Spring 实现 AOP 有哪几种方式
    注解方式
    xml配置方式

  10. 谈谈 Spring 事务管理,实现方式有几种,原理是什么?
    有两种方式:

    • 编程式事务:代码中需要提交事务或回滚事务时自己写代码实现。
    • 声明式事务:建立在AOP基础上,对方法前后进行拦截。
  11. 声明式事务哪些场景下会失效

    1. 方法未被public权限修饰
    2. 异常被catch捕获,导致拦截不到异常
    3. 出现编译期异常
    4. 事务传播行为设置错误(对应七种事务传播行为类型)
    5. 数据库引擎不支持事务
    6. 同一个类中,使用非代理对象调用一个有事务的方法,导致事务错误(spring是基于代理实现的)
  12. SpringWEB(springMVC)运行流程

  13. spring 和 springboot 的关系区别
    springboot是在spring基础上,简化spring搭建,并不是替代spring,springboot的核心是起步依赖,自动装配。

二、Spring进阶

a.Bean作用域

singleton 单例 默认 一个类只创建一个bean
prototype 原型 获取一次 创建一次
request 一次HTTP请求中创建一个
session 一次会话(浏览器建立与服务器的连接后,到浏览器关闭)
BeanFactory 和ApplicationContext区别:
BeanFactory 和ApplicationContext都是spring框架中提供的接口,BeanFactory 是spring容器中最底层的接口,是面向spring框架,很多的内部的工厂类都实现该接口。ApplicationContext接口继承了BeanFactory接口是面向应用程序,提供额外的功能;实现了BeanFactory接口的工厂类,在使用某个对象时,才会创建初始化,实现了Applicationcontext接口的工厂类,在程序启动时就会创建初始化

b.SpringBean的生命周期

5个阶段:
1. 实例化 创建一个基本对象(没有增强的对象)
2. 属性赋值/注入 为对象中关联的对象赋值
3. 初始化 (重点)
检测我们的类是否实现某些接口,如果实现了,就会执行相应的方法,AOP额外功能的增强,也是在初始化环节中进行的。
4. 将bean对象放入容器中 使用
5. 销毁(次重点)
如果Bean实现DisposableBean执行destory, 配置自己的销毁方法

<bean class="" id="" destroy-method="customerDestroy">

,指定销毁方法 customerDestroy

<bean id="" class="" scope="" destroy-method="" init-method=""/>

c.Spring中的bean是线程安全的吗?Servlet是线程安全的吗?

指的是bean对象中的成员是否是线程共享的,多个线程可以对同一个成员变量进行操作。

	//默认是单例bean 只有一个对象 多个线程共享操作同一个变量num, 此种情况是线程不安全的
   /*解决办法:
     设置作用域为原型的,那么每次请求过来都会创建一个新的对象,那么每个线程中都有属于自己的一个变量,就是线程安全的,使用ThreadLocal,为每个线程创建一个变量副本*/
   class LoginController{
      int  num = 0;
   }

有状态和无状态
有状态:例如num 就是有状态(因为可以存储数据)是线程不安全的。
无状态:例如 @Autowired 不存储数据,只是调用另一个对象中的方法,不涉及数据的改变,即使是单例bean,也是线程安全的。LoginService loginService;

d.Bean循环依赖

Spring 中的Bean循环依赖问题:正常Java中

//A关联B
class A{
	public B b;
}
//B又关联了A
class B{
	public A a;
}
new A();//A中关联的B的值为null
new B();//B中关联的A的值为null,是没有问题的

但是在spring使用@Autiwired注解标签进行自动注入,如果不加以处理,会出现循环依赖问题(相当于死锁,A 创建Bean对象时–>需要注入 B Bean对象---->B 去创建Bean对象—>需要 A Bean对象)
spring如何解决:
三级缓存:spring中内部有三个Map存储不同阶段的对象

  1. 一级缓存(singletonObjects):放的是初始化完成的Bean对象
  2. 二级缓存(earlySingletonObjects):放的是没有初始化完成的半成品Bean对象
  3. 三级缓存():放的是用来创建初始化某个bean的工厂对象
    流程:创建初始化A–>需要B,先去一级缓存找,一级缓存没有,把半成品A放到二级缓存中,工厂放到3级缓存–>创建并初始化完成B,需要在二级缓存查找A,注入A–>BeanB初始化完成,放到一级缓存–>给A注入B

e.Servlet的过滤器与Spring拦截器区别

过滤器属于Java Servlet规范中定义的,可以拦截所有进入到Java后端请求。
拦截器属于Spring框架中定义的,只能拦截到达spring控制器(controller)中的请求

f. SpringBoot自动装配原理

讲的就是spring boot在启动时,如何做到自动的将项目中配置的相关进行加载,配置这个过程。
如:redis,发送邮件JavaMailSender,只需要添加依赖,spring就会把这些组件进行装载,为我们提供一个使用的对象。
自动装配过程:
启动启动类:Springapplication.run(NewsApplication.class);
启动类被加载后,解析SpringBootApplication注解标签

g.

h.

i.

j.

文章来源:https://blog.csdn.net/begin00000end/article/details/135774117
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。