spring23问

本文详细介绍了Spring中的单例Bean、Bean的实例化与初始化过程,以及SpringAOP的工作原理。此外,讨论了Spring事务管理和可能导致事务失效的情况。还涉及SpringBoot的自动配置机制及启动流程。同时,文章提到了SpringMVC的请求处理和IOC的概念。
摘要由CSDN通过智能技术生成

单例Bean是单例模式吗

spring中的单例Bean是一种单例模式,只不过范围比较小,范围是beanName,一个beanName对应同一个Bean对象,同一个类定义的对象只要名字不同,就不是同一个bean对象。

Bean的实例化和Bean的初始化有什么区别

Spring在创建一个Bean对象时,会通过反射执行类的构造方法得到一个java对象,这就是Bean的实例化,然后进行依赖注入,依赖注入后进行初始化,Bean的初始化就是调用前面创建出来的Java对象中特定的方法,比如Java对象实现了InitializingBean接口,那么初始化的时候就会执行Java对象的afterPropertiesSet(),Spring初始化Bean就是去找这个方法去执行,可以是spring自己的,也可以是我们在类中重写的这个方法(init-method指定的方法)

Spring AOP是如何实现的?它和AspectJ有什么区别?

SpringAOP利用动态代理机制,就是spring会代理原本的java对象,代理对象在执行某个方法时,会在该方法的基础上增加一些切面逻辑,我们可以利用AOP来实现一些登录校验、权限控制、日志的一些功能。

而AspectJ是在编译期的时候,就对类进行增强,AspectJ和AOP没有什么联系,只是AOP用的切面注解依然是Aspect注解的定义,但底层的实现是完全不同的

Spring中事务是如何实现的?

1.Spring事务底层是基于数据库事务和AOP机制的
2.首先对于使用了@Transactional注解的Bean,Spring会创建一个代理对象作为Bean
3.然后spring的事务管理器创建一个数据库连接
4.修改数据库连接的autocommit属性为false,禁止此连接的自动提交,这是实现Spring事务非常重要的一步
5.执行当前方法,然后执行相应的sql
6.方法执行完后,如果没有出现异常就直接提交事务
7.如果出现了异常,并且这个异常是需要回滚的就会回滚事务
8.spring事务的隔离级别对应的就是数据库的隔离级别
9.Spring事务的传播机制是spring事务自己实现的。

那些情况下会导致Spring事务失效,对应的原因是什么?

1.Spring事务是基于AOP的,只有使用代理对象调用某个方法时,Spring事务才能生效,而在一个方法中调用使用this.xxx()时(就是类中方法自调用),this并不是代理对象,所有会导致事务失效。
解决办法:自己在类中通过注释@Autowired,注入后再进行方法的调用
2.如果方法被private 或者 final 修饰 都无法正常执行事务,因为代理对象类都是该类的子类,如果加上这两个修饰符则无法正常去继承
3.又创建另外一个线程去执行该事务的方法,因为一整套事务是由一个线程去连接数据库去开启事务,并且修改autocommit为true,并返回了数据库对象,但当你又创建一个线程则之前的设置都没有做,则无法正常执行事务

Spring中的Bean创建的生命周期有那些步骤

1、推断构造方法,有无参构造时就直接用无参构造,当有多个有参构造时,就需要通过@Autowired注解去指定使用那个构造方法
2、实例化
3、填充属性,也就是依赖注入
4、实例Aware接口,处理Aware的回调
5、初始化前,处理@PostConstruct注解
6、初始化后,处理InitializingBean接口
7、初始化后,进行AOP

Spring中Bean是线程安全的吗

Spring本身并没有针对Bean做线程安全的处理,
所以要具体看Bean代理的原对象是否对方法是有synchronized的修饰,如果有则是

ApplicationContext和BeanFactory有什么区别

