spring
核心思想:
spring的核心:
IOC和AOP
用到了哪些设计模式:
bean的创建:
单例模式
工厂模式
ioc:
对ioc的理解?
用ioc容器来控制对象,控制就是对象的创建,初始化,销毁。解决了繁琐的对象生命周期操作。
ioc如何实现的?
依赖注入和容器实现
依赖注入,控制反转分别是什么?
控制反转:流程的控制权从程序员变成了框架
依赖注入:将依赖的类对象通过在外部创建好通过构造函数,函数参数等方式给类使用
如何实现依赖注入:
构造器注入
Setter方法注入
字段注入
spring容器里存储的是什么?
Bean对象
Bean是单例的吗?
默认是单例,也可以通过修改作用域使Bean在每次请求都会创建一个实例。
单例Bean要考虑线程安全问题。
Bean的作用域:
可以通过scope注解自定义实现,默认都是单例,还有像prototype这样的。
Bean的生命周期
生命周期:
1:实例化
2:属性赋值
3:初始化方法:
初始化的前置方法
初始化方法
初始化的后置方法
4:使用
5:销毁
spring如何解决循环依赖?三级缓存结构是什么?为什么用三级缓存解决循环依赖问题?
1:
三级缓存
2:
一级是已经完成实例化的
二级是正在进行属性注入但是发现有循环依赖的
三级是未经加工的工厂,里面创建了原始类,可以通过这个工厂的getObject来获取这个类,如果这个类被代理就会创建代理对象
3:
为了正确处理AOP代理的Bean。
三级缓存只是提前“借调”了一次同样的钩子,保证循环依赖时注入的引用就是最终形态,且不会重复生成代理。
AOP:
AOP的概念:
面向切面编程,能够将与业务无关,却为业务模块所共同调用的逻辑封装起来
大大降低了代码的重复率,降低模块之间的耦合度。
AOP通过什么机制实现的?
动态代理
事务管理:
概念:
spring提供了一致的事务管理接口,支持声明式和编程式事务。
什么时候会失效?
第一种,@Transactional 注解用在非 public 修饰的方法上。
因为:Spring 的 AOP 代理机制决定了它无法代理 private 方法。
第二种,方法内部调用。
原因:使用的是 this 引用,直接访问原始对象的方法,绕过了 Spring 的代理对象,也就导致代理对象中的事务逻辑没有机会执行。
第三种,如果在事务方法内部用 try-catch 捕获了异常,但没有在 catch 块中将异常重新抛出,或者抛出一个新的能触发回滚的异常。
原因:那么 Spring 的事务拦截器就无法感知到异常的发生,也就没办法回滚。
第四种,Spring 事务默认只对 RuntimeException 和 Error 类型的异常进行回滚。
springmvc:
处理流程:
1:用户发起的 HTTP 请求,首先会被 DispatcherServlet 捕获
2:会根据 URL、请求方法等信息,交给 HandlerMapping 进行路由匹配,查找对应的处理器,也就是 Controller 中的具体方法。
3:找到对应 Controller 方法后,DispatcherServlet 会委托给处理器适配器 HandlerAdapter 进行调用。
4:Controller 方法最终会返回结果,比如视图名称、ModelAndView 或直接返回 JSON 数据。
springboot:
springboot比spring好在哪?
提供了自动配置
内嵌多种服务器
自动配置和自动装配:
自动配置:
classpath中有springboot-starter-*就默认注册所需的全套Bean
一些相关配置只需要在yml中改改就可以了
自动装配:
是实现自动配置的方法
约定优于配置:
Spring Boot 先帮 80 % 的场景定好“潜规则”,你按规则放东西就行;只有剩下 20 % 的个性化需求才需要你去改 yml 或写配置。