Spring框架
什么是Spring框架?
Spring是一种轻量级框架,旨在提高开发人员的开发效率以及系统的可维护性。
Spring框架有哪些主要模块?
spring-core
包含Spring框架基本的核心工具类,Spring其他组件都使用到这个包里的类,是其他组件的基本核心,当然也可以在自己的应用系统中使用这些工具类。
spring-bean
所有应用都要用到,它包含访问配置文件、创建和管理bean以及进行IOC/DI操作相关的所有类。如果应用只需要基本的IOC/DI支持,引入spring-core和spring-bean就可以。
spring-context
上下文。在core和bean基础上建立的,它提供一个框架式的对象访问方式,类似于一个JNDI(Java Naming and Directory Interface)注册表。上下文模块从Beans模块继承其功能,并添加支持国际化、事件传播、资源负载、并且透明创建上下文,例如Servlet容器。Context模块还支持Java EE的功能,如EJB、JMX和基本的远程处理。ApplicationContext接口是Context模块的焦点。
spring-context-indexer
上下文索引器,在编译时创建候选对象的静态列表,来提高大型应用程序的启动性能。
spring-context-support
支持整合普通第三方库到Spring应用程序上下文,特别是用于高速缓存(ehcache,JCache)和调度(CommonJ,Quartz)的支持。
spring-expression
<bean id="order001" class="com.zhangguo.spring.spel0.Order">
<property name="customer" ref="gyl"></property>
<property name="name" value="#{gyl.name}"></property>
<property name="orderName" value='#{"Apples".toUpperCase()}'></property>
</bean>
支持SpEL表达式,#{gyl.name}作用是找到名称为gyl的bean取出中间的name值;#{"Apples".toUpperCase()}把字符串Apples转换成大写并输出。
AOP和Instrumentation
spring-aop
切面相关
spring-aspects
单独的spring-aspects模块,提供了与AspectJ的集成。
spring-instrument
Java类加载器(CLassLoader)。该spring-instrument-tomcat 模块包含了支持Tomcat的植入代理。
消息
spring-messaging
消息传递模块
数据访问/集成
spring-jdbc
包含对Spring对JDBC数据访问进行封装的所有类
spring-tx
实现类的编程和声明式事务管理。
编程式事务:使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务:建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
spring-orm
对象关系映射(object-relational mapping),包括JPA和Hibernate。使用spring-orm模块,您可以将这些O/R映射框架与Spring提供的所有其他功能结合使用,例如前面提到的简单声明性事务管理功能。
spring-oxm
对象xml映射(object-xml mapping),如JAXB,Castor,JiBX和XStream
spring-jms
java消息服务(Java Messaging Service) 包含用于生产和消费消息的功能,提供了与 spring-messaging模块的集成。
web
spring-web
提供基本的面向web的集成功能,例如多部分文件上传功能,以及初始化一个使用了Servlet侦听器和面向Web的应用程序上下文的IoC容器。它还包含一个HTTP客户端和Spring的远程支持的Web相关部分
spring-webmvc
也称Web-Servlet模块。包含Web应用程序的Spring模型-视图-控制器(MVC)和REST Web Services实现。Spring的MVC框架提供了业务代码和Web表单之间的清晰分离。
spring-websocket
spring-webflux
类似于Netty。包含了对反应式 HTTP、服务器推送事件和 WebSocket 的客户端和服务器端的支持。在服务器端,WebFlux 支持两种不同的编程模型:第一种是 Spring MVC 中使用的基于 Java 注解的方式;第二种是基于 Java 8 的 lambda 表达式的函数式编程模型。
测试
spring-test
支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试
配套组件
spring-framework-bom
统一版本管理,直接在pom.xml中配置,用于解决版本冲突。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
spring-jcl
Jakarta Commons Logging 日志模块
Spring框架中用到了哪些设计模式?
简单工厂、工厂方法、单例、适配器、包装器、代理、观察者、策略、模板方法
IOC控制反转
IOC控制反转,就是将原本手动在程序中创建对象的方式,交由Spring框架来管理。
当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。
AOP
对AOP的理解
AOP切面,与业务无关,把共用的部分封装起来(例如事务、日志、权限)
Spring AOP和AspectJ AOP
Spring AOP属于动态代理(运行时增强);AspectJ AOP属于静态代理(编译时增强)。
Spring的Bean
1)Spring中的bean的作用域?
singleton单例(默认):在整个应用中,只创建一个实例
prototype原型:每次注入时,都会创建一个新的bean
request请求:在web应用中,为每个请求创建一个bean实例
session会话:在web应用中,为每个会话创建一个bean实例
2)Spring中的单例bean的线程安全问题?
当多个线程对同一个对象的非静态成员变量的写操作时,存在安全问题
解决方案:在类中定义ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中
3)Spring中bean的生命周期
SpringMVC
Spring事务
1)事务的4个特性、ACID
原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
2)Spring事务管理的方式有几种?
编程式事务管理:将事务管理代码嵌入到业务方法中来控制事务的提交和回滚,在编程式事务中,必须在每个业务操作中包含额外的事务管理代码
声明式事务管理:以声明的方式来实现事务管理。事务管理作为一种横切关注点,可以通过AOP方法模块化。Spring通过Spring AOP框架支持声明式事务管理。
2)Spring事务中的隔离级别有哪几种?
3)Spring事务中有哪几种事务传播行为?