【面试】【Spring常见问题总结】【06】
【常见面试问题总结文件夹>>>】
51、spring中的applicationContext.xml能不能改为其它名字
ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。缺省情况下,它会在WEB-INF/applicationContext.xml文件找Spring的配置。 你能够通过定义一个<context-param>元素名字为”contextConfigLocation”来改变Spring配置文件的位置。示比例如以下:
<span style="font-size:14px;"><listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/xyz.xml</param-value> </context-param> </listener></span>
52、在web中怎样配置spring
在J2EE的web应用里面配置spring很easy。仅仅须要把spring得ContextLoaderListener加入到你的web.xml文件中面就能够了,示比例如以下:
<span style="font-size:14px;"><listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener></span>
53、Spring中BeanFactory和ApplicationContext的作用和差别
BeanFactory负责读取bean配置文档,管理bean的载入,实例化,维护bean之间的依赖关系,负责bean的声明周期。
ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:
a. 国际化支持
b. 资源訪问:Resource rs = ctx. getResource(“classpath:config.properties”),
“file:c:/config.properties”
c. 事件传递:通过实现ApplicationContextAware接口。
54、经常使用的获取ApplicationContext的方法
FileSystemXmlApplicationContext:
从文件系统或者url指定的xml配置文件创建,參数为配置文件名称或文件名称数组
ClassPathXmlApplicationContext:
从classpath的xml配置文件创建,能够从jar包中读取配置文件
WebApplicationContextUtils:
从web应用的根文件夹读取配置文件,须要先在web.xml中配置,能够配置监听器或者servlet来实现
<span style="font-size:14px;"><listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet></span>
这两种方式都默认配置文件为web-inf/applicationContext.xml,也可使用context-param指定配置文件
<span style="font-size:14px;"><context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/myApplicationContext.xml</param-value> </context-param></span>
55、spring中的jdbc与传统的jdbc有什么差别?
Spring的JDBC是在原生态JDBC上面的一层简单的封装,提供了一些一用的接口,节省代码。无论连接(Connection),无论事务、无论异常、无论关闭(con.close() ps.close )。仅仅须要实现Spring提供的回调类。
传统的JDBC运行步骤例如以下:
a、创建连接
b、创建语句(SQL)
c、运行语句
d、返回结果集(设置到JavaBean中等处理)
e、关闭连接释放资源
Spring JDBC仅仅须要实现b和d两个步骤,其它的都由Spring替你完毕。而b和d都是通过实现指定的接口。然后将实现类传递给Spring就OK了。
56、什么是spring,它有什么特点?
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
轻量——从大小与开销双方面而言Spring都是轻量的。完整的Spring框架能够在一个大小仅仅有几MB多的JAR文件中公布。
而且Spring所需的处理开销也是微不足道的。
此外,Spring是非侵入式的(侵入式让用户代码产生对框架的依赖,这些代码不能在框架外使用,不利于代码的复用。但侵入式能够使用户跟框架更好的结合。更easy更充分的利用框架提供的功能。非侵入式的代码则没有过多的依赖,能够非常方便的迁移到其它地方。可是与用户代码互动的方式可能就比較复杂。):典型地,Spring应用中的对象不依赖于Spring的特定类。
控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用IoC,一个对象依赖的其他对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你能够觉得IoC与JNDI相反——不是对象从容器中查找依赖。而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
面向切面——Spring提供了面向切面编程的丰富支持。同意通过分离应用的业务逻辑与系统级服务(比如审计(auditing)和事务(transacntion)管理)进行内聚性的开发。
应用对象仅仅实现它们应该做的——完毕业务逻辑——仅此而已。它们并不负责(甚至是意识)其他的系统级关注点。比如日志或事务支持。
容器——Spring包括并管理应用对象的配置和生命周期。在这个意义上它是 一种容器,你能够配置你的每一个bean怎样被创建——基于一个可配置原型(prototype),你的bean能够创建一个单独的实例或者每次须要时都生成一个新的实例——以及它们是怎样相互关联的。
然而,Spring不应该被混同于传统的重量级的EJB容器,它们常常是庞大与笨重的,难以使用。
框架——Spring能够将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件中。Spring也提供了非常多基础功能(事务管理、持久化框架集成等等)。将应用逻辑的开发留给了你。
56、使用spring有什么优点?
l Spring能有效地组织你的中间层对象。
l Spring能消除在很多project上对Singleton的过多使用。
l Spring能消除使用各种各样格式的属性定制文件的须要,在整个应用和project中,可通过一种 一致的方法来进行配置。通过Spring,能够非常easy地看到类的JavaBean属性。依赖注入的使用帮助完毕这样的简化。
l Spring能通过接口而不是类促进好的编程习惯,降低编程代价到差点儿为零。
l Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
l 使用Spring构建的应用程序易于单元測试。
l Spring能使EJB的使用成为一个实现选择,而不是应用架构的必定选择。你能选择用POJOs或local EJBs来实现业务接口。却不会影响调用代码。
l Spring帮助你解决很多问题而无需使用EJB。
Spring能提供一种EJB的替换物,它们适于很多web应用。比如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,假设你只须要与单个的数据库打交道,甚至不须要JTA实现。
l Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
总结起来,Spring有例如以下长处:
l 低侵入式设计,代码污染极低
l 独立于各种应用server,能够真正实现Write Once, Run Anywhere的承诺
l Spring的DI机制减少了业务对象替换的复杂性
l Spring并不全然依赖于Spring,开发人员可自由选用Spring框架的部分或所有。
57、谈谈Spring框架几个主要部分组成?
l Spring框架有七个模块组成组成,这7个模块(或组件)均能够单独存在。也能够与其他一个或多个模块联合使用,主要功能表现例如以下:
l Spring 核心容器(Core):提供Spring框架的基本功能。核心容器的主要组件是BeanFactory。她是工厂模式的实现。BeanFactory使用控制反转(Ioc)模式将应用程序的配置和依赖性规范与实际的应用代码程序分开。
l Spring AOP:通过配置管理特性,Spring AOP模块直接面向方面的编程功能集成到了Spring框架中,所以能够非常easy的使Spring框架管理的不论什么对象支持 AOP。Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。
通过使用Spring AOP,不用依赖于EJB组件,就能够将声明性事务管理集成到应用程序中。
l Spring ORM:Spring框架集成了若干ORM框架,从而提供了ORM的对象关系工具,当中包含 JDO、Hibernate、myBatis和TopLink。
全部这些都遵从Spring的通用事务和DAO异常层结构。
l Spring DAO:JDBC DAO抽象层提供了有意义的异常层次的结构,可用该结构来管理异常处理和不同数据供应商抛出的异常错误信息。异常层次结构简化了错误处理,而且大大的减少了须要编写的异常代码数量(比如。打开和关系连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层结构。
l Spring WEB:Web上下文模块建立在上下文模块(Context)的基础之上,为基于Web服务的应用程序提供了上下文的服务。所以Spring框架支持 Jakarta Struts的集成。
Web模块还简化了处理多部分请求及将请求參数绑定到域对象的工作。
l Spring上下文(Context):Spring上下文是一个配置文件,向Spring框架提供上下文信息。
Spring上下文包含企业服务。比如JNDI、EJB、电子邮件、国际化校验和调度功能。
l Spring MVC:Spring的MVC框架是一个全功能的构建Web应用程序的MVC实现。
通过策略接口。MVC框架变成为高度可配置的,MVC容纳的大量视图技术。包含JSP、Velocity、Tiles、iText和Pol。
57、ApplicationContext接口获取Bean方法简单介绍:
l Object getBean(String name) 依据名称返回一个Bean。client须要自己进行类型转换。
l T getBean(String name,Class<T> requiredType) 依据名称和指定的类型返回一个Bean,client无需自己进行类型转换,假设类型转换失败。容器抛出异常。
l T getBean(Class<T> requiredType)依据指定的类型返回一个Bean,client无需自己进行类型转换。假设没有或有多于一个Bean存在容器将抛出异常。
l Map<String, T>getBeansOfType(Class<T> type) 依据指定的类型返回一个键值为名字和值为Bean对象的 Map,假设没有Bean对象存在则返回空的Map。
58、Bean的命名
每一个Bean能够有一个或多个id(或称之为标识符或名字),在这里我们把第一个id称为“标识符”。其余id叫做“别名”;这些id在IoC容器中必须唯一。怎样为Bean指定id呢,有下面几种方式。
l 不指定id,仅仅配置必须的全限定类名,由IoC容器为其生成一个标识,client必须通过接口“T getBean(Class<T>requiredType)”获取Bean。
<span style="font-size:14px;"><bean class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/></span>
l 指定id。必须在Ioc容器中唯一;
<span style="font-size:14px;"><bean id=” bean” class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/></span>
l 指定name,这样name就是“标识符”,必须在Ioc容器中唯一。
<span style="font-size:14px;"><bean name=” bean” class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/></span>l 指定id和name,id就是标识符。而name就是别名,必须在Ioc容器中唯一
<span style="font-size:14px;"><bean id=”bean1” name=”alias1” class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/> <!-- 假设id和name一样,IoC容器能检測到。并消除冲突 --> <bean id="bean3" name="bean3" class="cn.javass.spring.chapter2.helloworld.HelloImpl"/> </span>l 指定多个name,多个name用“,”、“;”、“”切割,第一个被用作标识符,其它的(alias1、alias2、alias3)是别名,全部标识符也必须在Ioc容器中唯一;
<bean name=” bean1;alias11,alias12;alias13 alias14”class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/>
<span style="font-size:14px;"><!-- 当指定id时。name指定的标识符所有为别名 --> <bean id="bean2" name="alias21;alias22" class="cn.javass.spring.chapter2.helloworld.HelloImpl"/> </span>
59、Bean命名约定
Bean的命名遵循XML命名规范,但最好符合Java命名规范,由“字母、数字、下划线组成“,并且应该养成一个良好的命名习惯, 比方採用“驼峰式”,即第一个单词首字母開始,从第二个单词開始首字母大写開始,这样能够添加可读性。
60、Spring IoC容器怎样实例化Bean呢?
1、使用构造器实例化Bean:
使用空构造器进行定义,使用此种方式。class属性指定的类必须有空构造器
<span style="font-size:14px;"><bean name="bean1" class="cn.javass.spring.chapter2.HelloImpl2"/></span>使用有參数构造器进行定义,使用此中方式,能够使用< constructor-arg>标签指定构造器參数值。当中index表示位置,value表示常量值,也能够指定引用。指定引用使用ref来引用还有一个Bean定义。
<span style="font-size:14px;"><bean name="bean2" class="cn.javass.spring.chapter2.HelloImpl2"> <!-- 指定构造器參数 --> <constructor-arg index="0" value="Hello Spring!"/> </bean> </span>2、使用静态工厂方式实例化Bean,使用这样的方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,并且使用静态工厂方法也同意指定方法參数,spring IoC容器将调用此属性指定的方法来获取Bean,
3、使用实例工厂方法实例化Bean,使用这样的方式不能指定class属性。此时必须使用factory-bean属性来指定工厂Bean。factory-method属性指定实例化Bean的方法,并且使用实例工厂方法同意指定方法參数。方式和使用构造器方式一样