spring是一个开源框架,spring是于2003年兴起的一个轻量级的java开发框架,由rod johnson在其著作expert one-on-one j2ee development and design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开发的复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为j2ee应用程序开发提供集成的框架.spring使用基本的javabean来完成以前只可能由ejb完成的事情.然而,spring的用途不仅限于服务器端的开发.从简单性,可测试性和松耦合的角度而言,任何java应用都可以从spring中受益.spring的核心是控制反转ioc和面向切面aop.简单来说,spring是一个分层的javase/eefull-stack一站式轻量级开源框架.
1.spring的主要特征是依赖注入di和面向切面编程aop.
2.什么是依赖注入
依赖注入dependencyInjection和控制反转inversion of control是同一个概念.具体含义是:当某个角色(可能是一个java实例,调用者)需要另一个角色(另一个java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例.但在spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由spring容器来完成,然后注入调用者,因此也称为依赖注入.
3.什么是面向切面编程
针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果.
4.为了降低java开发的复杂性,spring采取了以下4种关键策略
基于pojo的轻量级和最下侵入性编程,
通过依赖注入和面向接口实现松耦合,
基于切面和惯例进行声明式编程,
通过切面和模板减少样板式代码.
5.依赖注入有哪些方式
接口注入interface injection接口注入指的就是在接口中定义要注入的信息,并通过接口完成注入.
set注入setterinjection set注入指的就是在接受注入的类中定义一个set方法,并在参数中定义需要注入的元素.
构造注入constructor injection构造注入指的就是在接受注入的类中定义一个构造方法,并在参数中定义需要注入的元素.
6.spring应用上下文的有哪些?
classpathxmlapplicationcontext–从类路径下的xml配置文件中加载上下文定义,把应用上下文定义文件当做类资源.
filesystemxmlapplicationcontext读取文件系统下xml配置文件并加载上下文定义.
使用filesystemxmlapplicationcontext和使用classpathxmlapplicationcontext的区别在于:
filesystemxmlapplicationcontext在指定的文件系统路径下查找文件,
classpathxmlapplicationcontext是在所有的类路径包括jar文件下查找文件.
7.bean的生命周期
下面是spring3的bean声明周期
1)spring对bean进行实例化.
2)spring将值和bean的引用注入进bean对应的属性中.
3)如果bean实现了beannameaware接口,spring将bean的id传递给setbeanname()接口方法.
4)如果bean实现了beanfactoryaware接口,spring将调用setbeanfactory()接口方法,将beanfactory容器实例传入.
5)如果bean实现了applicationcontextaware接口,spring将调用setapplicationcontext()接口方法,将应用上下文的引用传入.
6)如果bean实现了beanpostprocessor接口spring将调用它们的postprocessbeforeinitialization接口方法.
7)如果bean实现了initializingbean接口,spring将调用它们的afterpropertiesset()接口方法,类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用.
8)如果bean实现了beanpostprocesser接口,spring将调用它们的postporessafterinitialization方法.
9)此时此刻bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用程序上下文中,直到该应用上下文被销毁.
10)如果bean实现了disposablebean接口,spring将被调用它的destory()接口方法.同样,如果bean使用destory-method声明了销毁方法,方法也会被调用.
在说明前可以思考一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;
Spring上下文中的Bean也类似,如下
1、实例化一个Bean--也就是我们常说的new;
2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;
3、如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值
4、如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);
5、如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);
6、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;
7、如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
8、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;
注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。
9、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;
10、最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
以上10步骤可以作为面试或者笔试的模板,另外我们这里描述的是应用Spring上下文Bean的生命周期,如果应用Spring的工厂也就是BeanFactory的话去掉第5步就Ok了。
8.spring3.0总体模块框架
核心spring容器:spring框架最核心部分,负责spring应用中bean的创建,配置和管理.所有模块都创建于该核心容器之上.
spring的aop模块:在aop模块中,spring对面向切面编程提供了丰富的支持.这个模块是spring应用系统开发切面的基础.aop可以帮助应用对象解耦.
数据访问与集成:spring的jdbc和dao模块封装了这些模板式代码,使我们的数据库代码变得简单明了,还可以避免因为释放数据库资源失败而引起的问题.该模块在几种数据库服务的错误信息之上构建了一个语义且丰富异常层
web和远程调用:spring不但集成了多种流行的mvc框架,它的web和远程调用模块也自带了一个强大的mvc框架,有助于应用提升web层技术的松散耦合.该框架提供了两种形式面向传统web应用的基于servlet的框架和面向使用java portlet api基于portlet的应用.除了面向用户的web应用,该模块还提供了构建与其他应用交互的几种远程调用的选择.spring远程调用服务集成了rmi,hession,burlap,jax-ws,同时spring还自带了一个远程调用框架http invoker.
测试:spring提供了调试模块来测试spring应用.
9.spring常见命名空间
10.bean的作用域