1.SpringBean的生命周期

1.Bean实例化
2.Bean属性注入
3.调用BeanNameAware的setBeanName方法
4.调用BeanFactory的setBeanFactory方法
5.调用ApplicationContextAware的setApplicationContext方法
6.调用BeanPostProcessor的预初始化方法
7.调用Intailizing的afterPropertertiesSet方法
8.调用初始化方法
9.调用BeanPostProcessor的初始化后方法
10.Bean就可以使用了
11.调用DisposiableBean的destory方法销毁Bean
2.Spring的循环引用问题。
1.Sping的依赖注入有两种方式:属性注入和构造器注入。
2.Spring中的bean根据作用域的不同,可以分为两类,singleton和prototype,singleton在一个容器中只
会有一个实例,而prototype在每次调用都会产生新的实例。
3.Spring中,单例bean有延迟加载和立即加载两个方式,其中立即加载模式会在容器启动的时候加载
bean,延迟加载会在容器启动后,使用到bean的时候再加载它。
循环依赖的bean都是singleton的,而且都是构造器注入的情况,无论获取那个bean都能成功。
循环依赖的bean都是prototype,那么无论获取那个bean都会失败。
循环依赖的bean中有singleton,也有prototype,那么当先获取的那个bena是singleton就会成功,否则
会失败。
也就是说,打破循环依赖的方法就是有一个bean是通过属性注入依赖,并且是singleton的,那么就无论
获取顺序,都会创建成功。
如何解决循环依赖?
假设A和B循环依赖,
1创建对象A,调用A的构造,把A保存下来。
2然后准备注入对象A中的依赖,发现A依赖对象B,那么开始创建B
3调用B的构造,并把B保存下来。
4然后准备注入B的构造,发现B依赖对象A,对象A之前已经创建,直接获取A并把A注入B,
于是B创建成功。
5把创建成功的B注入A,于是A也创建成功。
3.Spring中用到的设计模式
工厂设计模式:Spring使用工厂模式可以通过BeanFactory或者ApplicationContext创建bean对象。
BeanFactory:延迟注入,相比于BeanFactory来说会占用更少内存,程序启动速度更快。
ApplicationContext:容器启动时,不管你用到或者没用到,一次创建所有的Bean,BeanFactory仅提供
最基本的依赖注入支持,ApplicationContext还拓展了BeanFactory。
ApplicationContext的三个实现类:
1.ClassPathXmlApplication:把上下文文件当成类路径资源。
2.FileSystemXmlApplication:把文件系统中的Xml文件载入上下文定义信息。
3.XmlWebApplicationContext:从Web系统中的Xml文件载入上下文定义信息。
单例设计模式:
1对于频繁使用的对象,可以省略创建对象花费的时间,对于重量级的对象而言,更是能省下一笔非常
可观的系统开销。
2由于New操作的次数减少,降低了对系统内存的使用频率,减轻了GC压力,缩短了GC停顿时间。
Spring中Bean的默认作用域就是singleton的。
可以通过注解@Sope(value="singleton")来实现到单例。
Spring通过ConcurrentHashMap实现单例注册表的特殊方式实现代理模式
代理设计模式:AOP就是基于动态代理的。
模板方法:行为设计模式,它定义了一个操作中的算法的股价,而讲一下步骤延迟到子类 中,模板方法
使得子类可以不改变一个算法的结构从而重新定义该算法的某些特定步骤。
观察者模式:对象行为型模式,表示一种对象和对象之间具有依赖关系,当一个对象发生改变的时候,
这个对象所依赖的对象也会发生反应。Spring事件驱动模型就是观察者模式的很经典的一个应用。
装饰者模式:可以动态的给对象添加一些额外的属性或行为。相比于继承,装饰者模式更加灵活。JDK
的InputStream类下就有FileInputStream,BufferInputStream都在不修改InputStream代码的情况拓展了
它的功能。
4.解释一下Spring,SpringMVC,springBoot,SpringCloud
Spring:Spring是基于IOC和AOP的Java开发框架。
SpringMVC:SpringMVC是基于Spring的一个MVC框架。
SpringBoot:SpringBoot是基于Spring4的条件注册的一套快速开发整合包,快速启动,快速构建,在配
置文件环节省去大量时间。
SpringCloud:SpringCloud是一个微服务框架,是分布式系统解决方案。
三者的发展和联系:
Spring最初利用“工厂模式(DI)”和“代理模式(AOP)”解耦应用组件。大家都觉得挺好的,于是按照这
种模式搞了一个MVC框架,用于开发WEB应用(SpringMVC)。然后发现每次开发都要搞很多依赖,
写很多样板代码很麻烦,遇事搞了一些懒人整合包(starter),这套就是SpringBoot。升级云-Spring
Cloud:现在是大数据,云时代,上云是必然的选择,那么Spring Cloud应运而生。
5.深入的解读Spring Cloud与Spring Boot的概念和关系
SpringBoot:Spring Booti简化了基于 Spring的应用开发,通过少量的代码就能创建一个独立的、产品级
別的 Spring应用。 Spring Boot为 Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不素地
开始。多数 SpringBoot应用只需要很少的 Spring配置。
Spring Boot的核心思想就是约定大于配置,一切自动完成。采用 Spring Boot可以大大的简化你的开发模
式,所有你想集成的常用框架,它都有对应的组件支持。
Spring Cloud:Spring Cloud是一系列框架的有序集合。它利用 Spring Boot的开发便利性巧妙地简化了分
布式系统基础设施的开发,如服务发现注册、配置中心、消息中心、负载均衠、断路器、数据监控等,都
可以用 Spring Boot的开发风格做到一键启动和部署。Spring Cloud就是一套分布式服务治理的框架,既然
它是一套服务治理的框架,那么它本身不会提供具体功能性的操作,更专注于服务之间的通讯、熔断、监控
等。因此就需要很多的组件来支持一套功能。
SpringBoot和SpringCloud的关系
Spring Boot是 Spring的一套快速配置脚手架,可以基于 Spring Boot快速开发单个微服务, SpringCloud是
一个基于 Spring Boot实现的云应用开发工具; Spring Boot专注于快速、方便集成的单个微服务个体,
Spring Cloud关注全局的服务治理框架; Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选
择好了,能不配置就不配置, Spring Cloud很大的一部分是基于 Spring Boot来实现,可以不基于 Spring Boot
吗?不可以。 Spring Boot可以离开 Spring Cloud独立使用开发项目,但是 Spring Cloud离不开 Spring
Boot,属于依赖的关系
Spring-> Spring Boot> Spring Cloud这样的关系
SpringCloud架构
1、外部或者内部的非 Spring Cloud都统一通过API网关(Zuul)来访问内部服务.。
2、网关接收到请求后,从注册中心( Eureka)获取可用服务。
3、由 Ribbon进行均衡负载后,分发到后端的具体实例。
4、微服务之间通过 Feign进行通信处理业务。
5、 Hystrix负责处理服务超时熔断。
6、 Turbine监控服务间的调用和熔断相关指标。
6.Spring的AOP
AOP是Spring框架面向切面的编程思想,AOP采用一种称为“横切”的技术,将涉及多业务流程的通用功能
抽取并单独封装,形成独立的切面,在合适的时机将这些切面横向切入到业务流程指定的位置中。
Spring框架的AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代码。在业务流程
执行过程中,Spring框架会根据业务流程要求,自动把独立编写的功能代码切入到流程的合适位置。
不改变原有代码的,对原有功能进行拓展和修改,就叫面向切面编程,比较形象就是日志类。
在业务逻辑执行过程中,AOP会把分离出来的切面和关注点动态切入到业务流程中,这样做的好处是提高
了功能代码的重用性和可维护性。
AOP的实现过程,具体实现步骤是:首先编写需要切入业务流程的独立模块(也称为切面)和切入点(模
块中的方法);然后在Spring配置文件中配置AOP,添加切入面、切入点以及需要切入的目标Bean;最后
编写测试代码。
7.Spring的事务是如何回滚的
什么是事务?
事务是逻辑上的一组操作,组成这个操作的各个单元,要么一起成功,要么一起失败。
事务的特性:
原子性,一致性,隔离性,持久性。
事务是一个原子操作,要么失败要么成功。一点事务完成,系统必须确保他所1建模的业务处于一致的状
态,而不是部分完成或者部分失败。
各个事务之前是隔离状态,哪怕是处理相同的数据,也不会互相干扰。
一旦事务完成,无论系统发生任何错误,结果不会受到影响,事务的接口被持久化存储器中。

