1 Spring是什么?
Spring 是一个轻量级的框架,它包括IOC和AOP,是为java程序应用提供的基础性的服务框架,主要是用来简化应用程序的开发.
他有几个核心的模块
Spring core : 核心类库 ,提供了IOC 服务
Spring context: 提供了框架式的Bean访问方式,以及企业级功能(定时任务)
Spring AOP:aop服务
Spring DAO: 提供了JDBC的抽象封装,简化了数据访问异常的处理
Spring ORM: 提供了对现有的ORM框架的支持
Spring web:提供了基础的相面web的综合特性,文件上传
2 Spring的优点
- spring属于侵入式设计,对代码的污染比较低
- spring的DI机制,将对象之间的依赖关系交给框架去处理,降低组件的耦合性
- springAOP提供了AOP 技术,支持一些通用的任务,如安全,事务,和日志,权限等集中管理,从而提供更好的复用.
- spring对主流的框架提供了集成支持
3 springAOP的理解
AOP介绍
一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个重用的模块,这个模块命名为切面(Aspect),减少系统中的重复代码,降低模块间的耦合度,同时提高了系统的可维护性,可用于权限认证,日志,事务处理
AOP的实现关键
AOP的实现关键AOP得动态代理
Spring AOP使用的动态代理
springAOP是面向切面编程,是对面向对象的一种补充,用于系统分布于各个模块横切的关注点,主要有两种代理方式JDK和cglib代理,JDK代理必须是实现接口类,因为是通过反射来实现的,核心类是InvocationHandler 和proxy. 但是cglib代理是在运行时生产某个类的子类,然后覆盖其中的特定的方法并且添加增加代码。所以cglib代理是通过继承的动态代理.如果有个类被标记为final,name就不能是要cglib代理.
3.1 AOP能做什么?
- 降低模块之间的耦合度
- 使系统容易扩展
- 更好的代码复用。
3.2 AOP怎么用的?
- 前置通知(Before advice) :在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。ApplicationContext中在aop:aspect里面使用aop:before元素进行声明。
- 后通知(After advice) :当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。ApplicationContext中在aop:aspect里面使用aop:after元素进行声明。
- 返回后通知(After return advice) :在某连接点正常完成后执行的通知,不包括抛出异常的情况。ApplicationContext中在aop:aspect里面使用元素进行声明。
- 环绕通知(Around advice) :包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。ApplicationContext中在aop:aspect里面使用aop:around元素进行声明。
- 抛出异常后通知(After throwing advice) : 在方法抛出异常退出时执行的通知。 ApplicationContext中在aop:aspect里面使用aop:after-throwing元素进行声明。
- 切入点表达式 :如execution(* com.spring.service..(…))
4 spring IOC的理解
1 IOC就是控制反转,就是创建对象的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权利转移到spring容器中去,并且容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间的松耦合,有利于功能的复用,DI依赖注入,和控制反转是同一个概念的不同角度的描述,即程序在运行的时候依赖ioc容易可以随时的注入需要的对象
2 直观表达:IOC让对象的创建不用自己去new,可以让spring自动生成,使用java的反射机制,根据配置文件在运行时动态的创建对象以及去管理对象,
3 spring ioc的三种注入方式:构造器注入,setter注入,注解注入
总结:ioc让相互协作的组件保存松散,而aop编程允许你把应用层的功能分离出来形成可重用的功能组件
5 BeanFactory和ApplicationContext有什么区别?
BeanFactory和ApplicationContext都是两大核心的接口,都可以当做spring的容器.其中ApplicationContext是BeanFactory的子接口.
- 1 BeanFactory:是spring里面最底层的接口,包含了Bean的加载,和实例化,控制bean的生命周期,维护了bena之间的依赖关系。ApplicationContext接口作为BeanFactory的派生,提供了BeanFactory所具有的功能外,还提供了更加完整的框架功能。
①继承MessageSource,因此支持国际化。
②统一的资源文件访问方式。
③提供在监听器中注册bean的事件。
④同时加载多个配置文件。
⑤载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层。
- ①BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化这样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。
- ApplicationContext,它是在容器启动时,一次性创建了所有的Bean,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入。 ApplicationContext启动后预载入所有的单实例Bean,通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。
- 相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。
6 请解释一下spring bean的生命周期
servlet的生命周期:实例化,初始化init,接受请求的service,销毁destory
servlet生命周期,的三个方法,1.被创建,执行且只执行一次init方法,2.提供服务,执行service方法,执行多次 3.被销毁,当Servlet服务器正常关闭时,执行destroy方法,只执行一次。
7 解释spring支持的几种bean的作用域
7.1 singleton :默认,为每个容器创建一个bena的实例,容器初始化就创建好了。
生命周期:
- 对象创建:当应用加载,创建容器时候,对象就被创建了
- 对象运行:只要容器在,对象一直活着
- 对象销毁:当应用卸载,销毁容器时,对象就被销毁了
**7.2 prototype:**多例, ioc容器可以创建多个Bean,每次返回都是一个新的实例
实例化多个
- 对象创建:当使用对象时,创建新的对象实例
- 对象运行:只要对象一直在使用中,就一直活着
- 对象销毁:当对象长时间不用时,被java的垃圾回收器收回了
**7.3 request:**为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
7.4 session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
8、Spring框架中的单例Beans是线程安全的么?
spring框架并没有对单例bean进行任何多线程的封装处理,关于单例bean的线程安全和并发访问问题需要开发者自己去搞定。
9、Spring如何处理线程并发问题?
10.1 spring基于xml注入的几种方式
- set注入
- 构造器注入
- 静态工厂注入
- 实例工厂注入
10.2 Spring的自动装配:
在spring中,对象无需自己查找或创建与其关联的其他对象,由容器负责把需要相互协作的对象引用赋予各个对象,使autowire来配置自动装载模式。
注:@Autowired和@Resource之间的区别
(1) @Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。
(2) @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入
11、Spring 框架中都用到了哪些设计模式?
- 工厂模式 各个BeanFacroty 以及ApplicationContext 创建对象,创建对象需要大量的重复代码,通过子类实现方法来创建对象
- 模板模式 各个BeanFacroty 以及ApplicationContext 创建对象,
- 代理模式 AOP的Jdk的动态代理
- 单例模式 创建Bean
- 观察者模式 ContextLoadLIstenter监听器来监听创建spring容器的时候,三要素事件,事件源,监听器------事件源servletcontext对象,事件:创建 监听器ContextLoadLIstenter
- 适配器模式 spring-framwork提供了 spring mvc 的开发包,。
12、Spring事务的实现方式和实现原理:
本身spring是支持事务的,
Spring分编程式事务和声明式事务,一般编程式事务用的少,声明式事务管理:将我们从复杂的处理中解脱出来,获取连接,关闭连接.事务提交.回滚.异常处理都不需要自己去操作,spring帮我们处理.
声明式事务管理介绍:
使用aop面向切面编程实现的,本质是在目标方法前后进行拦截.在目标方法执行前加入或者创建一个事务.在执行方法后,根据实际的情况提交或者回滚事务.
声明式事务管理优点
不需要再业务逻辑代码中掺杂事务管理的代码,只需要带配置文件中做相关的事务规则声明就可用了或者@Transactional注解的方式,便可以将事务规则应用到业务逻辑中。
声明式事务管理优配置方式:
xml配置,@Transactional,事务注解驱动tx:annotation-driven
声明式事务管理缺点
最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。
12.2 spring的事务传播行为:
7中事务的传播行为,常见的就两种
① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
12.3 Spring中的隔离级别
① ISOLATION_DEFAULT:这是PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。
② ISOLATION_READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到这个事务未提交的数据。
③ ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新。
④ ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新。
⑤ ISOLATION_SERIALIZABLE:串行化,一个事务在执行的过程中完全看不到其他事务对数据库所做的更新
13 Spring框架中有哪些不同类型的事件?
14 解释一下Spring AOP里面的几个名词
- 切面(Aspect):可以由多个切点和多个通知组成
- peoxy(代理):一个类被AOP织入增强后,产生一个结果代理
- 切点(PointCut):指定哪些方法需要拦截
- 通知(adivce):具体的代码增强
- 被代理的对象(Target):