一零七一、Spring大海捞针篇

IOC,AOP?

IOC(控制反转)是一种设计模式,它将对象的创建、依赖注入和管理交给了容器来完成,而不是由开发者手动管理。

这样做的好处是降低了组件之间的耦合度,提高了代码的可维护性和可扩展性。

AOP(面向切面编程)是一种编程思想,将应用业务逻辑和系统服务分离开,可以通过配置文件或注解的方式来定义切面和切点

Spring注入Bean的几种方式?

静态注入

工厂注入

set注入

构造注入

Bean的生命周期?

实例化->属性赋值->初始化->使用->销毁

Trancational注解的作用?

用于标记需要进行事务管理的方法或类,在执行过程中自动开启事务,简化事务管理代码,并提供了灵活的事务属性配置。

Spring常用注解有哪些?注解的作用,以及相似注解有何区别?

@Component:标记一个类为Spring容器的组件,通常用于普通的Java类。

@Controller:标记一个类为Spring MVC的控制器,负责处理用户请求并返回响应结果。

@Service:标记一个类为业务逻辑层(Service层)的组件,通常被用于注解Service类。

@Repository:标记一个类为持久层(Repository层)的组件,通常被用于注解DAO类。

@Autowired:自动装配,通过类型进行自动装配,将对应类型的Bean注入到属性、构造方法或方法参数中。

@Qualifier:结合@Autowired使用,通过指定Bean的名称来指定具体要注入的Bean。

@Value:注入属性值,可以将配置文件中的值注入到属性中。

@RequestMapping:用于映射请求路径和处理方法,指定URL与方法的对应关系。

@PathVariable:用于获取请求路径中的占位符参数。

@RequestBody:将请求体的内容绑定到方法的参数上。

@ResponseBody:将方法的返回值直接作为响应体返回给客户端。

@GetMapping、@PostMapping、@PutMapping、@DeleteMapping:更具体的映射注解,用于定义特定HTTP方法的请求映射。

相似注解的区别主要体现在使用场景和语义上的差异:

@Component、@Service和@Repository都可以用来标识组件,但它们的意图和使用场景不同。@Component是通用的组件标识,可以用于任何类型的组件;@Service通常用于标识业务逻辑层的组件;@Repository通常用于标识持久层(DAO)的组件。

@Autowired和@Qualifier常一起使用,@Autowired根据类型进行自动注入,而@Qualifier根据名称指定具体要注入的Bean。这两个注解可以结合使用,实现更精细的依赖注入。

@RequestMapping是Spring MVC的核心注解,用于映射请求路径和处理方法;@GetMapping、@PostMapping、@PutMapping、@DeleteMapping是对@RequestMapping的更加具体的映射注解,用于定义特定HTTP方法的请求映射。

Component与Bean的区别?

Component是一个用于标识类的注解,用于告诉Spring这个类是---个组件。

而Bean是一个在Spring容器中被管理的对象,可以是Component 注解标记的类,也可以是其他定义方式创建的对象。

BeanFactory、FactoryBean和ApplicationContext的区别?

BeanFactory(Bean工厂):是Spring框架中最基本的IoC容器,负责管理和创建Bean对象。它提供了基本的Bean定义、创建和获取功能

FactoryBean(工厂Bean):是一个特殊的Bean,它是通过实现FactoryBean接口来创建Bean实例的,可以自定义创建Bean。

ApplicationContext(应用上下文):是Spring框架中最常用的高级IoC容器,继承自BeanFactory接口,提供了更多的功能和特性。ApplicationContext在加载配置文件时就实例化所有的Bean,并完成Bean的依赖注入,因此比BeanFactory更加重量级。

Spring循环依赖问题如何解决?常见的解决方案?

三级缓存来解决

三级缓存:创建对象的工厂

二级缓存:没有初始化的半成品对象

一级缓存:完整对象,可以直接使用

三级缓存new了对象a和对象b,属性填充的时候b需要引用a,a进入二级缓存,b完成生命周期结束进入一级缓存,a从二级缓存进入一级缓存,

现在ab全部进入了一级缓存,拿到了ab对象
二级缓存可以解决循环依赖问题吗?

使用三级缓存的目的是为了不破坏Bean的生命周期,不使用AOP的动态代理二级缓存也是可以的

用了动态代理的话,多次获取动态代理的对象是不同的,不能解决

Spring的事务传播机制?

Spring的事务传播机制是指在一个业务方法调用另一个业务方法时,如何处理事务的传播行为。

REQUIRED(默认):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是最常用的传播行为,它确保多个业务方法在同一个事务中执行。

常见的事务失效的场景有哪些?

没有用public修饰

this调用不会使用动态代理对象

没有用Spring容器去管理的Bean

Spring事务的底层实现原理?

AOP动态代理实现

spring bean是线程安全吗?

单例模式 线程不安全, 在单例作用域下,Spring容器只会创建一个Bean实例,并且该实例会被多个线程共享。

原型模式 线程安全, 在原型模式下,每次获取Bean时,都会创建新的Bean实例,线程安全。

Spring框架中使用了那些设计模式?谈---谈

IOC 通过IoC容器,Spring实现了对象的创建和管理,将对象的控制权交给了框架。

DI 通过DI,Spring框架负责将对象的依赖关系注入到对象中,而不是由对象自行创建依赖对象。这样可以降低对象之间的耦合性,提高代码的可维护性和扩展性。

