Spring
2016-03-24 17:34
417 查看
1、什么是Spring?
Spring是分层的JavaSE/EE full-stack(一站式)轻量级开源框架。
☆ JavaEE程序在服务器端被分为三层(Web层(表现层)、业务逻辑层、数据访问层(集成层、持久层))
☆ Struts2是表现层MVC的框架
☆ Hibernate是数据访问层(持久层)的完全ORM框架
Spring框架中包括JavaEE三层的 每一层的解决方案 (一站式)
☆ web层 :SpringMVC
☆ 业务层 :Spring Bean管理、AOP、事务管理
☆ 持久层 :Spring JDBCTemplate、ORM模块(整合其他持久层框架)
2、Spring给软件开发带来了什么?(六个优点)
a、方便解耦,简化开发
Spring就是一个大工厂,将对象创建和依赖关系维护交给Spring管理。
b、AOP编程的支持
可以方便的实现对程序进行权限拦截、运行监控等功能。
c、声明式事务管理
只需要通过配置就可以完成对事物的管理,无需手动编程。
d、方便程序测试
支持Junit4,通过注解方便测试
e、方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,内部提供了对各种优秀框架(Struts、Hibernate、Mybatis、Quartz等的直接支持)
f、降低JavaEE API的使用难度
Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail远程调用等)进行封装——>使这些API应用难度大大降低。
3、IOC和DI的区别?
IOC:Inverse of Control 控制反转:将原来程序中自己手动构造对象的权利交给Spring的IOC容器来构造,简单说,就是创建对象的控制权被反转到了Spring框架。
如果需要一个对象,从容器去获取一个对象。(对象的构造权被反转)
解决程序对象紧密耦合(如果要更改接口实现,必须修改代码)的问题,(工厂+反射+配置文件),将程序中原来构造对象的权限,交给IOC容器来构造,当程序需要对象,找IOC容器获取。
DI:Dependency Injection 依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件。
例如:Servlet需要Service,找IOC容器获取Service,而Service依赖DAO,IoC容器提供Service的同时,将Service依赖的DAO注入到Service中。
面试题:IOC 和DI的区别?
IoC:控制反转,指将对象的创建权,反转到Spring容器。
DI:依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入。
所以,依赖注入(DI)和控制反转(IoC)是从不同的角度描述的同一件事情,就是指通过引入IoC容器,利用依赖关系注入的方式实现对象之间的解耦。
其它:
IoC完成了类对象的生成以及类与类之间依赖关系的管理,将类本身以及依赖类生成对象的过程和功能从业务代码中解放出来(这些功能本来也不应该由业务类完成),这样就分清了职责。而且依靠面向接口编程,完成了类和类之间依赖的解耦。分清职责、依赖解耦的好处:程序扩展性、可维护性提高。
4、AOP:面向切面编程
AOP:主要是弥补了面向对象编程缺点(继承等都是纵向方面),从横向方面将可能散列在程序不同角落里的代码集中管理起来,这样程序的维护性、扩展性大幅提高。
5、描述一下Spring中实现DI(Dependency Injection)的几种方式?
方式一:接口注入,在实际中得到了普遍应用,即使在IOC的概念尚未确立时,这样的方法也已经频繁出现在代码中。
方式二:IoC:Setter Injection 对象创建之后,将被依赖对象通过set方法设置进去。
方式三:IoC:Constructor Injection 对象创建时,被依赖对象以构造方法参数的方式注入。
6、Spring对很多ORM框架提供了很好支持,描述下在Spring使用Hibernate的方法?
在context中定义DataSource,创建SessionFactory,设置参数;
DAO类继承HibernateDaoSupport,实现具体接口,从中获得HibernateTemplate进行具体操作。
在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。
7、请介绍下Spring的事务管理?
Spring提供了几个关于事务处理的类:
TransactionDefinition //事务属性定义
TransactionStatus //代表了当前的事务,可以提交、回滚
PlatformTransactionManager 这个是Spring提供的用于管理事务的基础接口,其下有一个实现的抽象类
AbstractPlatformTransactionManager 我们使用的事务管理类,例如DataSourceTransactionManager等都是这个类的子类。
一般事务定义步骤:
编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。
编程式主要使用transactionTemplate,省略了部分的提交、回滚,一系列的事物对象定义,需注入事务管理对象。
使用TransactionProxyFactoryBean:
PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED, readOnly
围绕Proxy的动态代理,能够自动的提交和回滚事务。
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED–如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
8、如何在Spring的applicationContext.xml使用JNDI而不是DataSource?
可以使用“org.springframework.jndi.JndiObjectFactoryBean"来实现。示例如下:
9、在Spring中是如何配置数据库驱动的?
org.springframework.jdbc.datasource.DriverManagerDataSource;数据源来配置数据库驱动。示例如下:
10、Spring中的applicationContext.xml能不能改为其它名字?
ContextLoaderListener是一个ServletContextListener,它在你的web应用启动的时候初始化。缺省情况下,它会在WEB-INF/applicationContext.xml文件中找Spring的配置。你可以通过定义一个<context-param>元素名字为”contextConfigLocation“来改变Spring配置文件的位置。示例如下:
11、在web中如何配置Spring?
在J2EE的web应用里面配置Spring非常简单,最简单的只需要把Spring的ContextLoaderListener添加到web.xml文件里面就可以了。示例如下:
12、在Spring中如何定义Hibernate Mapping?
添加Hibernate mapping文件到web/WEB-INF目录下的applicationContext..xml文件里面。示例如下:
13、两种依赖注入的类型是什么?
两种依赖注入的类型分别是setter注入和构造方法注入。
setter注入:一般情况下所有的java bean,我们都会使用setter方法和getter方法去设置和获取属性的值,示例如下:
构造方法注入:构造方法注入中,我们使用带参数的构造方法如下:
14、Spring中BeanFactory和ApplicationContext的作用和区别?
作用:
1、BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期。
2、ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:
a、国际化支持
b、资源访问:Resource rs = ctx.getResource("classpath:config.properties"),"file:c:/config.properties"
c、事件传递:通过实现ApplicationContextAware接口
3、常用的获取ApplicationContext的方法:
FileSystemXmlApplicationContext:从文件系统或者URL指定的xml配置文件创建,参数为配置文件名或文件名数组
ClassPathXMLApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件
WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现
Spring是分层的JavaSE/EE full-stack(一站式)轻量级开源框架。
☆ JavaEE程序在服务器端被分为三层(Web层(表现层)、业务逻辑层、数据访问层(集成层、持久层))
☆ Struts2是表现层MVC的框架
☆ Hibernate是数据访问层(持久层)的完全ORM框架
Spring框架中包括JavaEE三层的 每一层的解决方案 (一站式)
☆ web层 :SpringMVC
☆ 业务层 :Spring Bean管理、AOP、事务管理
☆ 持久层 :Spring JDBCTemplate、ORM模块(整合其他持久层框架)
2、Spring给软件开发带来了什么?(六个优点)
a、方便解耦,简化开发
Spring就是一个大工厂,将对象创建和依赖关系维护交给Spring管理。
b、AOP编程的支持
可以方便的实现对程序进行权限拦截、运行监控等功能。
c、声明式事务管理
只需要通过配置就可以完成对事物的管理,无需手动编程。
d、方便程序测试
支持Junit4,通过注解方便测试
e、方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,内部提供了对各种优秀框架(Struts、Hibernate、Mybatis、Quartz等的直接支持)
f、降低JavaEE API的使用难度
Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail远程调用等)进行封装——>使这些API应用难度大大降低。
3、IOC和DI的区别?
IOC:Inverse of Control 控制反转:将原来程序中自己手动构造对象的权利交给Spring的IOC容器来构造,简单说,就是创建对象的控制权被反转到了Spring框架。
如果需要一个对象,从容器去获取一个对象。(对象的构造权被反转)
解决程序对象紧密耦合(如果要更改接口实现,必须修改代码)的问题,(工厂+反射+配置文件),将程序中原来构造对象的权限,交给IOC容器来构造,当程序需要对象,找IOC容器获取。
DI:Dependency Injection 依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件。
例如:Servlet需要Service,找IOC容器获取Service,而Service依赖DAO,IoC容器提供Service的同时,将Service依赖的DAO注入到Service中。
面试题:IOC 和DI的区别?
IoC:控制反转,指将对象的创建权,反转到Spring容器。
DI:依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入。
所以,依赖注入(DI)和控制反转(IoC)是从不同的角度描述的同一件事情,就是指通过引入IoC容器,利用依赖关系注入的方式实现对象之间的解耦。
其它:
IoC完成了类对象的生成以及类与类之间依赖关系的管理,将类本身以及依赖类生成对象的过程和功能从业务代码中解放出来(这些功能本来也不应该由业务类完成),这样就分清了职责。而且依靠面向接口编程,完成了类和类之间依赖的解耦。分清职责、依赖解耦的好处:程序扩展性、可维护性提高。
4、AOP:面向切面编程
AOP:主要是弥补了面向对象编程缺点(继承等都是纵向方面),从横向方面将可能散列在程序不同角落里的代码集中管理起来,这样程序的维护性、扩展性大幅提高。
5、描述一下Spring中实现DI(Dependency Injection)的几种方式?
方式一:接口注入,在实际中得到了普遍应用,即使在IOC的概念尚未确立时,这样的方法也已经频繁出现在代码中。
方式二:IoC:Setter Injection 对象创建之后,将被依赖对象通过set方法设置进去。
方式三:IoC:Constructor Injection 对象创建时,被依赖对象以构造方法参数的方式注入。
6、Spring对很多ORM框架提供了很好支持,描述下在Spring使用Hibernate的方法?
在context中定义DataSource,创建SessionFactory,设置参数;
DAO类继承HibernateDaoSupport,实现具体接口,从中获得HibernateTemplate进行具体操作。
在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。
7、请介绍下Spring的事务管理?
Spring提供了几个关于事务处理的类:
TransactionDefinition //事务属性定义
TransactionStatus //代表了当前的事务,可以提交、回滚
PlatformTransactionManager 这个是Spring提供的用于管理事务的基础接口,其下有一个实现的抽象类
AbstractPlatformTransactionManager 我们使用的事务管理类,例如DataSourceTransactionManager等都是这个类的子类。
一般事务定义步骤:
<span style="white-space:pre"> </span>TransactionDefinition td = new TransactionDefinition(); <span style="white-space:pre"> </span>TransactionStatus ts = transactionManager.getTransaction(td); <span style="white-space:pre"> </span>try <span style="white-space:pre"> </span>{ //do sth <span style="white-space:pre"> </span>transactionManager.commit(ts); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>catch(Exception e){transactionManager.rollback(ts);}Spring提供的事务管理可以分为两类:编程式的和声明式的。
编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。
编程式主要使用transactionTemplate,省略了部分的提交、回滚,一系列的事物对象定义,需注入事务管理对象。
<span style="white-space:pre"> </span>void add() <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>transactionTemplate.execute( new TransactionCallback(){ <span style="white-space:pre"> </span>pulic Object doInTransaction(TransactionStatus ts) <span style="white-space:pre"> </span>{ //do sth} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>}声明式:
使用TransactionProxyFactoryBean:
PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED, readOnly
围绕Proxy的动态代理,能够自动的提交和回滚事务。
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED–如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
8、如何在Spring的applicationContext.xml使用JNDI而不是DataSource?
可以使用“org.springframework.jndi.JndiObjectFactoryBean"来实现。示例如下:
<span style="white-space:pre"> </span><bean id=”dataSource”> <span style="white-space:pre"> </span><property name=”jndiName”> <span style="white-space:pre"> </span><value>java:comp/env/jdbc/appfuse</value> <span style="white-space:pre"> </span></property> <span style="white-space:pre"> </span></bean>
9、在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>
10、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>
11、在web中如何配置Spring?
在J2EE的web应用里面配置Spring非常简单,最简单的只需要把Spring的ContextLoaderListener添加到web.xml文件里面就可以了。示例如下:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
12、在Spring中如何定义Hibernate Mapping?
添加Hibernate mapping文件到web/WEB-INF目录下的applicationContext..xml文件里面。示例如下:
<property name=”mappingResources”> <list> <value>org/appfuse/model/User.hbm.xml</value> </list> </property>
13、两种依赖注入的类型是什么?
两种依赖注入的类型分别是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标签来设置构造方法的参数。
14、Spring中BeanFactory和ApplicationContext的作用和区别?
作用:
1、BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期。
2、ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:
a、国际化支持
b、资源访问:Resource rs = ctx.getResource("classpath:config.properties"),"file:c:/config.properties"
c、事件传递:通过实现ApplicationContextAware接口
3、常用的获取ApplicationContext的方法:
FileSystemXmlApplicationContext:从文件系统或者URL指定的xml配置文件创建,参数为配置文件名或文件名数组
ClassPathXMLApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件
WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现
<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>这两种方式都默认配置文件为WEB-INF/applicationContext.xml,也可以使用context-param指定配置文件
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/myApplicationContext.xml</param-value> </context-param>
相关文章推荐
- Java this 关键字返回当前类实例变量
- java在代码中获取Spring的bean的几种方式
- MyEclipse------如何添加jspsmartupload.jar+文件上传到服务器
- java图片处理——多张图片合成一张Gif图片并播放或Gif拆分成多张图片
- android使用andFix增量更新,在ubuntu系统下,Eclipse版本
- MySQL------如何安装mysql-connector-java-5.1.38.zip
- 礼拜四log~java函数replaceAll报错解决方案 & 一些常用jq方法 & java函数addAll
- JAVA中的反射机制
- 使用Eclipse构建Maven项目 (step-by-step)
- 聊聊并发-Java中的Copy-On-Write容器
- 监控Java的GC状态
- Eclipse项目导入AS(Android Studio)
- 深入研究java.lang.ThreadLocal类
- 聊聊并发(七)——Java中的阻塞队列
- Spring定时任务的几种实现
- hdu2035java
- java websocket
- SpringMVC学习系列-后记 解决GET请求时中文乱码的问题
- JDK源码中使用的设计模式
- 创建基于注解的springmvc的流程