1.Spring中Bean的生命周期
1.容器启动,实例化所有实现了BeanFactoyPostProcessor接口的类。他会在任何普通Bean 实例化之前加载.
2.实例化剩下的Bean,对这些Bean进行依赖注入。
3.如果Bean有实现BeanNameAware的接口那么对这些Bean进行调用
4.如果Bean有实现BeanFactoryAware接口的那么对这些Bean进行调用
5.如果Bean有实现ApplicationContextAware接口的那么对这些Bean进行调用
6.如果配置有实现BeanPostProcessor的Bean,那么调用它的postProcessBeforeInitialization 方法
7.如果Bean有实现InitializingBean接口那么对这些Bean进行调用
8.如果Bean配置有init属性,那么调用它属性中设置的方法
9.如果配置有实现BeanPostProcessor的Bean,那么调用它的postProcessAfterInitialization方法
10.Bean正常使用
11.调用DisposableBean接口的destory方法
12.调用Bean定义的destory方法
如果从大体上区分值分只为四个阶段
1.BeanFactoyPostProcessor实例化
2.Bean实例化,然后通过某些BeanFactoyPostProcessor来进行依赖注入
3.BeanPostProcessor的调用.Spring内置的BeanPostProcessor负责调用Bean实现的接口: BeanNameAware, BeanFactoryAware, ApplicationContextAware等等,等这些内置的BeanPostProcessor调用完后才会调用自己配置的BeanPostProcessor
4.Bean销毁阶段
2.你对spring的理解是什么?
1)开源框架
2)IoC(控制反转),将类的创建和依赖关系写在配置文件里,由配置文件注入,实现了松耦合
3)AOP 将安全,事务等于程序逻辑相对独立的功能抽取出来,利用spring的配置文件将这些功能插进去,实现了按照方面编程,提高了复用性
或者答概念Spring是一个轻型容器(light-weight container),其核心是Bean工厂(Bean Factory),用以构造我们所需要的M(Model)。在此基础之上,Spring提供了AOP(Aspect-Oriented Programming, 面向层面的编程)的实现,用它来提供非管理环境下申明方式的事务、安全等服务;对Bean工厂的扩展ApplicationContext更加方便我们实现J2EE的应用;DAO/ORM 的实现方便我们进行数据库的开发;Web MVC和Spring Web提供了Java Web应用的框架或与其他流行的Web框架进行集成。
3.Spring框架有哪几部分组成?
Spring 核心容器(Core):提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,她是工厂模式的实现。BeanFactory使用控制反转(Ioc)模式将应用程序的配置和依赖性规范与实际的应用代码程序分开。
Spring AOP:通过配置管理特性,Spring AOP模块直接面向方面的编程功能集成到了Spring 框架中,所以可以很容易的使Spring框架管理的任何对象支持AOP。Spring AOP模块为基
于Spring的应用程序中的对象提供了事务管理服务。通过使用Spring AOP,不用依赖于EJB 组件,就可以将声明性事务管理集成到应用程序中。
Spring ORM:Spring框架集成了若干ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate、iBatis和TopLink。所有这些都遵从Spring的通用事务和DAO异常层结构。Spring DAO:JDBC DAO抽象层提供了有意义的异常层次的结构,可用该结构来管理异常处理和不同数据供应商抛出的异常错误信息。异常层次结构简化了错误处理,并且大大的降低了需要编写的异常代码数量(例如,打开和关系连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层结构。
Spring WEB:Web上下文模块建立在上下文模块(Context)的基础之上,为基于Web服务的应用程序提供了上下文的服务。所以Spring框架支持Jakarta Struts的集成。Web模块还简化了处理多部分请求及将请求参数绑定到域对象的工作。
Spring上下文(Context):Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化校验和调度功能。Spring MVC:Spring的MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的,MVC容纳的大量视图技术,包括JSP、Velocity、Tiles、iText和Pol
4.Struts2基本工作过程
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp 的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
3、接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请求是否需要调用某个Action;
4、如果ActionMapper决定需要调用某个Action,StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy;
5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类;
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。
5.IOC的优点是什么?
IOC 或依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。
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.什么是Spring的MVC框架
Spring 配备构建Web 应用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声明的方式把请求参数和业务对象绑定。
8.spring提供了几个关于事务处理的类
TransactionDefinition //事务属性定义
TranscationStatus //代表了当前的事务,可以提交,回滚。PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。
9.谈谈 ValueStack
①. ValueStack 贯穿整个Action 的生命周期,保存在request 域中,所以ValueStack 和request 的生命周期一样. 当Struts2 接受一个请求时,会迅速创建ActionContext,ValueStack,Action. 然后把Action 存放进ValueStack,所以Action 的实例变量可以被OGNL 访问。请求来的时候,Action、ValueStack 的生命开始;请求结束,Action、ValueStack 的生命结束
②. 值栈是多实例的,因为Action 是多例的(和Servlet 不一样,Servelt 是单例的),而每个Action 都有一个对应的值栈,Action 对象默认保存在栈顶;
③. ValueStack 本质上就是一个ArrayList(查看源代码得到);
④. 使用OGNL 访问值栈的内容时,不需要#号,而访问request、session、application、attr 时,需要加#号;
⑤. Struts2 重写了request 的getAttribute 方法,所以可以使用EL 直接访问值栈中的内容
10.拦截器的生命周期与工作过程
每个拦截器都是需要实现Interceptor 接口
> init():在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化;
> intercept(ActionInvocation invocation):每拦截一个动作请求,该方法就会被调用一次;
> destroy:该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次;
11.拦截器必须是无状态的
这是因为struts2对每一个Action的请求使用的是同一个拦截器实例来拦截调用,如果拦截器有状态,在多个线程(客户端的每个请求将由服务器端的一个线程来服务)同时访问一个拦截器实例的情况下,拦截器的状态将不可预测。
12.自定义拦截器的实现方法
实现Interceptor接口
继承AbstractInterceptor类
继承MethodFilterInterceptor类
13.Spring容器
容器可以管理对象的生命周期,对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称,如何产生(Prototype方式或Singleton方式),那个对象产生之后必须设定成为某个对象的属性等,在启动容器后,所有的对象都可以直接取用,不用编写任何一行代码来产生对象,或是建立对象与对象之间的依赖关系。
14.为何使用IoC
有效地组织中间层对象
有效的消除单例、工厂等模式的使用
将面向接口编程做到实处
使单元测试变得简单
消除了依赖环境的查找和特定服务器的代码
代码变得清晰,易于维护和扩展
代码依赖于接口,易于复用
便于看清组件之间的依赖关系
便于团队分模块开发
15.Bean是什么
具有唯一id的Simple Object
由IoC容器管理其生命周期及其依赖关系
简单地讲,bean就是由Spring容器初始化、装配及被管理的对象
bean定义以及bean相互之间的依赖关系将通过配置元数据来描述
一般在XML文件中定义
16.ApplicationContext与BeanFactory的区別
基本的BeanFactory总是延迟加载Bean,直到第一次调用getBean("BeanId")方法请求Bean实例时,BeanFactory才会创建这个Bean,而ApplicationContext在自身初始化时就一次性创建了所有的Bean,了解这一点是非常重要的,因为ApplicationContext在初始化时就能验证XML配置文件的正确性.而使用BeanFactory,直到调用getBean("BeanId")方法获取Bean实例时,才可能会发现配置错误而导致抛出异常.
17.获取ApplicationContext资源
ClassPathResource:
通过ClassPathResource 以类路径的方式进行访问;
FileSystemResource:
通过FileSystemResource 以文件系统绝对路径的方式进行访问;ServletContextResource:
通过ServletContextResource 以相对于Web应用根目录的方式进行访问;
UrlResource:
通过https://www.wendangku.net/doc/4d12903826.html,.URL来访问资源,当然它也支持File格式,如“file:”;
18.依赖注入的三种方式
设置属性注入
set注入指的就是在接受注入的类中定义一个set方法,并在参数中定义需要注入的元素。构造注入
构造注入指的就是在接受注入的类中定义一个构造方法,并在参数中定义需要注入的元素。接口注入
接口注入指的就是在接口中定义要注入的信息,并通过接口完成注入。
由于接口注入的繁琐与侵入性过高,Spring没有提供对接口注入的实现。
19.Bean的实例化
1、用构造器来实例化
当采用构造器来创建bean实例时,Spring对class并没有特殊的要求,我们通常使用的class都适用。也就是说,被创建的类并不需要实现任何特定的接口,或以特定的方式编码,只要指定bean的class属性即可。不过根据所采用的IoC类型,class可能需要一个默认的空构造器。
此外,IoC容器不仅限于管理JavaBean,它可以管理任意的类。不过大多数使用Spring 的人喜欢使用实际的JavaBean(具有默认的(无参)构造器及setter和getter方法),但在容器中使用非bean形式(non-bean style)的类也是可以的。比如遗留系统中的连接池,很显然它与JavaBean规范不符,但Spring也能管理它。
当使用基于XML的元数据配置文件,可以这样来指定bean类:
2、使用静态工厂方法实例化
当采用静态工厂方法创建bean时,除了需要指定class属性外,还需要通过factory-method属性来指定创建bean实例的工厂方法。Spring将调用此方法(其可选参数接下来介绍)返回实例对象,就此而言,跟通过普通构造器创建类实例没什么两样。
下面的bean定义展示了如何通过工厂方法来创建bean实例。注意,此定义并未指定返回对象的类型,仅指定该类包含的工厂方法。在此例中,createInstance()必须是一个static 方法。
3、使用实例工厂方法实例化
与使用静态工厂方法实例化类似,用来进行实例化的实例工厂方法位于另外一个已有的bean中,容器将调用该bean的工厂方法来创建一个新的bean实例为使用此机制,class属性必须为空,而factory-bean属性必须指定为当前(或其祖先)容器中包含工厂方法的bean的名称,而该工厂bean的工厂方法本身必须通过factory-method属性来设定(参看以下的例子)。
虽然设置bean属性的机制仍然在这里被提及,但隐式的做法是由工厂bean自己来管理以及通过依赖注入(DI)来进行配置。
20.Prototype作用域:
prototype作用域的Bean会导致在每次对该Bean请求(将其注入到另一个Bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的Bean实例。根据经验,对有状态的Bean应该使用prototype作用域,而对无状态的Bean则应该使用singleton作用域。
21.为何使用AOP
高度模块化,使得我们的系统更易实现和更易维护
使每个模块承担的责任更清晰,提高代码的可追踪性
解决设计时两难的局面,在不需改动原先代码的情况下推迟不必要的需求的实现
提高代码的重用性
加速系统的开发和部署,提高程序员的开发效率
降低系统开发的成本
22.通知的配置
ProxyFactoryBean这个类会被BeanFactory或是ApplicationContext用来建立代理对象
1、proxyInterfaces属性:设定代理时可运行的接口,
2、target属性:设定Target对象,
3、interceptorNames属性:设定Advice实例,可能多个
23.通知的正则表达式
Spring 提供的org.springframework.aop.support.RegexpMethodPointcutAdvisor
可以让你使用Perl 风格的Regular expression來定义Pointcuts,
它是Spring中静态Pointcut的实例,在符合Regular expression的情況下应用Advices,您可以使用以下的几个符号:
符号描述:
. 符合任何单一字元
+ 符合前一个字元一次或多次
* 符合前一个字元零次或多次
\ Escape 任何Regular expression 使用到的符号
RegexpMethodPointcutAdvisor的"pattern"属性让你指定所要符合的完整类别名称
(包括package名称)加方法名称,例如若要求符合neu.danny.IHello下的hello开始的方法名称,
则要如下撰写:
neu\.danny\.IHello\.hello.*
由于. 符号已经被Regular expression使用,所以如果表示式中要指定. 符号,
则要使用(Escape),也就是使用\. 的方式,如果只打算针对方法名称比对,
而不管package名称,则可以这么写:.*hello.*
24.切入点的类型
静态
NameMatchMethodPointcut
匹配方法名称
如果方法重载了, 则不能对其中特定的方法进行匹配,因为它仅对方法名进行匹配,不会考虑参数相关信息,而且也没有提供可以指定参数匹配信息的途径AbstractRegexpMethodPointcut
根据正则表达式计算切入点,要匹配完整的类名和方法名
对应的Advisor是RegexpMethodPointcutAdvisor,会根据当前JDK版本来决定使用JdkRegexpMethodPointcut ,还是Perl5RegexpMethodPointcut
动态
ControlFlowPointcut
25.为何使用Spring持久层
提供JDBC、Hibernate、iBATIS、JDO、OJB、Toplink等流行的持久层框架的DAO类的封装
将不同框架的异常转化为通用的异常处理
在DAO类不需要写任何异常相关的代码
强大的模板技术和回调方法
自动打开和释放资源
简化开发,极大的提高了开发效率
26.Spring事务
统一的事务编程模型
支持编程性事务和声明性事务
能够很好的支持JDBC、Hibernate、JDO等等事务
DataSourceTransactionManager
HibernateTransactionManager
JdoTransactionManager
JtaTransactionManager