工厂模式 BeanFactory作为IoC容器,负责创建和管理Bean的生命周期。它根据配置信息创建Bean实例,并在需要时将Bean注入到其他对象中。

单例模式 通过单例模式,Spring确保每个Bean只有一个实例存在于容器中,并且可以被多个对象共享使用。

动态代理 AOP借助动态代理实现,通过动态代理技术,Spring能够在运行时为目标对象动态生成代理对象,并在代理对象中添加切面逻辑。

springMVC分别代表什么?对应处理什么逻辑功能?

Model(模型):Model用于封装从数据库或其他数据源中获取的数据,以供视图(View)显示,Model可以通过ModelAndView对象传递给视图

View(视图):View负责展示数据给用户,并生成最终的响应结果。

Controller(控制器):Controller接收并处理用户的请求,并调用相应的服务或业务逻辑来完成请求的处理。

SpringBoot的启动流程?

1、SpringBoot加载application.properties或application.yml等配置文件

2、创建Application上下文执行环境

3、扫描注册Bean

4、加载配置,连接池,web容器

5、运行应用程序,启动内嵌的Tomcat,web服务器监听指定端口,处理HTTP请求并转发

6、调用服务,访问数据库

Spring,SpringBoot、SpringMVC的区别?

Spring:Spring是一个轻量级的Java开发框架,Spring框架的核心特性包括依赖注入(DI)、面向切面编程(AOP),也可以与Hibernate、MyBatis集成

SpringBoot:集成了内嵌的Tomcat服务器,让开发者更快的去构建web服务

Spring MVC:Web框架,提供一套丰富的功能组件,Spring MVC可以将请求的URL映射到对应的处理方法上,并通过ModelAndView对象将模型数据渲染到视图上。

SpringBoot与SpringCloud的区别

Spring Boot用于快速构建独立的Spring应用程序,而Spring Cloud用于构建分布式系统和微服务架构。

Spring Boot关注于单个应用程序的开发,提供了各种开箱即用的特性

Spring Cloud关注于分布式系统的开发,提供了一套分布式系统的解决方案。

在实际开发中,可以同时使用Spring Boot和Spring Cloud来构建高效、可扩展的分布式应用程序。

AOP底层是怎么实现的?

基于接口的动态代理使用Java的Proxy类来实现

基于类的动态代理使用CGLIB来生成子类,并覆盖被代理类的方法。

Aop有几种实现方式?有哪些区别?

JDK动态代理,JDK动态代理是基于Java的Proxy类实现的,动态生成目标对象的代理对象,不需要手动创建

CGLIB动态代理,通过生成目标类的子类,并覆盖其中的方法来实现代理。

相比于JDK动态代理,CGLIB动态代理的代理过程更加底层,性能也更高,但生成的代理类可能比较复杂。

springboot自动装配原理?

读取spring.factories文件,然后获取到EnableAutoConfiguration对应的值就是我们自动装配的默认配置类的全类名,

拿到这个集合后经过验证,去重,排除自动装配以及执行监听器等操作最终返回String数组,此数组就是我们最终要自动装配的配置类集合,SpringBoot再根据这些数据进行配置类的加载,完成整个自动装配。

restcontroller和controller区别是什么?

1.用Controller配合视图解析器才能返回到指定页面。在对应的方法上加上ResponseBody注解才能返回JSON,XML或自定义mediaType的内容到页面。

2.不可以只用RestController注解Controller,因为这样会让Controller中的内容不能返回jsp页面,而且会直接返回Return里的内容。

3.RestController相当于Controller和ResponseBody两者合并起来的作用。

requestbody和responsebody的区别?

@RequestBody用于获取请求体中的数据并将其转换为方法参数,@ResponseBody用于将方法的返回值直接作为响应体返回给客户端

autowhile和resource注解的区别

@Autowired和@Resource都是用于依赖注入的注解,但是@Autowired是Spring框架提供的注解,按照类型自动装配;而@Resource是Java EE规范的注解,按照名称自动装配。

对象的生命周期?

创建->使用->销毁->垃圾回收

component和Bean注解的区别?

@Component 注解作用于类,而 @Bean 注解作用于方法、

@Component 通常是通过路径扫描来自动侦测以及自动装配到 Spring 容器中

@Bean 告诉了 Spring 这是某个类的实例,当我们需要用它的时候还给我。

spring中的事务?

声明式事务:通过在配置文件中或使用注解的方式声明事务的属性,让Spring框架自动为方法或类应用事务管理

编程式事务:通过编写代码手动管理事务的开启、提交、回滚等操作。在编程式事务管理中,需要使用Spring提供的TransactionTemplate或PlatformTransactionManager接口来进行事务控制。


相关推荐
無限進步D2 小时前
Java 运行原理
java·开发语言·入门
難釋懷2 小时前
安装Canal
java
是苏浙2 小时前
JDK17新增特性
java·开发语言
不光头强2 小时前
spring cloud知识总结
后端·spring·spring cloud
GetcharZp5 小时前
告别 Python 依赖!用 LangChainGo 打造高性能大模型应用,Go 程序员必看!
后端
阿里加多5 小时前
第 4 章:Go 线程模型——GMP 深度解析
java·开发语言·后端·golang
likerhood6 小时前
java中`==`和`.equals()`区别
java·开发语言·python
小小李程序员6 小时前
Langchain4j工具调用获取不到ThreadLocal
java·后端·ai