- SpringMVC
- Spring MVC 的处理流程?
- Spring
- 什么是Spring?
- Spring Bean的生命周期
- 什么是Spring IOC?
- IoC 容器初始化过程?
- 依赖注入的实现方法有哪些?
- 依赖注入的过程?
- 什么是Spring AOP
- Spring中用到了那些设计模式?
- Spring怎么解决循环依赖的?
- Spring事务失效问题
- SpringBoot
- SpringBoot自动配置的原理是什么?
- Spring Boot Stater是怎么回事?
- Spring Boot 中事务失效问题。
- SpringCloud
- 五大组件--注册中心nacos/eureka/zookeeper
- 五大组件--Feign
所有的请求会转发给 DispatcherServlet 前端处理器处理,DispatcherServlet是SpringMVC中的枢纽,接收到请求后DispatcherServlet 会请求 HandlerMapping 找出容器中被 @Controler 注解修饰的 Bean 以及被 @RequestMapping 修饰的方法和类,生成 Handler 和 HandlerInterceptor 并返回一个处理器执行链。
之后 DispatcherServlet 使用 Handler 找到对应的 HandlerApapter,通过 HandlerApapter 调用 Handler 的方法,将请求参数绑定到方法的形参上,执行方法处理请求并得到 ModelAndView。
最后 DispatcherServlet 根据使用 ViewResolver 视图解析器对得到的 ModelAndView 逻辑视图进行解析得到 View 物理视图,然后对视图渲染,将数据填充到视图中并返回给客户端。
Spring 什么是Spring?Spring是一个轻量级的java开发框架,目的是解决企业级应用开发的复杂性。Spring有两个核心特性,IOC和AOP。通过IOC容器管理Bean对象以及他们之间的依赖关系,以及IOC控制反转实现类之间的松耦合。通过AOP可以实现动态无侵入式的增强服务。
Spring Bean的生命周期SpringBean的生命周期由IOC容器管理,通过实例化,属性注入,初始化
什么是Spring IOC?IOC是一种设计思想,它将我们创建,配置对象和对象生命周期的控制权反转给了Spring的容器。通过IOC我们可以大大降低程序之间的耦合度,个人理解IOC容器就想工厂模式中的工厂,当实例化一个类的时候,通过依赖注入直接将他依赖的类注入给他,省去了很多代码,可以专注于对象的使用,开发也更简单。
IoC 容器初始化过程?创建一个IOC容器时候,首先会调用父类的构造方法设置好Bean的资源加载器以及父类的setConfigLocations配置好Bean配置信息的路径。接下来,会调用父类AbstractApplicationContext 的refresh方法来启动容器对Bean信息的载入。容器创建后通过 loadBeanDefinitions 方法加载 Bean 配置资源,该方法做两件事:① 调用资源加载器的方法获取要加载的资源。② 真正执行加载功能,由子类 XmlBeanDefinitionReader 实现。Spring IoC 容器中注册解析的 Bean 信息存放在一个 HashMap 集合中,key 是字符串,值是 BeanDefinition
依赖注入的实现方法有哪些?构造方法注入: IoC Service Provider 会检查被注入对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象。这种方法的优点是在对象构造完成后就处于就绪状态,可以马上使用。缺点是当依赖对象较多时,构造方法的参数列表会比较长,构造方法无法被继承,无法设置默认值。对于非必需的依赖处理可能需要引入多个构造方法,参数数量的变动可能会造成维护的困难。
setter 方法注入: 当前对象只需要为其依赖对象对应的属性添加 setter 方法,就可以通过 setter 方法将依赖对象注入到被依赖对象中。setter 方法注入在描述性上要比构造方法注入强,并且可以被继承,允许设置默认值。缺点是无法在对象构造完成后马上进入就绪状态。
接口注入: 必须实现某个接口,接口提供方法来为其注入依赖对象。使用少,因为它强制要求被注入对象实现不必要接口,侵入性强。
依赖注入的过程? 什么是Spring AOPAOP的目的是在不修改代码的情况下增强方法的功能。通过@Component注解将切面和增强类注入到容器中,通过动态代理模式生成代理对象,主要实现类是InvocationHandler和Proxy类。
ps:Cglib的底层原理是基于 asm 第三方框架,通过修改字节码生成成成一个子类,然后重写父类的方法,实现对代码的增强
Spring中用到了那些设计模式?单例模式:Spring 中的 Bean 默认情况下都是单例的。
工厂模式:BeanFactory和ApplicationContext都是通过工厂模式来创建Bean
代理模式:AOP的主要就是通过动态代理模式来实现的,还有JDK动态代理
模板方法模式:主要是一些对数据库操作的类用到,比如 JdbcTemplate、JpaTemplate,因为查询数据库的建立连接、执行查询、关闭连接几个过程,非常适用于模板方法
原型模式:IOC容器,通过scope=“prototype” 来将创建的类设置为原型类
Spring通过三个缓存来解决缓存依赖,假如两个对象互相形成依赖,创建BeanA时,在执行了BeanA的构造方法后就将BeanA对象放入Spring的三级缓存singletonFactories,然后发现BeanA依赖BeanB,开始创建BeanB对象,执行完BeanB的构造方法后,放入三级缓存,处理BeanB的依赖BeanA时,发现三级缓存中有一个BeanA,拿到这个BeanA完成B的注入,同时也完成A的注入。
Spring事务失效问题Spring事务 的本质其实就是数据库对事务的支持
获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); 执行CRUD 提交事务/回滚事务 con.commit() / con.rollback(); 关闭连接 conn.close();
失效原因
1、数据库引擎不支持事务
2、是否被加载为Bean
3、方法不是 public 的。 Spring 官方文档规定
4、自身调用问题
//下面两种都不生效
@Service
public class OrderServiceImpl implements OrderService {
public void update(Order order) {
updateOrder(order);
}
@Transactional
public void updateOrder(Order order) {
// update order
}
}
@Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void update(Order order) {
updateOrder(order);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateOrder(Order order) {
// update order
}
}
5.把异常吃了,然后又不抛出来,事务怎么回滚吧! 6.异常类型错误,因为默认回滚的是:RuntimeExceptionSpringBoot SpringBoot自动配置的原理是什么?
在@SpringApplicaiton里面有个@EnableAutoConfiguration注解,这个注解中通@import(AutoConfigurationimportSelector.class)导入的配置功能,AutoConfigurationimportSelector中的方法getCandidateConfigurations,得到待配置的class的类名集合,这个集合就是所有需要进行自动配置的类,而是是否配置的关键在于meta-INF/spring.factories文件中是否存在该配置信息
Spring Boot Stater是怎么回事? Spring Boot 中事务失效问题。 SpringCloud 五大组件–注册中心nacos/eureka/zookeepernacos服务注册发现原理:
注册:
在nacos包下面的spring.factories可以看到一个NacosDiscoveryAutoConfiguration的自动配置类,里面有NacosAutoServiceRegistry, 这个类的实现了ApplicationListener事件监视器中的事件处理方法,在服务启动时会调用一个叫register的方法实现nacos服务注册。nacos会维护一个存放服务信息的hashmap用于服务发现。
nacos/eureka/zookeeper的区别
nacos支持配置中心,并且可以动态的刷新配置。nacos有管理界面
五大组件–Feign概况:Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的 Request 请求
Feign是通过JDK 代理对象完成远程访问。
在服务启动的时候,会进行包的扫描并且对加了@feignCLient注解的类创建一个JDK动态代理,注入到IOC容器中。



