Spring面试题
1.用两种方式根据部门号从高到底,工资从低到高列出每个员工的信息。
employee:
eid,ename,salary,deptid;
select * from employee order deptid desc,salary.
2.spring是什么?根据你的理解详细谈谈的你见解。
目的:解决企业应用开发的复杂性
功能:使用基本的javaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
简单来说,spring是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的容器框架。
轻量:从大小与开销两方面而言的Spring都是轻量的。完整的spring框架可以在一个大小只有1MB多的JAR文件里发布
并且spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的,典型的,spring应用中的对象不依赖于Spring的特定类。
控制反转 ——Spring通过一种称作控制反转(IOC)的技术促进了松耦合。当应用了ioc,一个对象依赖的其他对象通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。
不是对象从容器中查找依赖,而是容器在对象初始化不等对象就主动将依赖传递给它。
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(比如审计和事务管理)进行内聚性的开发。应用对象之只实现它们应该做的—完成业务逻辑而已。它们不负责其他系统级关注点,(比如 日志或事务支持)。
容器——Spring包含并管理应用对象 的配置和生命周期,在这个意义它是一种容器,你可以配置你的每个Bean 如何被创建——基于一个可配置原型,你的bean可以创建一个单独的事例或者每次需要时都生成一个新的实例。它们是如何相互关联的,然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大于笨重的。难以使用。
框架—— spring可以简单的组件配置,组合成复杂的应用。在sprig中,应用对象声明式的组和,典型的事在一个XML文件里。Spring也提供了很多基础功能(事务管理,持久化框架集成等)。
3.项目中如何体现spring中的切面编程?
面向切面编程:主要事横切一个关注点,将一个关注点模块化成一个切面,在切面上声明一个通知(advice)和切入点
(pointcut);通知、;是指切面在某个特定的连接点(代表一个方法的执行,通过声明一个org.aspectj.JoinPoint类型的参数可以使通知(advice)的主题部分获得连接点信息。)切入点的内容是一个表达式。
spring中的切面编程最多的地方,声明式事务管理。
a.定义一个事务管理器
b.配置事物特性 (声明通知。)
c.切入点。
4.spring的事物配置
spring的声明事务配置
1.<!-- 配置sessionFactory-->
<bean id="sessionFactory"
class="org.springframework.orm.hibemate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>/WEB-INF/calss/hibernate.cfg.xml</value>
</property>
</bean>
2.配置事物管理器
<bean id="transactionManger"
class="org.springframework.orm.hibemate3.HibemateTransactionManager">
<property name="sessionFactory">
<reflocal="sessionFactory"/>
</property>
</bean>
3.配置事物特性
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice >
4.配置那些类的那些方法配置事物
<aop:config>
<aop:pointcut id=“allManagerMethod" ession="execution(*cn.happy.service.impl.*.*(..))"/>
<aop:advisor advisor advice-ref="txAdvice" pointcut-ref=“allManagerMethod">
</aop:config>
5个不同的事物隔离级别:
DEFAULT:默认的隔离级别
READ-COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务为提交嘚的数据。可能出现不可重复读和幻想读。
READ-UNCOMMITTED:这是事务最低的隔离级别。它允许另外一个事务可以看到这个事务未提交的数据。不可重复读和幻想读。
REPEATABLE-READ:这种事务级别可以防止脏读,不可重复。可能出现幻像读。它保证了一个事务不能读取另一个事务
未提交的数据外,还保证避免不了不可重复读。
SERIALIABLE:这是花费最高代价的但最可靠的事务隔离级别。事务被处理为顺序执行。防止脏读,不可重复读外
还避免了幻像读。
7个事物传播行为
REQUIRED:如果存在一个事务,则支持当前事务。如果没有则开启新的事务。
SUPPORTS:如果存在一个事务,支持当前事务。如果没有。则非事务的执行。
REQUIRES_NEW:总是开启一个新事务。如果一个已经存在,则将这个存在的挂起。
NOT_SUPPORTED :总是非事务的执行,并挂起任何存在的事务。
NEVER:总是非事物 地执,如果存在一个活动事务,则抛出异常。
NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按TranscationDefinition.PROPAFATION_REQUIRED属性执行。
嵌套事务就是内层事务依赖于外层事务,外层失败时,会回滚内层事务所做的动作。尔内层事务操作失败并不会引起外层事务的回滚。
REQUIRED:我们首先得事务传播行为。它能够满足我们大多数的事务需求。