简述你对IoC(Inversion of Control)的理解

1、简述你对IoC(Inversion of Control)的理解

           一个类需要用到某个接口的方法,我们需要将类A和接口B的实现关联起来,最简单的方法是类A中创建一个对于接口B的实现C的实例,但这种方法显然两者的依赖(Dependency)太大了。而IoC的方法是只在类A中定义好用于关联接口B的实现的方法,将类A,接口B和接口B的实现C放入IoC的 容器(Container)中,通过一定的配置由容器(Container)来实现类A与接口B的实现C的关联。

2、Spring对多种ORM框架提供了很好的支持,简单描述在Spring中使用Hibernate的方法。

      在context中定义DataSource,创建SessionFactoy,设置参数;DAO类继承HibernateDaoSupport,实现具体接口,从中获得HibernateTemplate进行具体操作。在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor

3、请介绍一下Spring的事务管理

     

spring提供了几个关于事务处理的类:

TransactionDefinition //事务属性定义

TranscationStatus //代表了当前的事务,可以提交,回滚。

PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。

一般事务定义步骤:

TransactionDefinition td = new TransactionDefinition();

TransactionStatus ts = transactionManager.getTransaction(td);

try

{ //do sth

transactionManager.commit(ts);

}

catch(Exception e){transactionManager.rollback(ts);}

spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。

编程式主要使用transactionTemplate。省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.

void add()

{

transactionTemplate.execute( new TransactionCallback(){

pulic Object doInTransaction(TransactionStatus ts)

{ //do sth}

}

}

声明式:

使用TransactionProxyFactoryBean:

PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly

围绕Poxy的动态代理 能够自动的提交和回滚事务

org.springframework.transaction.interceptor.TransactionProxyFactoryBean

PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED–如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

4、如何在Spring的applicationContext.xml里面使用JNDI而不是datasource?

    可以使用”org.springframework.jndi.JndiObjectFactoryBean”来实现。示例如下:
<bean id=”dataSource”>
<property name=”jndiName”>
<value>java:comp/env/jdbc/appfuse</value>
< /property>
< /bean>

5、Spring里面如何配置数据库驱动?

使用org.springframework.jdbc.datasource.DriverManagerDataSource”数据源来配置数据库驱动。示例如下:
<bean id=”dataSource”>
<property name=”driverClassName”>
<value>org.hsqldb.jdbcDriver</value>
< /property>
< property name=”url”>
<value>jdbc:hsqldb:db/appfuse</value>
< /property>
< property name=”username”><value>sa</value></property>
< property name=”password”><value></value></property>
< /bean>

6、Spring里面applicationContext.xml文件能不能改成其他文件名?

ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。 你可以通过定义一个<context-param>元素名字为”contextConfigLocation”来改变Spring配置文件的位置。示例如下:

<listener>
< listener-class>org.springframework.web.context.ContextLoaderListener
< context-param>
< param-name>contextConfigLocation</param-name>
< param-value>/WEB-INF/xyz.xml</param-value>
< /context-param>
< /listener-class>
< /listener>

7、如何在web应用里面配置spring?

    

在J2EE的web应用里面配置spring非常简单,最简单的只需要把spring得ContextLoaderListener添加到你的web.xml文件里面就可以了,示例如下:

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

8、Spring里面如何定义hibernate mapping?

      添加hibernate mapping 文件到web/WEB-INF目录下的applicationContext.xml文件里面。示例如下:
<property name=”mappingResources”>
<list>
< value>org/appfuse/model/User.hbm.xml</value>
< /list>
< /property>

 

9、两种依赖注入的类型都是什么?

两种依赖注入的类型分别是setter注入和构造方法注入。

setter注入: 一般情况下所有的java bean, 我们都会使用setter方法和getter方法去设置和获取属性的值,示例如下:
public class namebean {
String name;
public void setName(String a) {
name = a; }
public String getName() {
return name; }
}
我们会创建一个bean的实例然后设置属性的值,spring的配置文件如下:
<bean id=”bean1″ >
< property name=”name” >
<value>tom</value>
< /property>
< /bean>
Spring会调用setName方法来只是name熟悉为tom
构造方法注入:构造方法注入中,我们使用带参数的构造方法如下:
public class namebean {
String name;
public namebean(String a) {
name = a;
}
}
我们会在创建bean实例的时候以new namebean(”tom”)的方式来设置name属性, Spring配置文件如下:
<bean id=”bean1″ >
< constructor-arg>
< value>My Bean Value</value>
< /constructor-arg>
< /bean>
使用constructor-arg标签来设置构造方法的参数。

10、解释一下Dependency injection(DI,依赖注入)和IOC(Inversion of control,控制反转)?

依赖注入DI是一个程序设计模式和架构模型, 一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:把一个数据库连接已参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接。控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖
应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值