Spring在具体使用事务的方法所在的类上面添加注解:@Transactional
Spring事务配置:
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entryManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- 开启注解事务-->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
Spring事务配置
在spring的配置文件中,如果数据源的defaultAutoCommit设置为true,
那么方法中如果自己捕获了异常,事务是不会回滚的,如果没有自己捕获异常则事务会回滚。
8 SpringMVC的流程
SpringMVC提供的构建Web应用程序的全功能MVC模块。SpringMVC是一种web层的木vcjiagou,yongyu
替代servlet(处理响应请求,获取表单参数,表单验证等)
工作流程

1.用户发送请求至前端控制器DispatcherServlet。
2.DispatcherServlet收到请求调用HandlerMapping处理映射器。
3.处理器映射器找到具体的处理器,生成处理器对象及处理器一并返回给DispatcherServlet。
4.DispatcherServlet调用HandlerAdapter处理器适配器。
5.HandlerAdapter经过适配器调用具体的处理器(Controller,也叫后端控制器)
6.Controller执行完成返回ModelAndView。
7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet.
8.DispatcherServlet将ModelAndView传入ViewReslover视图解析器。
9.ViewReslover解析后发挥具体的View。
10.DispatcherServlet根据View进行渲染视图。
11.DispaterServlet响应用户。
9常用注解
@Controller:标识这个主类是一个控制器。
@RequestMapping:给控制器方法绑定一个uri。
@ResponseBody:将java 对象转成json,并且发到客户端。
@RequestBody:将客户端请求过来的json转成java对象。
@RequestParam:将表单参数和方法形参名字不一致时,做一个名字映射。
@PathVarible:用于获取uri中的参数,比如user/1中1的值。
SpringMVC是单例模式的框架,但它是线程安全的,因为SpringMVC没有成员变量,
所有的参数的封装都是基于方法的,属于当前线程的私有变量,因此是线程安全的框架,所以效率高。
本文深入探讨Spring框架的关键概念,包括Bean的生命周期、循环引用处理、设计模式应用、SpringMVC、SpringBoot与SpringCloud的关系,以及Spring的AOP、事务管理、SpringMVC的工作流程,帮助读者全面理解Spring框架的运作机制。
427

被折叠的 条评论
为什么被折叠?



