Spring 框架基础总结

1、Spring简介

Spring是一个开源的,采用java语言开发企业级程序的一个分层框架。

2、Spring的核心模块

Spring Core:核心容器,BeanFactory提供了组件生命周期的管理,组件的创建,装配,销毁等功能。
SpringContext:AppliactionContext,扩展核心容器,提供事件处理、国际化等功能。
Spring AOP:提供切面支持
Spring DAO:提供事务支持
Spring ORM:对流行的O/R Mapping封装或支持
Spring Web:提供web应用上下文,对web开发提供功能上的支持。如请求、表单、异常等
Spring Web MVC :全功能MVC框架 作用等同于struts

核心容器:核心容器提供 Spring 框架的基本功能。核心容器主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

3、Spring IOC控制反转类型:

基于特定接口(侵入式方案)
基于set方法
基于构造器

4、spring框架优点

·方便解耦,简化开发
·事务管理
·异常处理
·面向切面编程AOP:面向切面的编程,把应用业务逻辑和系统服务公开
·容器化:包含并管理应用中对象的生命周期和配置
·方便程序的测试
·方便集成各种优秀框架

5、Spring的核心类有哪些,各有什么作用?

BeanFactory:产生一个新的实例,可以实现单例模式
BeanWrapper:提供统一的get及set方法
ApplicationContext:提供框架的实现,包括BeanFactory的所有功能

6、什么是Spring beans?

Spring beans是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。

Spring 框架定义的beans都是单件beans。在bean tag中有个属性”singleton”,如果它被赋为 TRUE,bean就是单件,否则就是一个prototype bean。默认是TRUE,所以所有在Spring框架中的beans 缺省都是单件。

7、BeanFactory 接口和 ApplicationContext 接口有什么区别 ?

ApplicationContext接口继承BeanFactory接口,Spring核心工厂是BeanFactory, BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean;

ApplicationContext是对BeanFactory扩展,它可以进行国际化处理、事件传递和bean自动装配以及各种不同应用层的Context实现,开发中基本都在使用ApplicationContext, web项目使用WebApplicationContext ,很少用到BeanFactory

8、spring创建bean三种方法?

·使用类构造器实例化(默认无参数)
·使用静态工厂方法实例化(简单工厂模式)
·使用实例化工厂方法实例化(工厂方法模式)

9、Spring框架中Bean的生命周期

bean定义:在配置文件里面用来进行定义

bean初始化:在配置文件中通过指定init-method属性来完成
实现org.springframwork.beans.factory.InitializingBean接口

bean调用:有三种方式可以得到bean实例,并进行调用

bean销毁:使用配置文件指定的destroy-method属性
实现org.springframwork.bean.factory.DisposeableBean接口

10、Bean的作用域

Singleton:bean在每个springIOC容器中只有一个实例,并且所有对bean的请求,只要id与该bean定义相匹配,只会返回bean的同一实例。

Prototype:一个bean的定义可以有多个实例,每次对该bean请求时都会创建一个新的bean实例。(对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用 singleton作用域)

Request:每次HTTP请求都会创建一个bean。该作用域仅在基于web的Spring ApplicationContext情形下有效。

Session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效

global session:在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于 web的Spring ApplicationContext情形下有效

11、Spring如何处理线程并发问题?

Spring使用ThreadLocal解决线程安全问题。

一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域。因为Spring对一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非线程安全状态采用ThreadLocal进行处理,使其成为线程安全的状态,因为有状态的Bean可以在多线程中共享。

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。

在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。

而ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。

由于ThreadLocal中可以持有任何类型的对象,低版本JDK所提供的get()返回的是Object对象,需要强制类型转换。但JDK5.0通过泛型很好的解决了这个问题,在一定程度地简化ThreadLocal的使用。
总起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

12、Spring的4种事务特性,5种隔离级别,7种传播行为

Spring事务

事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。

事务特性
原子性:强调事务的不可分割;
一致性:事务的执行的前后数据的完整性保持一致;
隔离性:一个事务执行的过程中,不应该受到其他事务的干扰;
持久性:事务一旦结束,数据就持久到数据库。

如不考虑隔离性引发安全性问题
脏读:一个事务读到了另一个事务的未提交的数据;
不可重复读:一个事务读到了另一个事务已经提交的update数据导致多次查询结果不一致;
幻读:一个事务读到了另一个事务已经提交的 insert 数据导致多次查询结果不一致。

事务隔离级别
DEFAULT :是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
读未提交(read uncommited):可能发生脏读,不可重复读,幻读
读已提交(read commited):避免脏读,可能发生不可重复读和幻读
可重复读(repeatable read):避免脏读和不可重复读,可能发生幻读
串行化的(serializable):避免以上所有读问题。

13、Spring AOP里相关名词

切面(Aspect):AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。如一个日志模块可以被称作日志的AOP切面。根据需求不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。

连接点(Joinpoint):连接点代表一个应用程序的某个位置,在这个位置可以插入一个AOP切面,它实际上是应用程序执行Spring AOP的位置。通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。

通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。许多AOP框架,包括Spring,都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。

切入点(Pointcut):切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

引入(Introduction):也被称为内部类型声明(inter-type declaration)。引入允许我们在已存在的类中增加新的方法和属性。如可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
目标对象(Target Object):被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做被通知(advised)对象。既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。

AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。

织入(Weaving):把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。这些可以在编译时,类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

14、在Spring AOP中,关注点和横切关注的区别是什么?

关注点是应用中一个模块的行为,一个关注点可能会被定义成我们想实现的一个功能。
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

Spring切面五种通知类型:
before:前置通知,在一个方法执行前被调用。
after: 在方法执行之后调用的通知,无论方法执行是否成功。
after-returning: 仅当方法成功完成后执行的通知。
after-throwing: 在方法抛出异常退出时执行的通知。
around: 在方法执行之前和之后调用的通知切点

什么是代理:
代理是通知目标对象后创建的对象。从客户端角度看,代理对象和目标对象是一样的。
有几种不同类型的自动代理?
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying

15、一个Spring Bean的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖

16、装配&自动装配

装配:或bean装配是指在Spring容器中把bean组装到一起,前提是容器需要知道bean的依赖关系如何,通过依赖注入来把它们装配到一起

自动装配:Spring 容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通过Bean工厂自动处理bean之间的协作。

17、五种不同方式的自动装配

no:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。

byName:通过参数名 自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。

byType:通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。

constructor:这个方式类似于byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常

autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式

18、spring缓存

Spring Cache 实现了基于注解的缓存功能,只需要加一个注解,就能实现缓存功能。
常用注解:
@EnableCaching:开启缓存注解功能,通常加在启动类上
@Cacheable:在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有,调用方法并将方法返回值放到缓存中
@CachePut:将方法的返回值放到缓存中
@CacheEvict:将一条或多条数据从缓存中删除

19、springAOP的运用场景

Spring AOP(Aspect-Oriented Programming)是Spring框架提供的一种面向切面编程的机制,它可以通过在应用程序中定义横切关注点(Cross-cutting Concerns),将这些关注点模块化,并将它们与核心业务逻辑分离。

常见使用场景:日志记录,事务管理,安全性检查,性能监控,异常处理,缓存管理,参数校验和转换。

  • 25
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值