什么是spring
Spring是一个开源框架,它是为了解决企业应用开发的复杂性而创建的。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
IOC(控制反转)
它不是一种技术而是一种设计思想,负责创建对象,管理对象(通过依赖注入(DI),创建对象的权限原来是在代码应用中的,现在交给了spring容器帮我们创建。优点:耦合性降低,更加专注于业务逻辑,代码量降低。
依赖注入(其实跟IOC一个概念)
当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。
依赖注入有几种形式
- 接口注入:指的是在接口中定义要注入的信息,并通过接口完成注入。
- Set注入:指的是在接受注入的类中定义一个set方法,并在参数中定义需要注入的的元素
- 构造出方法注入:的是在接受注入的类中定义一个构造方法,并在参数中定义需要注入的元素。当有多个构造方法时,spring默认的是选构造方法,当只有一个有参构造方式时,spring会选该方法,但是当有多个有参构造方法时,spring就不知道该找谁了,就会报错。
AOP(面向切面)
能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可扩展性和可维护性。
AOP的相关名词
Advice (增强/通知) 表示需要扩展的功能。
JoinPoint (连接点) 表示允许使用增强的地方。基本每个方法的前、后或异常等都是连接点。
Pointcut (切入点) 表示实际增强的方法。
Aspect (切面) 表示扩展功能的过程。
Introduction( 引入) 表示向现有的类中添加新方法、新属性。
Target (目标对象) 表示被增强的对象。
Proxy (代理) 表示实现AOP的机制。
Weaving (织入) 表示把增强应用到目标对象的过程。
补充知识:AOP称为面向切面编程。
AOP的本质是过滤器。
AOP的实现原理是代理模式。
spring框架用到了哪些设计模式
1.工厂设计模式:Spring使用工厂模式通过BeanFactory和ApplicationContext创建bean对象。
2.代理设计模式:Spring AOP功能的实现。
3.单例设计模式:Spring中的bean默认都是单例的。
4.模板方法模式:Spring中的jdbcTemplate、hibernateTemplate等以Template结尾的对数据库操作的类,它们就使用到了模板模式。
5.包装器设计模式:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
6.观察者模式:Spring事件驱动模型就是观察者模式很经典的一个应用。
7.适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式、Spring MVC中也是用到了适配器模式适配Controller。
spring的生命周期
第一阶段:实例化(Instantiation)
//实例化是指Bean 从Bean到Object
Object wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
第二阶段: 属性赋值
第三阶段:初始化(Initialization)
单列bean实在启动ioc容器就创建了,但是多例bean是在getBean时才去创建。
第四阶段:销毁:调用destory方法。
什么是bean的自动装配
Spring 容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通过Bean工厂自动处理bean之间的协作。
如何自动检测bean
@Component:标识该类为spring组件
@Controller:标识该类为spring mvc
@Respository:标识该类为数据仓库
@Service:标识该类为服务
spring 的优点
- 分层架构 ,所以你只需要关注你所需要的层,不需要管不需要的层,这样提高了业务的专注性。
- 依赖注入和IOC使JDBC操作简单化
- spring是开源的框架
- spring使得对象管理集中化和简单化
- spring是POJO,POJO编程使得可持久化构建和可测试能力提高。
四种类型的自动装配
byName
按照bean的属性名称来匹配要装配的bean
byType
按照bean的类型来匹配要装配的bean
constructor
按照bean的构造器入参的类型来进行匹配
autodetect(自动探测)
先使用constructor进行装配,如果不成功就使用byType来装配
spring事务有几种
编码式事务,声明式事务
声明式事务管理的事务属性有几种
脏读,不可重复读和幻读是什么意思
什么是spring MVC,简单介绍一下你对Spring mvc的理解
Spring mvc的流程
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle.
spring mvc常用注解
Spring中的单例bean是线程安全的吗
不是,Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。
对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。
如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。
对于有状态的则可以用ThreadLocal
bean的作用域
singleton : bean在每个Spring ioc 容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。
request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
BeanFactory 工厂和 Application contexts 有什么区别?
- ApplicationContext是BeanFactory的子接口。
- BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:
①继承MessageSource,因此支持国际化。
②统一的资源文件访问方式。
③提供在监听器中注册bean的事件。
④同时加载多个配置文件。
- BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。
- ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。
什么是Servlet
它其实就是个前端页面和数据库实现数据交互的中转站,它包括
Servlet生命周期
init()初始化阶段
Servlet容器加载Servlet,加载完成后,Servlet容器会创建一个Servlet实例并调用init()方法,init()方法只会调用一次
service()处理客户端请求阶段
每收到一个客户端请求,服务器就会产生一个新的线程去处理。然后根据客户的请求在去调用doGet()还是doPut()方法
destroy()终止阶段
当web应用被终止,或者Servlet容器终止运行,或者Servlet重新装载Servlet新实例时,Servlet容器会调用Servlet的destroy()方法