读书人

学习Sping的一些有关问题总结

发布时间: 2012-10-27 10:42:26 作者: rapoo

学习Sping的一些问题总结
什么是spring ?
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.
spring的设计思想是,单例模式和工厂模式


一、解释一下Dependency injection(DI依赖注入)和IOC(Inversion of control控制反转)?
当一个调用者需要被另一个调用者协助时,创建被调用者的工作不再由调用者来完成,称为控制反转。创建调用者实例的工作通常由spring容器来完成,然后注入调用者,称为依赖注入。


二、spring中的BeanFactory与ApplicationContext的作用有哪些
bean工厂作用:
(1) 创建对象实例
(2) 创建和管理对象之间的依赖
(3) 参与bean的生命周期管理,调用用户定义的初始化方法和销毁方法
ApplicationContext工厂作用:
(1) 包括BeanFactory的所有功能
(2) 提供国际化的消息访问(getMessage)
(3) 资源管理:可以直接读取一个文件的内容,例如URL
(4)事件传播(事件处理),实现了ApplicationListener接口的bean
(5) 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层 web应用中自动加载ApplicationContext

三、如何在spring中实现国际化
写个中英文属性文件messageRsource_en_US.properties、messageRsource_zh_CN.properties
XML配置
<bean id="messageSource" factory-method="静态工厂的方法名">
<constructor-arg>
<value>参数</value>
</constructor-arg>
</bean>

创建非静态工厂方法(xml配置):
<bean id="factory" factory-bean="factory" factory-method="非静态工厂方法名">
<constructor-arg>
<value>参数</value>
</constructor-arg>
</bean>


十一、spring初始化回调方法以及销毁( 析构回调)方法配置
在bean里 配置 init-method="fun" 和 destroy-method
<!-- init-method 指定最先运行的方法 并且会自动运行-->
<bean id="person" init-method="fun">


十二、IOC容器的实现类型
Spring 提供了两种类型的 IOC 容器实现.:BeanFactory: IOC 容器的基本实现,ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口,无论使用何种方式, 配置文件时相同的。 ApplicationContext 只是一个接口, 需要实例化其实现类:ClassPathXmlApplicationContext: 从 classpath 下加载配置文件,FileSystemXmlApplicationContext: 从文件系统中加载配置文件,XmlWebApplicationContext: 只能用于 web 应用。最长使用的是ClassPathXmlApplicationContext这个实现类。调用 ApplicationContext 的 getBean() 方法可以获取IOC容器中的对象。

十三、spring框架中bean的生命周期
(1) bean定义
在配置文件里面用<bean></bean>来进行定义。
(2) bean初始化
有两种方式初始化:
A.在配置文件中通过指定init-method属性来完成
B.实现org.springframwork.beans.factory.InitializingBean接口
(3) bean调用
有三种方式可以得到bean实例,并进行调用
(4) bean销毁
销毁有两种方式
A.使用配置文件指定的destroy-method属性
B.实现org.springframwork.bean.factory.DisposeableBean接口

十四、Spring读取配置文件的方式
InputStream is = new FileInputStream("beans.xml");
InputStreamResource isr = new InputStreamResource(is);
BeanFactory beanFactory = new XmlBeanFactory(isr);

Spring给出一些BeanFactory的实现类,其中最为常用的是XmlBeanFactory。
1、通过文件系统
Resource res = new FileSystemResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(res);
2、通过类路径
ClassPathResource res = new ClassPathResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(res);
3、通过ApplicationContext加载
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml", "applicationContext-part2.xml"});
BeanFactory factory = (BeanFactory) appContext;

十五、 连接点,切入点,切面,方面,处理,代理,目标对象
连接点:
在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring AOP中,一个连接点总是表示一个方法的执行。
切入点:
匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
切面:
一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于模式)或者基于@Aspect注解的方式来实现。
方面:
有了切面组成了方面:事务、日志、安全、权限
处理:

代理:
AOP框架创建的对象,用来实现切面契约(例如通知方法执行等等)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
目标对象(Target Object):
被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。

十六、 spring中代理的两种方式
1、jdk动态代理--面向接口编程(默认)
2、cglib代理--面向具体类(实现)编程

十七、 事务的类型
1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。
2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。
3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用

十八、 jdbc是如何支持事务
jdbc它是通过connection这个接口来支持事务的。
主要是setAutoCommit()和commit()以及rollback()方法。

十九、 spring事务的组成部分
事务主要是由:事务的传播行为,事务的隔离级别,事务的超时值,事务只读标志组成

二十、 说说一下spring事务支持的几个类
TransactionTemplate类(事务模板类)和PlatformTransactionManager(事务平台管理类)

二十一、 spring定义事务的几种方式
包括编程型事务的和声明型事务。
编程型:通过TransactionTemplate、PlatformTransactionManager这二个超级接口实现
声明型:就在配置文件中配置,主要配置三个部分:DataSource、TransactionManager和代理机制这三部分

二十二、 spring中事务代理的几个类
ProxyFactoryBean实现单个代理机制
BeanNameAutoProxyCreator实现动态代理机制

