【面试】【Spring常见问题总结】【06】

24 篇文章 49 订阅

【常见面试问题总结目录>>>】



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非常简单,只需要把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>

55spring中的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是非侵入式的(侵入式让用户代码产生对框架的依赖,这些代码不能在框架外使用,不利于代码的复用。但侵入式可以使用户跟框架更好的结合,更容易更充分的利用框架提供的功能。非侵入式的代码则没有过多的依赖,可以很方便的迁移到其他地方。但是与用户代码互动的方式可能就比较复杂。):典型地,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能消除在许多工程上对Singleton的过多使用。

l Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种 一致的方法来进行配置。通过Spring,可以很简单地看到类的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 独立于各种应用服务器,可以真正实现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框架中,所以可以很容易的使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,客户端需要自己进行类型转换;

l T getBean(String name,Class<T> requiredType) 根据名称和指定的类型返回一个Bean,客户端无需自己进行类型转换,如果类型转换失败,容器抛出异常;

l T getBean(Class<T> requiredType)根据指定的类型返回一个Bean,客户端无需自己进行类型转换,如果没有或有多于一个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容器为其生成一个标识,客户端必须通过接口“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的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值