侧边栏壁纸
博主头像
Mr.D的小破站博主等级

身如柳絮随风扬,无论云泥意贯一

  • 累计撰写 21 篇文章
  • 累计创建 9 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Spring

Mr.D
2024-09-29 / 0 评论 / 0 点赞 / 4 阅读 / 22304 字

淡淡你对spring的理解

spring从狭义上理解就是轻量级的框架,主要针对早期的EJB而言,整合各种框架,管理了很多bean,底层有IOCAOP支撑。

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做了增强,主要是:

  1. 国际化

  2. 事件发布机制

  3. 资源文件的访问方式

区别是:

  1. 功能上:BeanFactory是Spring的底层接口,定义了IOC的基本功能。ApplicationContext接口继承了BeanFactory,还继承了MessageSource,因此还支持国际化,资源访问等功能。

  2. 加载形式:BeanFactory在初始化的时候,并未实例化Bean,直到需要使用某个Bean时才会实例目标Bean。ApplicationContext在初始化应用上下文时就实例化所有单实例Bean。但是配置很多个Bean时,启动很慢。

  3. BeanFactory与ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor使用。不同的是BeanFactory是手动注册,ApplicationContext是自动注入。

Spring中Scope属性(Bean作用范围)

  • singleton单例,默认

  • prototype多例

  • 还有request,session,global session

可以通过xml配置中通过bean元素上通过scope属性指定。

Spring创建对象的方式有那些

  1. 构造器实例化

  2. 静态工厂实例化

  3. 实例工厂实例化

  4. 实现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 个阶段

  1. 实例化(Instantiation)

  2. 属性赋值(Populate)

  3. 初始化(Initialization)

  4. 销毁(Destruction)

完整步骤

  1. 实例化

  2. 依赖注入

  3. BeanNameAware,BeanFactoryAware方法执行

  4. 初始化前BeanPostProcessor的before处理

  5. InitialingBean接口方法执行

  6. 初始化

  7. BeanPostProcessor的after处理

  8. 使用Bean

  9. DisposableBean接口方法执行

  10. 销毁Bean

springbean的常见注入方式

  • setter方法注入

  • 构造方法注入

spring是如何解决循环依赖的?【特别重要】

  1. 先获取A对象,先判断在singleObjects有没有,没有就创建

  2. A创建完成之后,判断A是否为单例,且没有创建完毕,如果是就存到三级缓存中

  3. 在A中注入B,先在单例池中获取B,没有就创建

  4. B创建完成之后,判断B是否为单例,其没有创建完毕,如果是就存到三级缓存中。

  5. 在B中注入A属性,先从一级缓存,二级缓存查找A属性,都没有就从三级缓存找,接下来把A存到二级换存,删除三级缓存,所以B中的A属性获取成功。所以B实例化,初始化全部完成。

  6. B就存入一级缓存中,清空二级、三级缓存

  7. 再到A中填充B属性,先从一级缓存找,此时B已经创建好了,所以直接拿到。得到一个完整的A

  8. 把A放到一级缓存,清空二级三级缓存

  9. 第二次遍历,开始获取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?

  1. 模块化:Spring AOP将横切关注点从主业务逻辑代码中分离出来,以模块化的方式实现对这些关注点的管理和重用。这样,我们可以更容易地维护代码,并且可以将同一个关注点的逻辑应用到多个方法或类中。

  2. 非侵入式:使用Spring AOP时,我们不需要修改原始业务逻辑代码,只需要在切点和增强中定义我们所需要的逻辑即可。这样,我们可以保持原始代码的简洁性和可读性。

  3. 可重用性:我们可以将同一个切面应用于多个目标对象进行横切处理。这样,我们可以提高代码的重用性,并且可以更加方便地维护和更新切面逻辑。

  4. 松耦合:AOP可以减少各个业务模块之间的耦合度,这是因为我们可以将某些通用的逻辑作为切面来实现,而不是直接在各个业务模块中实现。这样可以使得各个业务模块之间更加独立,从而提高代码的可维护性。

  1. 权限检查

  2. 记录日志

  3. 某个方法的执行时长

  4. spring的声明性事务

Spring AOP和AspectJ AOP有什么区别?

  1. 面向的对象不同

    1. Spring AOP是针对Spring框架的AOP实现

    2. AspectJ是Java中独立的AOP框架

  2. AOP实现方式不同

    1. Spring AOP使用代理方式实现,JDK动态代理或CGLIB代理

    2. AspectJ支持两种方式,第一种是编译时织入,第二种是运行时织入,目标类加载时修改字节码方式织入切面代码

  3. 支持的切面类型不同

    1. AspectJ相比于Spring AOP支持更多的切面类型

  4. 性能差异

    1. Spring AOP性能较差,AspectJ性能较好

aop原理【源码】

  1. 遍历所有Bean,找到标注Aspect的地方,将里面标注了通知的方法拿出来,将切面中带通知注解的方法封装到Advisor中

  2. 在获取某个对象的时候,

aop中常见的通知类型?

前置通知,后置通知,环绕通知,返回通知,异常通知

说说你在spring中用到的常见annotation?

@Component,@Service,@Controller,@Repository,@Bean,@Configuration,@Resource,@Autowired,@Scope,

spring中事务的传播特性

  1. propagation_required

    1. 如果当前没有事务,就创建一个事务。如果当前存在事务,就加入该事务,是Spring默认的事务传播行为

  2. supports

    1. 支持当前事务,如果当前存在事务,就加入该事务,不存在就以非事务执行

  3. mandatory

    1. 支持当前事务,如果当前存在事务就加入,不存在就抛出异常

  4. requires_new

    1. 创建新事物,无论当前存不存在事务,都创建 新事务

  5. not_support

    1. 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起

  6. never

    1. 以非事务方式执行,如果存在事务就抛出异常

  7. nested

    1. 如果当前存在事务,则在嵌套事务内执行。没有事务就按required属性执行

spring事务失效

spring容器启动过程【这是源码级的,根据自己情况】

Spring中用到了哪些设计模式?

单例

工厂--简单工厂,工厂模式

代理

Spring事务实现方式

  • 编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。

  • 声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。

说一下设计模式7大原则

单一职责

里氏替换

依赖倒置

开放式关闭

接口隔离

合成复用

迪米特原则

0
博主关闭了当前页面的评论