使用Spring框架的好处是什么?
控制反转 :Spring通过控制反转实现了一定的解耦,通过依赖注入,而不是传统的创建对象- 面向切面编程(AOP):Spring支持面向切面编程,并把应用业务逻辑和系统服务分开
- 容器技术:Spring包含并管理应用中对象的生命周期和配置
- MVC框架:使用SpringMVC框架代传统的Web框架
- 事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务
- 异常处理:Spring提供方便的API把具体技术相关异常转换为一致的unchecked异常
什么是Spring IOC容器?
Spring框架的核心是Spring容器。容器创建对象,并将他们装备在一起,配置他们并管理他们的完整生命周期。Spring容器使用依赖注入来管理组成应用程序的组件。
IoC(IOC思想)
IoC (Inversion of Control,控制反转) ,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。只是因为该理论时间成熟相对较晚,并没有包含在GoF中。 系统中通过引入实现了IoC模式的IoC容器,即可由IoC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分离。 从使用上看,以前手动new对象,并设置对象中属性的方式,控制权是掌握在应用程序自身。现在则全部转移到了容器,由容器来统一进行管理对象。因为控制权发生了扭转,所以叫控制反转。 实现了IoC思想的容器就是IoC容器,比如:SpringFremework.
DI(依赖注入)
DI (Dependency Injection,依赖注入) 是实现IoC的方法之一。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。 所以,依赖注入(DI)和控制反转(IoC)是从不同的角度的描述的同一件事情,就是指通过引入 IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦。
初始化/注册Bean
方式一:类注解
在类上使用注解 @Controller (前端业务交互层), @Service(业务处理层) , @Repository(数据交互层DB) , @Component(注解) 。
方式二:@Bean
当前类被 Spring 扫描到时,可以在方法上使用@Bean注解,通过方法返回类型,也可以定义、注册Bean对象,默认使用方法名作为Bean的名称。
注入指定的Bean:@Qualifier
方式三:@Configuration
在类被Spring扫描到时,使用@configuration 注解,可以注册一个配置类到容器中。配置类一般用来自定义配置某些资源。之后会在SpringMVC中用到。
方式四:FactoryBean接口
什么是依赖注入?依赖注入的方式有哪几种?
在依赖注入时,不必创建对象,但必须描述如何创建他们。使用的时候有IOC容器将他们组装在一起 通常,依赖注入可以通过以下几种方式去完成
属性注入(@Autowrid)
当前类被 Spring 扫描到时,可以在属性上使用**@Autowrid**注解,会将容器中的Bean对象装配进来。
setter注入
也可以在setter方法上使用@Autowrid注解:说明:其实只要写在方法上的 @Autowrid注解,都会将容器中的Bean对象注入方法参数,setter注入本质也是这样,只是setter方法一般都是设置属性用的,所以也归到属性注入。
构造方法注入
当前类被 Spring 扫描到时,可以在构造方法上使用@Autowrid注解(也可以不加@Autowrid注解),作用和setter类似,会将容器中的Bean对象注入方法参数。
setter注入和构造方法注入的区别
Bean的作用域
Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域。Spring有6个作用域,最后四种是基于Spring WebMVC生效,可用scope()指定使用某个作用域。
描述:该作用域下的Bean在IoC容器中只存在一个实例:获取Bean(即通过applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是同一个对象。 场景:通常无状态的Bean使用该作用域。无状态表示Bean对象的属性状态不需要更新 备注:Spring默认选择该作用域
描述:每次对该作用域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是新的对象实例。 场景:通常有状态的Bean使用该作用域
描述:每次http请求会创建新的Bean实例,类似于prototype 场景:一次http的请求和响应的共享Bean 备注:限定SpringMVC中使用
描述:在一个http session中,定义一个Bean实例 场景:用户回话的共享Bean, 比如:记录一个用户的登陆信息 备注:限定SpringMVC中使用
描述:在一个http servlet Context中,定义一个Bean实例 场景:Web应用的上下文信息,比如:记录一个应用的共享信息 备注:限定SpringMVC中使用
描述:在一个HTTP WebSocket的生命周期中,定义一个Bean实例 场景:WebSocket的每次会话中,保存了一个Map结构的头信息,将用来包裹客户端消息头。第一 次初始化后,直到WebSocket结束都是同一个Bean。 备注:限定Spring WebSocket中使用
Bean的生命周期
生命周期概览 Spring容器中Bean的生命周期,类似于流水线上制造一辆汽车,一台电脑,将繁多的工序流水线化、流程化以后,才可以方便的管理,如生产电脑经历了组装CPU,主板,显卡等等工序,需要在安装CPU以前检查是否有美国的监听器,就可以方便的到具体的流水线上某个点执行。Bean对象生命周期也是如此。
总结 对于Bean的生命周期,主要步骤为:
- 实例化Bean:通过反射调用构造方法实例化对象(字节流转换为内存对象)。
- 依赖注入:装配Bean的属性
- 实现了Aware接口的Bean,执行接口方法:如顺序执行BeanNameAware、BeanFactoryAware、
ApplicationContextAware的接口方法。 - Bean对象初始化前,循环调用实现了BeanPostProcessor接口的预初始化方法
(postProcessBeforeInitialization) - Bean对象初始化:顺序执行@PostConstruct注解方法、InitializingBean接口方法、init-method
方法 - Bean对象初始化后,循环调用实现了BeanPostProcessor接口的后初始化方法
(postProcessAfterInitialization) - 容器关闭时,执行Bean对象的销毁方法,顺序是:@PreDestroy注解方法、DisposableBean接口
方法、destroy-method
补充说明:第一步的实例化是指new对象,Spring的语义中说初始化Bean包含Bean生命周期中的初始 化步骤。
什么是AOP?
AOP面向切面编程。
- 要理解切面编程,就需要先理解什么是切面。用刀把一个西瓜分成两瓣,切开的切口就是切面;编程中,对象与对象之间,方法与方法之间,模块与模块之间都是一个个切面。
- AOP(Aspect Oriented
Programming)称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等。 - AOP利用一种称为"横切"的技术,将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。
- 使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。
- 横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
AOP的使用场景
对以上统一业务来说,常见的切面业务如:
- 响应统一的数据格式
- 统一异常处理
- 统一日志记录,如跟踪用户访问信息
- 用户统一会话管理、权限管理
- 方法执行时间计算
- 事务管理
- 其他
对于使用AOP技术来说,解决的最大问题就是对横切业务的统一管理:
- 横切代码的高度复用,和业务代码互相独立,满足代码设计上的高内聚低耦合
- 系统更好的扩展性,可维护性
AOP有哪些实现方式?
实现AOP的技术,主要分为两大类: 静态代理-指使用AOP框架提供的命令进行编译,从而在编译阶段就可生成AOP代理类,因此也称为编译时增强;
- 编译时编织(特殊编译器实现)
- 类加载时编织(特殊的类加载器实现)
动态代理-在运行时在内存中“临时"生成AOP动态代理类,因此也被称为运行时增强。
- JDK动态代理:通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。
- CGLIB动态代理:如果目标类没有实现接口,那么spring AOP会选择使用CGLIB来动态代理目标类。
Spring怎么解决循环依赖
spring对循环依赖的处理有三种情况:
- ①构造器的循环依赖:这种依赖spring是处理不了的,直接抛出BeanCurrentlylnCreationException异常。
- ②单例模式下的setter循环依赖:通过“三级缓存”处理循环依赖。
- ③非单例循环依赖:无法处理。
为什么要使用Spring Boot
SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
在使用Spring框架进行开发的过程中,需要配置很多Spring框架包的依赖,如spring-core、spring-bean、spring-context等,而这些配置通常都是重复添加的,而且需要做很多框架使用及环境参数的重复配置,如开启注解、配置日志等。Spring Boot致力于弱化这些不必要的操作,提供默认配置,当然这些默认配置是可以按需修改的,快速搭建、开发和运行Spring应用。
以下是使用SpringBoot的一些好处:
- 自动配置,使用基于类路径和应用程序上下文的智能默认值,当然也可以根据需要重写它们以满足开发人员的需求。
- 创建Spring Boot Starter项目时,可以选择选择需要的功能,Spring Boot将为你管理依赖关系
- SpringBoot项目可以打包成jar文件。可以使用Java-jar命令从命令行将应用程序作为独立的Java应用程序运行。
- 在开发web应用程序时,springboot会配置一个嵌入式Tomcat服务器,以便它可以作为独立的应用程序运行。(Tomcat是默认的,当然你也可以配置Jetty或Undertow)
- SpringBoot包括许多有用的非功能特性(例如安全和健康检查)。
|