• Spring面试题(2022)


    Spring

    1、什么是spring

    Spring是一个开源框架,它是为了解决企业应用开发的复杂性而创建的。

    一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

    2、Spring 在ssm中起什么作用?

    Spring:轻量级框架
    作用:Bean工厂,用来管理Bean的生命周期和框架集成。
    两大核心:
    1、IOC/DI(控制反转/依赖注入) :把dao依赖注入到service层,service层反转给action层,Spring顶层容器为BeanFactory。
    2、AOP:面向切面编程

    3、什么是IOC(控制反转)和什么是AOP

    IOC:所谓控制反转,就是把对象交给容器去处理,用来管理Bean,使用依赖注入实现控制反转,可以很方便的整合各种框架

    IOC 在项目中的作用?

    作用:Ioc解决对象之间的依赖问题,把所有Bean的依赖关系通过配置文件或注解关联起来,降低了耦合度。

    AOP:是一种面向切面的一种编程方式、例如我们的业务核心代码需要处理异常或者处理日志,这时我们就可以运用到AOP,还有什么遇到权限的时候都可以运用到AOP,AOP机制弥补OOP代码重复问题,将不同类不同方法中的共同处理抽取成切面,自动主入给方法执行,比如日志,异常等

    4、IOC,AOP的实现原理?

    IOC:通过反射机制生成对象注入
    AOP:动态代理

    5、如何实现一个IOC容器

    1、配置文件配置包扫描路径

    2、递归包扫描获取.class文件

    3、反射、确定需要交给IOC容器管理的类

    4、DI依赖注入

    6、谈谈你对IOC的理解

    容器概念,控制反转,依赖注入

    ioc容器

    实际上就是个Map,里面存的是各种对象(xml里配置的bean节点,@repository,@service,@controller,@component),在项目启动的时候会读取配置文件里面的bean节点,根据全限定类名使用反射创建对象放到map里,扫描到打上上述注解的类或通过反射创建对象放到map里

    这个时候map里就有各种对象了,接下来我们在代码里需要用到里面的对象时,再通过DI注入

    (autowired,resource等注解,xml里bean节点内的ref属性,项目启动的时候会读取xml节点ref属性根据id注入,也会扫描这些注解,根据类型或id注入,id就是对象名)

    控制反转:

    没有引入IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B,无论是创建还是使用对象B,控制权都在自己手上.

    引入IOC容器之后,对象A和对象B之间失去了直接联系,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方

    通过前后的对比,不难看出,对象A获得依赖对象B的过程,由主动行为变成了被动行为,控制权颠倒过来了

    7、IOC原理

    IOC只是一种模式,一种思想简单说就是将原先需要new出来的对象,我先把它实例化,同时把它放到一个容器里,这样后面需要这个对象的时候,直接通过注入的方式拿到,为什么说是注入,其实应该说是从容器里面拿,只不过在spring里,用的更多的是注入, spring中使用ioc的模式,首先,在spring容器中有两个map集合,一个是用来存放bean的配置信息,另一个是用来存放bean的实例.

    8、Spring的事务?

    编程式事务管理:编程方式管理事务,极大灵活性,难维护。
    声明式事务管理:可以将业务代码和事务管理分离,用注解和xml配置来管理事务。

    9、Spring的配置文件中的内容?

    开启事务注解驱动
    事务管理器
    开启注解功能,并配置扫描包
    配置数据库
    配置SQL会话工厂,别名,映射文件
    不用编写Dao层的实现类

    10、Spring下的注解?

    注册:@Controller @Service @Component
    注入:@Autowired @Resource
    请求地址:@RequestMapping
    返回具体数据类型而非跳转:@ResponseBody

    11、Spring DI 的三种方式

    构造器注入:通过构造方法初始化

    1
    setter方法注入:通过setter方法初始化

    1
    接口注入

    12、Spring主要使用了什么模式?

    工厂模式:每个Bean的创建通过方法
    单例模式:默认的每个Bean的作用域都是单例
    代理模式:关于Aop的实现通过代理模式

    13、BeanFactory和ApplicationContext有什么区别和联系

    ApplicationContext是BeanFactory的子接口,提供了更完整的功能

    1.BeanFactory采用的是延迟加载形式来注入bean的,即只有在使用到某个bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题,如果Bean的某一个属性没有注入,BeanFactory加载后,直至第一次使用调用getBean方法才抛出异常

    2.ApplicationContext,它是在容器启动时,一次性创建了所有的bean.这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖的属性是否注入.ApplicationContext启动后预载入所有的单实例Bean,通过预载入单实例bean,确保当你需要的时候,你就不用等待,因为它们已经创建好了

    3.相对于基本的BeanFactory,ApplicationContext唯一的不足是占用内存空间,当应用程序配置Bean较多时,程序启动较慢

    4.BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader

    14、描述Spring Bean的生命周期

    1. 解析类得到BeanDefinition
    2. 实例化得到一个对象
    3. 对对象中的加了@Autowired注解的属性进行属性填充
    4. 回调Aware()方法,比如BeanNameAware,BeanFactoryAware
    5. 调用BeanPostProcessor的初始化前的方法
    6. 调用初始化方法
    7. 调用BeanPostProcessor的初始化后的方法,在这里会进行AOP
    8. 如果当前创建的bean是单例的,则会把bean放入单例池
    9. 使用bean
    10. Spring容器关闭时调用DisposableBean中的destory()方法

    15、Spring框架中的单例Bean是线程安全的吗

    不安全
    Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理

    如果Bean是有状态的,那就需要开发人员自己来进行线程安全的保证,最简单的方法就是改变bean的作用域,把singleton改为prototype,这样每次请求bean就相当于是new Bean()


    16、反射与注解

    简述反射的基本概念,优缺点和使用场景。
    答:

    ①在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,

    对于任意一个对象,都能够调用它的任意一个方法和属性;

    这种动态获取的信息以及动态调用对象的方法的功能称为Java的反射机制。

    ② 优点是运行时动态获取类的全部信息,缺点是破坏了类的封装性,泛型的约束性。

    ③是框架的核心灵魂,动态代理设计模式采用了反射机制,还有 Spring、Hibernate 等框架也大量使用到了反射机制。

    获取Class对象有哪几种方式?

    能通过Class对象获取类的哪些信息?
    答:

    ①通过类名.class

    ②通过对象.getClass()

    ③通过Class.forName(类的全限名);

    注解是什么,元注解是什么,有什么作用?
    答:

    ①注解是一种标记,可以使类或接口附加额外的信息,是帮助编译器和JVM完成一些特定功能的。

    ②元注解就是自定义注解的注解,包括@Target:用来约束注解的位置,值是ElementType枚举类,包括METHOD方法、VARIABLE变量、TYPE类/接口、PARAMETER方法参数、CONSTRUCTORS构造器和LOACL_VARIABLE局部变量;

    @Rentention:用来约束注解的生命周期,值是RetentionPolicy枚举类,包括:SOURCE源码、CLASS字节码和RUNTIME运行时;@Documented:表明这个注解应该被javadoc工具记录;@Inherited:表面某个被标注的类型是被继承的。

    最后

    深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

    因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

    小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。

  • 相关阅读:
    【网络杂烩 ---> 网络安全】DLL 注入 --- c/c++ 代码实现(超 · 详细)
    Jmeter之接口测试流程详解
    react常用api
    CF1559E Mocha and Stars(dp+莫比乌斯反演)
    财长耶伦和她诺奖丈夫的千万身家
    GPIO八种工作模式
    下载指定版本的pytorch
    docker安装redis
    C++中string的用法
    第4章SpringBoot ⽇志
  • 原文地址:https://blog.csdn.net/bhegi_seg/article/details/126812176