Spring概述
什么是spring?
- Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发
的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。 - Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。
- Spring可以做很多事情,它为企业级开发提供给了丰富的功能,但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入(dependency injection,DI)和面向切面编程(aspectoriented programming,AOP)。
为了降低Java开发的复杂性,Spring采取了以下4种关键策略** 基于POJO的轻量级和最小侵入性编程; 通过依赖注入和面向接口实现松耦合; 基于切面和惯例进行声明式编程; 通过切面和模板减少样板式代码
Spring的俩大核心概念
IOC(控制翻转):
控制翻转,也叫依赖注入,他就是不会直接创建对象,只是把对象声明出来,在代码 中不直 接与对象和服务进行连接,但是在配置文件中描述了哪一项组件需要哪一项服 务,容器将他 们组件起来。在一般的IOC场景中容器创建了所有的对象,并设置了必 要的属性将他们联系 在一起,等到需要使用的时候才把他们声明出来,使用注解就跟 方便了,容器会自动根据注 解把对象组合起来
AOP(面对切面编程)
面对切面编程,这是一种编程模式,他允许程序员通过自定义的横切点进行模块 化,将那些 影响多个类的行为封装到课重用的模块中。 例子:比如日志输出,不使用AOP的话就需要把 日志的输出语句放在所有类中,方法 中,但是有了AOP就可以把日志输出语句封装一个可重 用模块,在以声明的方式将他 们放在类中,每次使用类就自动完成了日志输出。
Spring框架的设计目标,设计理念,和核心是什么
- Spring设计目标:Spring为开发者提供一个一站式轻量级应用开发平台;
- **Spring设计理念:**在JavaEE开发中,支持POJO和JavaBean开发方式,使应用面向接口开发,充分
支持OOP(面向对象)设计方法;Spring通过IOC容器实现对象耦合关系的管理,并实现依赖反 转,将对象之间的依赖关系交给IOC容器,实现解耦; - **Spring框架的核心:**IOC容器和AOP模块。通过IOC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务。
- IOC让相互协作的组件保持松散的耦合,而AOP编程允许你把遍布于应用各层的功能分离出来形成
可重用的功能组件。
Spring的优缺点是什么?
- 优点
- 方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理。 - AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。 - 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程。 - 方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序。 - 方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持(如:Struts、 Hibernate、MyBatis等)。 - 降低JavaEE API的使用难度
Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。 缺点 - Spring明明一个很轻量级的框架,却给人感觉大而全
- Spring依赖反射,反射影响性能
- 使用门槛升高,入门Spring需要较长时间
Spring 框架中都用到了哪些设计模式?
- 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
- 单例模式:Bean默认为单例模式。
- 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
- 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
- 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。
Spring框架中有哪些不同类型的事件
- Spring 提供了以下5种标准的事件:
- \1. 上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接
口中的refresh()方法时被触发。 - \2. 上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的
Start()方法开始/重新开始容器时触发该事件。 - \3. 上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext
的Stop()方法停止容器时触发该事件。 - \4. 上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容
器被关闭时,其管理的所有单例Bean都被销毁。 - \5. **请求处理事件(**RequestHandledEvent):在Web应用中,当一个http请求(request)结
束触发该事件。如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被 发布以后,bean会自动被通知。
Spring控制反转(IOC)
Spring 的 IOC支持哪些功能
- Spring 的 IOC 设计支持以下功能:
- 其中,最重要的就是依赖注入,从 XML 的配置上说,即 ref 标签。对应 Spring
RuntimeBeanReference 对象。 - 对于 IOC 来说,最重要的就是容器。容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入。
BeanFactory 和 ApplicationContext有什么区别?
- BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
- 依赖关系
- BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,
管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。 - ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提
供了更完整的框架功能: - 继承MessageSource,因此支持国际化。
- 统一的资源文件访问方式。
- 提供在监听器中注册bean的事件。
- 同时加载多个配置文件。
- 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的
web层。
什么是Spring的依赖注入?
控制反转IOC是一个很大的概念,可以用不同的方式来实现。其主要实现方式有两种:依赖注入和 依赖查找依赖注入:相对于IOC而言,依赖注入(DI)更加准确地描述了IOC的设计理念。所谓依赖注 入(Dependency Injection),即组件之间的依赖关系由容器在应用系统运行期来决定,也就是 由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。组件不做 定位查询,只提供普通的Java方法让容器去决定依赖关系。
依赖注入的基本原则
依赖注入的基本原则是:应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作 应该由IOC容器负责,“查找资源”的逻辑应该从应用组件的代码中抽取出来,交给IOC容器负责。 容器全权负责组件的装配,它会把符合依赖关系的对象通过属性(JavaBean中的setter)或者是构 造器传递给需要的对象。
依赖注入有什么优势
依赖注入之所以更流行是因为它是一种更可取的方式:让容器全权负责依赖查询,受管组件只需要 暴露JavaBean的setter方法或者带参数的构造器或者接口,使容器可以在初始化时组装对象的依赖 关系。其与依赖查找方式相比,主要优势为: 查找定位操作与应用代码完全无关。 不依赖于容器的API,可以很容易地在任何容器以外使用应用对象。 不需要特殊的接口,绝大多数对象可以做到完全不必依赖容器。
有哪些不同类型的依赖注入实现方式?
- 依赖注入是时下最流行的IOC实现方式,依赖注入分为接口注入(Interface Injection),Setter方
法注入(Setter Injection)和构造器注入(Constructor Injection)三种方式。其中接口注入由于 在灵活性和易用性比较差,现在从Spring4开始已被废弃。 - 构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
- Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之
后,调用该bean的setter方法,即实现了基于setter的依赖注入。
解释Spring支持的几种bean的作用域
- Spring框架支持以下五种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情形下有效。
Spring框架中的单例bean是线程安全的吗?
- 不是,Spring框架中的单例bean不是线程安全的。
- spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。
- 实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全
的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。 有状态就是有数据存储功能。 无状态就是不会保存数据。
什么是bean装配?
装配,或bean 装配是指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关 系,如何通过依赖注入来把它们装配到一起。
什么是bean的自动装配?
在Spring框架中,在配置文件中设定bean的依赖关系是一个很好的机制,Spring 容器能够自动装 配相互合作的bean,这意味着容器不需要和配置,能通过Bean工厂自动处理bean之间的协作。 这意味着 Spring可以通过向Bean Factory中注入的方式自动搞定bean之间的依赖关系。自动装配 可以设置在每个bean上,也可以设定在特定的bean上。
使用@Autowired注解自动装配的过程是怎样的?
-
使用@Autowired注解来自动装配指定的bean。在使用@Autowired注解之前需要在Spring配置文 件进行配置,<context:annotation-config />。 -
在启动spring IOC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理 器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IOC容器自动查找需要的bean, 并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean: -
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据; -
如果查询的结果不止一个,那么@Autowired会根据名称来查找; -
如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。
自动装配有哪些局限性?
自动装配的局限性是: **重写:**你仍需用 和 配置来定义依赖,意味着总要重写自动装配。 **基本数据类型:**你不能自动装配简单的属性,如基本数据类型,String字符串,和类。 **模糊特性:**自动装配不如显式装配精确,如果有可能,建议使用显式装配。
SpringBoot自动装配原理
1.SpringBoot启动会加载大量的自动配置类
2.判断SpringBoot默认写好的自动配置类是否满足我们需求的功能
3.查看自动配置类到底配置了哪些组件(只要包含我们需求的组件,就不需要额外去添加配置属性了)
4.给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们可以自定义这些属性的值.
@Component, @Controller, @Repository, @Service 有何区别?
**@Component:**这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的 组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。 **@Controller:**这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IOC 容 器中。 **@Service:**此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以 在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。 **@Repository:**这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了 额外的好处。它将 DAO 导入 IOC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。
@Autowired 注解有什么作用
- @Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它
required属性为false)。@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自 动装配。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多 个参数的PN方法。
@Autowired和@Resource之间的区别
@Autowired和@Resource可用于:构造函数、成员变量、Setter方法 @Autowired和@Resource之间的区别在于 @Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它 required属性为false)。 @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来 装配注入。
@Qualifier 注解有什么作用
当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,您可以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean 来消除歧义。
@RequestMapping 注解有什么用?
@RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/ 方法。此注释可应用于两个级别: 类级别:映射请求的 URL 方法级别:映射 URL 以及 HTTP 请求方法
说一下 spring 的事务隔离?
spring 有五大隔离级别,默认值为 ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离 级别和数据库的隔离级别一致:
- ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么;
- ISOLATION_READ_UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其
他事务读取(会出现幻读、脏读、不可重复读); - ISOLATION_READ_COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成
幻读、不可重复读),SQL server 的默认级别; - ISOLATION_REPEATABLE_READ:可重复读,保证多次读取同一个数据时,其值都和事务开
始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),MySQL 的默认级 别; - ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏
读、不可重复读、幻读。
Spring面向切面编程(AOP)
什么是AOP
OOP(Object-Oriented Programming)面向对象编程,允许开发者定义纵向的关系,但并适用于定 义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。 AOP(Aspect-Oriented Programming),一般称为面向切面编程,作为面向对象的一种补充,用于 将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模 块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时 提高了系统的可维护性。可用于权限认证、日志、事务处理等。
解释一下Spring AOP里面的几个名词
(1)切面(Aspect):切面是通知和切点的结合。通知和切点共同定义了切面的全部内容。 在 Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @AspectJ 注解来实 现。 (2)连接点(Join point):指方法,在Spring AOP中,一个连接点 总是 代表一个方法的执行。 应用可能有数以千计的时机应用通知。这些时机被称为连接点。连接点是在应用执行过程中能够插 入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利 用这些点插入到应用的正常流程之中,并添加新的行为。 (3)通知(Advice):在AOP术语中,切面的工作被称为通知。 (4)切入点(Pointcut):切点的定义会匹配通知所要织入的一个或多个连接点。我们通常使用 明确的类和方法名称,或是利用正则表达式定义所匹配的类和方法名称来指定这些切点。 (5)引入(Introduction):引入允许我们向现有类添加新方法或属性。 (6)目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。 它通常是一个代理对象。也有人把它叫做 被通知(adviced) 对象。 既然Spring AOP是通过运行 时代理实现的,这个对象永远是一个 被代理(proxied) 对象。 (7)织入(Weaving):织入是把切面应用到目标对象并创建新的代理对象的过程。在目标对象 的生命周期里有多少个点可以进行织入:
Spring通知有哪些类型?
在AOP术语中,切面的工作被称为通知,实际上是程序执行时要通过SpringAOP框架触发的代码 段。 Spring切面可以应用5种类型的通知: \1. 前置通知(Before):在目标方法被调用之前调用通知功能; \2. 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么; \3. 返回通知(After-returning ):在目标方法成功执行之后调用通知; \4. 异常通知(After-throwing):在目标方法抛出异常后调用通知; \5. 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行 自定义的行为
什么是切面 Aspect?
aspect 由 pointcount 和 advice 组成,切面是通知和切点的结合。 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到 切面所指定的连接点中. AOP 的工作重心在于如何将增强编织目标对象的连接点上,
|