BeanFactory就是Spring中最核心的组件,表示Bean工厂,可以生成Bean,维护Bean,而ApplicationContext接口继承了BeanFatory,也就是说ApplicationContext和BeanFactory基本是相同的,然后ApplicationContext在继承了BeanFactory的基础上,又继承了EnvironmentCapable、MessageSource、ApplicationEventPublisher等接口之类的,就有更多的功能

Spring容器启动流程

1、首先创建Spring容器,也就是启动Spring
2、然后进行扫描,扫描得到的BeanDefinition对象,并存在一个Map中
3、然后筛选出非懒加载的单例BeanDefinition常见Bean,
4、利用BeanDefinition创建Bean就是Bean的创建生命周期
5、单例Bean创建完了之后,Spring会发布一个容器启动事件

SrpingBootApplicatin注解有什么用

@SpringBootApplication是一个复合注解
只要加上了@SpringBootApplication这个注解
就相当于再加上了
@ComponetScan,从而spring容器会进行扫描,扫描路径为当前类所在的包路径
@EnableAutoConfiguration 这个注解会负责进行自动配置类的导入,也就是将项目中的自动配置类导入到Spring容器中,从而得到解析
@SpringBootConfiguration,其实就相当于是@Configuration,表示当前类是一个配置类

SpringBoot中的spring.factories文件有什么作用?

spring factories是SpringBoot SPI机制实现的核心,SPI机制表示扩展机制,所以spring.factories文件的作用就是用来对SpringBoot进行扩展的,比如我们创建好一些监听器等等,可以通过再该文件中添加ApplicationListener、ApplicationContextInitializer、配置类的全路径,只需要在该文件中添加就可以了。

你是如何理解SpringBoot中的自动配置的?

在spring中,我们通常需要去配置很多的Bean,
比如用Mybatis,我们就要配置SqlSessionFacotory的Bean对象
用AOP,我们需要配置@EnableAspectJAutoProxy注解,
而我们用springboot时,我们基本不用再去配这些了,因为springboot就自动帮我们配置了好了,因为springboot当中有很多配置类,当我们在pom中依赖了spring-boot-starter-web后,会间接依赖到spring-boot-autoconfigure这个jar包,这个jar包含了很多自动配置类

spring boot启动过程中做了那些事情

SpringMVC处理请求的流程是什么?

1、在启动tomcat过程中,会创建DispatcherServlet对象,并执行它的初始化逻辑
2、DispatcherServlet初始化过程中会创建Spring容器(根据用户的spring配置)
3、然后初始化过程中对HandlerMapping、HandlerAdapter进行初始化
4、SpringMVC中默认提供好几个HandlerMapping,其中一个为RequestMappingHandlerMapping
5、RequestMappingHandlerMapping的作用就是去寻找Spring容器中那些加了@RequestMapping的方法
6、找到这些方法后,就会解析该注解上的信息,包含了指定的path,然后把path作为key,method作为value存到map中
7、DispatcherServlet接受到请求后,RequestMappingHandlerMapping就会负责根据请求路径从map中找到对应的method
8、然后准备执行method,只不过,在执行method之前,会解析该方法的各个参数,比如参数前面有注解@RequestParam,那么SpringMVC就会解析该注解,并从请求中取出对应的request param中的数据传给该参数
9、解析各个参数,拿到对应的值之后,就会执行方法了

IOC是什么

IOC就是控制反转嘛,就是由之前我们之前自己来创建对象,自己去对对象赋值,然后通过IOC后,然后交给spring来帮我们创建对象和给对象赋值,这样创建后放入IOC容器,后面我们想要重复使用时,就可以直接去IOC容器中去那这个对象,帮助了我们节省了时间和代码行

Spring用到了那些设计模式

Springboot是如何启动tomcat的

1、首先,springboot在启动时会先创建一个spring容器
2、在创建spring容器过程中,会利用@ConditionalOnClass技术来判断当前classpath中是否存在tomcat依赖,如果存在则会生成一个启动Tomcat的Bean
3、spring容器创建完成之后,就会获取启动Tomcat的Bean,并创建Tomcat对象,绑定端口,启动tomcat对象

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值