1 什么是Spring框架?spring框架有哪些主要模块?
Spring框架是一个为java应用程序的开发提供了综合、广泛的基础性支出的java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring本身也是按照设计模式打造的,是分层的JavaSE/EE full-stack 轻量级开源框架,JavaEE在服务器端中分为三层(web层【表现层】,业务逻辑层,数据访问层【集成层,持久层】),spring包含了javaee三层的每一层的解决方案(一站式)1 web层(表现层):SpringMvc 2业务层:SpringBean的管理 AOP 事务管理 3持久层:SpringJDBCTemplate,ORM模块(整合其它持久层框架)这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring如何在后台进行工作的、
Spring框架至今已经集合成了20多个模块。这些模块主要被分为如下图所示的核心容器、数据访问/集成,web、AOP、工具、消息和测试模块。
2使用spring框架能带来哪些好处?
1方便解耦,简化开发
Spring是一个大工厂,可以将所有对象的创建和依赖关系维护,交给Spring来管理。
2AOP编程的支持
Spring提供面向切面的编程,可以方便得实现对程序进行权限拦截、运行监控等功能。
3声明式事务的支持
只需要通过配置就可以完成对事物的管理,不需要手动编程。
4方便程序的测试
Spring支持对 Junit4的支持,可以通过注解方便的测试Spring程序
5方便集合各种优秀框架
Spring不排斥各种优秀开源框架,其内部提供了对各种优秀框架(如:Struts、hibernate、MyBatis、Quatrz等)的直接支持
6降低JavaEE API的使用难度
Spring对JAvaEE中开发难度比较大的一些API(JDBC JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
3什么是控制反转(IOC)?什么是依赖注入?
IoC=Inversion of Control 就是有容器控制程序之间的(依赖)关系,而非传统实现中,有代码直接操纵。这就是控制反转的概念:(依赖)控制权(对象的创建有获取)由应用代码转移到了外部容器,控制权的转移,是所谓的反转。
依赖注入:是在编译阶段尚未知所需的功能是来自哪个类的情况下,将其他对象依赖的功能对象实例化的模式。
这就需要一种机制来激活相应的组件以提供特定的功能,所以依赖注入是控制反转的基础,否则在组件不受框架控制的情况下,框架怎么知道创建哪个组件?
在java中依赖注入有三种方式:
1 构造器注入
2 Setter方法注入
3 接口注入
Iteye的开涛对Spring框架的IOC的理解: http://jinnianshilongnian.iteye.com/blog/1413846
4请解释一下Spring中的IOC?
Spring中的org.springframework.beans 包和ordg.springframework.context 包 构成了spring框架 ioC容器的基础
BeanFactory 接口提供了一个先进的配置机制,使得任何对象的配置成为可能。ApplicationContext 接口对BeanFactory 进行了扩展,在BeanFactory的基础上添加了其他功能,比如Spring的AOP更容易集成,也提供了处理message resource机制(用于处理国际化)、时间传播以及应用层的特别配置,比如针对web应用层的WebApplicationContext.
org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具体实现,用来包装盒管理各种bean。BeanfFactory接口是Spring IoC容器的核心接口。
5 BeanFactory和ApplicationContext有什么区别?
BeanFactory可以理解为含有Bean集合的工厂类。BeanFactory包含了bean的定义,以便在接受到客户端请求时将相应的Bean实例化。
BeanFactory还能在实例化对象时生成协作类之间的关系,此举将bean自身和bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法( initialization methods)和销毁方法(destruction methods)。
、从表面看,ApplicationContext如同BeanFactory一样具有定义Bean、bean关联关系的设置,根据请求发送bean的功能。但ApplicationContext在此基础上还具有如下功能:
1 提供支持国际化的文本信息
2统一的资源文件读取方式
3已在监听器中注册的bean的事件
以下是较为常见的ApplicationContext实现方式:
1、ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。
ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);
2、FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。
ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);
3、XmlWebApplicationContext:由Web应用的XML文件读取上下文。
6spring有几种配置方式?
1基于XML的配置
2基于注解的配置
3基于java的配置
7如何用基于xml配置的方式配置Spring?
在Spring框架中,依赖和服务需要在专门的配置文件来实现,我常用的XML格式的配置文件。这些配置文件的格式通常用<beans>
开头,然后一系列的
bean
定义和专门的应用配置选项组成。
8如何用基于Java配置的方式配置Spring?(bean的注解)
• @Configuration 指定POJO类为Spring提供Bean定义信息
• @Bean 提供一个Bean定义信息
9、怎样用注解的方式配置Spring?
开发步骤:
第一步编写HelloService
第二步编写配置文件
l 除了@Component外,Spring提供了3个功能基本和@Component等效的注解
• @Repository 用于对DAO实现类进行标注
• @Service 用于对Service实现类进行标注
• @Controller 用于对Controller实现类进行标注
• 这三个注解是为了让标注类本身的用途清晰,Spring已对其增强
4.1简单属性的注入
1) @Value
@Value 注解 完成属性的注入
4.2复杂属性的注入
1)@Autowired
l @Autowired 默认按照类型进行注入
• 如果存在两个相同Bean类型相同,则按照名称注入
l @Autowired注入时可以针对成员变量或者setter方法
完成Bean自动装配 按照类型注入 默认注入不成功会报错
是按照数据类型进行注入会查找bean的id为personDao的bean如果找不到默认会报错,
通过改变默认行为如果找不到对应的bean会是空
2)@Qualifier
l 使用@Qualifier指定注入Bean的名称
根据指定的bean的名字查询而不是根据数据类型查询
3)@Resource
l @ResourceSpring提供对JSR-250中定义@Resource标准注解的支持
l @Resource和@Autowired注解功能相似
@Autowired
@Qualifier("userDao")
Private UserDao userDAO;
等价于
@Resource(name=”userDAO”)
Private UserDAO userDAO;
10、请解释Spring Bean的生命周期?
pring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。
- 初始化之后调用的回调方法。
- 销毁之前调用的回调方法。
Spring框架提供了以下四种方式来管理bean的生命周期事件:
- InitializingBean和DisposableBean回调接口
- 针对特殊行为的其他Aware接口
- Bean配置文件中的Custom init()方法和destroy()方法
- @PostConstruct和@PreDestroy注解方式
11、Spring Bean的作用域之间有什么区别?
Spring容器中的bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下:
- singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。
- prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。
- request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
- Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
- global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。
12、什么是Spring inner beans?
在Spring框架中,无论何时bean被使用时,当仅被调用了一个属性。一个明智的做法是将这个bean声明为内部bean。内部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来实现比如,在我们的应用程序中,一个Customer类引用了一个Person类,我们的要做的是创建一个Person的实例,然后在Customer内部使用。
public class Customer
{
private Person person;
//Setters and Getters
}
public class Person
{
private String name;
private String address;
private int age;
//Setters and Getters
}
内部bean的声明方式如下:
<bean id="CustomerBean" class="com.howtodoinjava.common.Customer">
<property name="person">
<!-- This is inner bean -->
<bean class="com.howtodoinjava.common.Person">
<property name="name" value="lokesh" />
<property name="address" value="India" />
<property name="age" value="34" />
</bean>
</property>
</bean>
13、Spring框架中的单例Beans是线程安全的么?
Spring框架并没有对单例bean进行任何多线程的分装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如service类和Dao类),所有在某种程度上可以说Spring 的单例bean是线程安全的。如果你的bean有多种状态的话(比如View model对象),就需要自行保证线程安全。
最浅显的解决办法就是将多态bean的作用域由“singleton”变成“prototype”。
14、请举例说明如何在Spring中注入一个Java Collection?
Spring提供了以下四种集合类的配置元素:
- <list> : 该标签用来装配可重复的list值。
- <set> : 该标签用来装配没有重复的set值。
- <map>: 该标签可用来注入键和值可以为任何类型的键值对。
- <props> : 该标签支持注入键和值都是字符串类型的键值对。
下面看一下具体的例子:
<beans>
<!-- Definition for javaCollection -->
<bean id="javaCollection" class="com.howtodoinjava.JavaCollection">
<!-- java.util.List -->
<property name="customList">
<list>
<value>INDIA</value>
<value>Pakistan</value>
<value>USA</value>
<value>UK</value>
</list>
</property>
<!-- java.util.Set -->
<property name="customSet">
<set>
<value>INDIA</value>
<value>Pakistan</value>
<value>USA</value>
<value>UK</value>
</set>
</property>
<!-- java.util.Map -->
<property name="customMap">
<map>
<entry key="1" value="INDIA"/>
<entry key="2" value="Pakistan"/>
<entry key="3" value="USA"/>
<entry key="4" value="UK"/>
</map>
</property>
<!-- java.util.Properties -->
<property name="customProperies">
<props>
<prop key="admin">admin@nospam.com</prop>
<prop key="support">support@nospam.com</prop>
</props>
</property>
</bean>
</beans>