淡淡你对spring的理解
spring从狭义上理解就是轻量级的框架,主要针对早期的EJB
而言,整合各种框架,管理了很多bean,底层有IOC
和AOP
支撑。
spring从广义上就是一个spring生态,有spring framework,spring boot,spring cloud,spring security,spring session,spring batch,(spring amap和消息中间件的继承。)
你用过spring的那些?spring框架有哪些好处?
用过spring IOC,AOP,spring test,spring jdbc,spring声明性事务,springMVC,spring cloud,spring boot
好处主要时ioc和aop:
ioc:主要解决问题是解耦,
aop:主要是将与核心业务无关的业务独立出来,做成切面。
说一下Spring的IOC和DI
IOC:控制反转是一种设计原则,意味着你不需要再手动创建和管理对象,而是把对象的创建权交给spring管理,由spring利用反射来创建对象,然后把创建好的对象放到spring的map集合中。
DI:依赖注入是实现控制反转的一种具体方式。它通过外部容器将依赖关系注入到对象中。例如:setter注入,构造器注入,字段注入
BeanFactory和ApplicationContext有什么区别?
ApplicationContext是BeanFactory的子接口,既然是子接口,肯定对BeanFactory做了增强,主要是:
国际化
事件发布机制
资源文件的访问方式
区别是:
功能上:BeanFactory是Spring的底层接口,定义了IOC的基本功能。ApplicationContext接口继承了BeanFactory,还继承了MessageSource,因此还支持国际化,资源访问等功能。
加载形式:BeanFactory在初始化的时候,并未实例化Bean,直到需要使用某个Bean时才会实例目标Bean。ApplicationContext在初始化应用上下文时就实例化所有单实例Bean。但是配置很多个Bean时,启动很慢。
BeanFactory与ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor使用。不同的是BeanFactory是手动注册,ApplicationContext是自动注入。
Spring中Scope属性(Bean作用范围)
singleton单例,默认
prototype多例
还有request,session,global session
可以通过xml配置中通过bean元素上通过scope属性指定。
Spring创建对象的方式有那些
构造器实例化
静态工厂实例化
实例工厂实例化
实现FactoryBean接口
Spring的Bean是线程安全的吗?
bean默认是单例bean,线程不安全
BeanFactory和FactoryBean的区别
BeanFactory时Spring框架的核心接口之一,负责管理Bean的生命周期,依赖注入。
FactoryBean就是一个特殊的Bean,他是工厂类的接口,负责创建其他Bean的实例
区别
用途
BeanFactory是Spring IOC容器的核心接口,负责管理Bean的生命周期
FactoryBean是一个特殊的Bean,充当其他Bean的工厂,用于自定义Bean的创建过程
创建对象
BeanFactory负责创建Bean对象
FactoryBean就是一个Bean,它的实例本身就是一个工厂,负责创建其他Bean的实例
自定义型
BeanFactory通常不需要自定义实现,有Spring框架提供
FactoryBean需要自定义实现,需要编写一个类实现FactoryBean接口,并重写getObjects方法
懒加载
BeanFactory默认支持懒加载,可以配置Bean的延迟初始化
FcatoryBean可以通过返回代理对象来实现懒加载,他控制何时创建实际的Bean实例
说一下@Resource和@Autowired的区别
来源不同
Autowired是Spring定义的注解
Resource是Java定义的注解
查找顺序不同
Autowired是先根据类型在根据名称查询
Resource先根据名称在根据类型查询
依赖注入不同
Autowired支持构造器,属性注入,Setter
Resource支持属性注入,Setter
spring bean的生命周期?【特别重要】
Bean 的生命周期概括起来就是 4 个阶段:
实例化(Instantiation)
属性赋值(Populate)
初始化(Initialization)
销毁(Destruction)
完整步骤
实例化
依赖注入
BeanNameAware,BeanFactoryAware方法执行
初始化前BeanPostProcessor的before处理
InitialingBean接口方法执行
初始化
BeanPostProcessor的after处理
使用Bean
DisposableBean接口方法执行
销毁Bean
springbean的常见注入方式
setter方法注入
构造方法注入
spring是如何解决循环依赖的?【特别重要】
先获取A对象,先判断在singleObjects有没有,没有就创建
A创建完成之后,判断A是否为单例,且没有创建完毕,如果是就存到三级缓存中
在A中注入B,先在单例池中获取B,没有就创建
B创建完成之后,判断B是否为单例,其没有创建完毕,如果是就存到三级缓存中。
在B中注入A属性,先从一级缓存,二级缓存查找A属性,都没有就从三级缓存找,接下来把A存到二级换存,删除三级缓存,所以B中的A属性获取成功。所以B实例化,初始化全部完成。
B就存入一级缓存中,清空二级、三级缓存
再到A中填充B属性,先从一级缓存找,此时B已经创建好了,所以直接拿到。得到一个完整的A
把A放到一级缓存,清空二级三级缓存
第二次遍历,开始获取B,都能拿到。所以A,B全部成功实例化,初始化。
聊一下SpringAop
AOP是一种面向切面编程的思想,纵向重复的代码横向抽取。就是把核心业务和非核心业务隔离开来,把非核心业务做成切面,需要的时候切入就行。SpringAop是用动态代理实现,实现了接口就是JDK动态代理,没实现就是cglib动态代理
Spring AOP是什么?AOP的配置?AOP常见术语?(切面、通知、切入点、连接点)
AOP可以通过xml配置和Annotation配置
xml配置:
先写<aop:config>在配置<advisor>和<pointcut>
再写<tx:advice>在配置事务管理器transactionManager要配置数据源
切面:是一个动作,指的是把通知应用到切入点的过程
通知:实际增强的逻辑部分称为通知。比如对add()加个日志功能,那么这个功能就是通知
前置通知before,后置通知after,环绕通知around
切入点:实际上被增强的方法称为切入点,比如只增强add(),那么add就是切入点
连接点:一个类中的那些方法可以被增强,那这些方法称为连接点,比如add(),delete()等可以为连接点。
Spring AOP有什么作用?你哪些地方使用了AOP?
模块化:Spring AOP将横切关注点从主业务逻辑代码中分离出来,以模块化的方式实现对这些关注点的管理和重用。这样,我们可以更容易地维护代码,并且可以将同一个关注点的逻辑应用到多个方法或类中。
非侵入式:使用Spring AOP时,我们不需要修改原始业务逻辑代码,只需要在切点和增强中定义我们所需要的逻辑即可。这样,我们可以保持原始代码的简洁性和可读性。
可重用性:我们可以将同一个切面应用于多个目标对象进行横切处理。这样,我们可以提高代码的重用性,并且可以更加方便地维护和更新切面逻辑。
松耦合:AOP可以减少各个业务模块之间的耦合度,这是因为我们可以将某些通用的逻辑作为切面来实现,而不是直接在各个业务模块中实现。这样可以使得各个业务模块之间更加独立,从而提高代码的可维护性。
权限检查
记录日志
某个方法的执行时长
spring的声明性事务
Spring AOP和AspectJ AOP有什么区别?
面向的对象不同
Spring AOP是针对Spring框架的AOP实现
AspectJ是Java中独立的AOP框架
AOP实现方式不同
Spring AOP使用代理方式实现,JDK动态代理或CGLIB代理
AspectJ支持两种方式,第一种是编译时织入,第二种是运行时织入,目标类加载时修改字节码方式织入切面代码
支持的切面类型不同
AspectJ相比于Spring AOP支持更多的切面类型
性能差异
Spring AOP性能较差,AspectJ性能较好
aop原理【源码】
遍历所有Bean,找到标注Aspect的地方,将里面标注了通知的方法拿出来,将切面中带通知注解的方法封装到Advisor中
在获取某个对象的时候,
aop中常见的通知类型?
前置通知,后置通知,环绕通知,返回通知,异常通知
说说你在spring中用到的常见annotation?
@Component,@Service,@Controller,@Repository,@Bean,@Configuration,@Resource,@Autowired,@Scope,
spring中事务的传播特性
propagation_required
如果当前没有事务,就创建一个事务。如果当前存在事务,就加入该事务,是Spring默认的事务传播行为
supports
支持当前事务,如果当前存在事务,就加入该事务,不存在就以非事务执行
mandatory
支持当前事务,如果当前存在事务就加入,不存在就抛出异常
requires_new
创建新事物,无论当前存不存在事务,都创建 新事务
not_support
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
never
以非事务方式执行,如果存在事务就抛出异常
nested
如果当前存在事务,则在嵌套事务内执行。没有事务就按required属性执行
spring事务失效
spring容器启动过程【这是源码级的,根据自己情况】
Spring中用到了哪些设计模式?
单例
工厂--简单工厂,工厂模式
代理
Spring事务实现方式
编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。
说一下设计模式7大原则
单一职责
里氏替换
依赖倒置
开放式关闭
接口隔离
合成复用
迪米特原则