二十三、 -exception与+exception
-Exception指碰到异常强制回滚事务,+Exception事务回滚失效

二十四、 log4j日志的几种级别
fatal>error>warn>info>debug>off

二十五、 说说一下在我们项目中用aop加入日志的流程
1、首先定义一个类实现BeforeAdvice或AfterAdvice接口
2、配置这个类的bean
3、选择使用代理类BeanNamesAutoProxyCreate或ProxyFactoryBean来引入目标类和处理类
4、再配置一下log4j.properties资源文件
5、用前置通知来处理目标类。

二十六、 spring模板技术 ,他有什么好处
在bean定义中包含了大量的配置信息,其中包括容器相关的信息(比如初始化方法、静态工厂方法名等等)以及构造器参数和属性值。子bean定义就是从父bean定义继承配置数据的bean定义。它可以覆盖父bean的一些值,或者添加一些它需要的值。使用父/子bean定义的形式可以节省很多的输入工作。
好处:子类可以继承父类的一些属性,也可改变或增加属性,减少代码量, 使用bean模板技术可以节省很多的输入工作

二十七、 说说一下spring支持的通知有几种
(1).before advice(前置通知)实现MethodBeforeAdvice接口。
是在方法调用前调用,没有返回值,通常意外情况下,会继续运行下一步方法.记住的一点是没有返回值。
(2).after advice(后置通知)实现AfterReturningAdvice接口
是在方法调用后调用,有返回值,记住的一点是有返回值。
(3).around advice(环绕通知)实现MethodInterceptor接口
around是针对具体的某个切入点的方法,around的切入类型是就这个方法的内部调用,是通过java的元数据,在运行时通过Method.invoke来调用,具有返回值,当发生意外的时候会终止.记住的一点是有返回值。
(4).throws advice(异常通知)实现ThrowsAdvice接口
就在当程序有异常的时候进行通知,提供一些异常的信息
(5).introduce advice(引入通知)
引入通知是一种特殊的通知,它能将新的成员变量、成员方法引入到目标类中。它不能作用于任何切入点,因为它只作用于类层次,而不是方法层次。实现引入通知需要实现IntroductionAdvisor和IntroductionInterceptor接口。

二十八、 spring事务的原理(从架构图回答)
事务管理的方式:编程型和声明型,spring推荐使用后一种方式
声明型事务管理的优势非常明显:代码中无需关于关注事务逻辑,让Spring声明式事务管理负责事务逻辑,声明式事务管理无需与具体的事务逻辑耦合,可以方便地在不同事务逻辑之间切换。
声明式事务管理的配置方式,通常有如下三种:
1.使用TransactionProxyFactoryBean为目标bean生成事务代理的配置。此方式是最传统,配置文件最臃肿、难以阅读的方式。
2.采用bean继承的事务代理配置方式,比较简洁,但依然是增量式配置。
3.使用BeanNameAutoProxyCreator,根据bean name自动生成事务代理的方式,这是直接利用Spring的AOP框架配置事务代理的方式,需要对Spring的AOP框架有所理解。但这种方式避免了增量式配置,效果非常不错。
4.DefaultAdvisorAutoProxyCreator:这也是直接利用Spring的AOP框架配置事务代理的方式,效果也非常不多,只是这种配置方式的可读性不如第三种方式。
编程式:围绕着两个核心PlatformTransactionManager和TransactionStatus
spring提供了几个关于事务处理的类:
TransactionDefinition //事务属性定义
TranscationStatus //代表了当前的事务,可以提交,回滚。
PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。


二十九、 spring的后处理技术是干什么的
创建代理对象

三十、 spring事务的传播属性(7个,最好能说出3个)
1.PROPAGATION_MANDATORY:要求调用该方法的线程必须处于事务环境中,否则抛出异常。
2.PROPAGATION_NESTED:如果执行该方法的线程已处于事务环境下,依然启动新的事务,方法在嵌套的事务里执行。如果执行该方法的线程并未处于事务中,也启动新的事务,然后执行该方法,此时与PROPAGATION_REQUIRED相同。
3.PROPAGATION_NEVER:不允许调用该方法的线程处于事务环境下,如果调用该方法的线程处于事务环境下,则抛出异常。
4.PEOPAGATION_NOT_SUPPORTED:如果调用该方法的线程处于在事务中,则先暂停当前事务,然后执行该方法。
5.PEOPAGATION_REQUIRED:要求在事务环境中执行该方法,如果当前执行线程已处于事务中,则直接调用,如果当前执行线程不已处于事务中,则启动新的事务后执行该方法。
6.PEOPAGATION_REQUIRES_NEW:该方法要求有一个在新的事务环境中执行,如果当前执行线程已处于事务中,先暂停当前事务,启动新的事务后执行该方法;如果当前执行线程不已处于事务中,则启动新的事务后执行该方法
7.PEOPAGATION_SUPPORTS:如果当前执行线程已处于事务中,则使用当前事务,否则不使用事务。


三十一、 spting默认的事务隔离级别是什么?
isolation="READ_COMMITTED"

读书人网 >软件架构设计

热点推荐