Spring框架是一个为Java应用程序的开发提供了综合、普遍的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员能够专一于应用程序的开发。Spring框架自己亦是按照设计模式精心打造,这使得咱们能够在开发环境中安心的集成Spring框架,没必要担忧Spring是如何在后台进行工做的。 Spring框架至今已集成了20多个模块。这些模块主要被分以下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。 java
核心模块 | 说明 |
---|---|
Spring Core | 核心容器:核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用的配置和依赖性规范与实际的应用程序代码分开 |
Spring Context | 应用上下文: 是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,如JNDI、EJB、电子邮件、国际化、校验和调度功能 |
Spring AOP | 面向切面编程: 是面向对象编程的有效补充和完善,Spring的AOP是基于动态代理实现的,实现的方式有两种分别是Schema和AspectJ这两种方式 |
Spring Dao | JDBC和Dao模块: JDBC、DAO的抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理,和不一样数据库供应商所抛出的错误信息。异常层次结构简化了错误处理,而且极大的下降了须要编写的代码数量,好比打开和关闭连接 |
Spring ORM | 对象实体映射: Spring框架插入了若干个ORM框架,从而提供了ORM对象的关系工具,其中包括了Hibernate、JDO和 IBatis SQL Map等,全部这些都听从Spring的通用事物和DAO异常层次结构。 |
Spring Web | Web模块: Web上下文模块创建在应用程序上下文模块之上,为基于web的应用程序提供了上下文。因此Spring框架支持与Struts集成,web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工做 |
Spring Web MVC | **MVC模块:**MVC框架是一个全功能的构建Web应用程序的MVC实现。经过策略接口,MVC框架变成为高度可配置的。MVC容纳了大量视图技术,其中包括JSP、POI等,模型由JavaBean构成,存放于m当中,而视图是一个接口,负责实现模型,控制器表示逻辑代码,由c的事情。Spring框架的功能能够用在任何J2EE服务器当中,大多数功能也适用于不受管理的环境。Spring的核心要点就是支持不绑定到特定J2EE服务的可重用业务和数据的访问的对象,毫无疑问这样的对象能够在不一样的J2EE环境,独立应用程序和测试环境之间重用。 |
序号 | 好处 | 说明 |
---|---|---|
1 | 轻量 | Spring 是轻量的,基本的版本大约2MB。 |
2 | 控制反转 | Spring经过控制反转实现了松散耦合,对象们给出它们的依赖,而不是建立或查找依赖的对象们。 |
3 | 面向切面编程(AOP) | Spring支持面向切面的编程,而且把应用业务逻辑和系统服务分开。 |
4 | 容器 | Spring 包含并管理应用中对象的生命周期和配置。 |
5 | MVC框架 | Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。 |
6 | 事务管理 | Spring 提供一个持续的事务管理接口,能够扩展到上至本地事务下至全局事务(JTA)。 |
7 | 异常处理 | Spring 提供方便的API把具体技术相关的异常(好比由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。 |
8 | 最重要的 | 用的人多!!! |
在类图关系上BeanFactory是ApplicationContext接口的父接口 web
是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory没法支持spring的许多插件,如AOP功能、Web应用等。面试
ApplicationContext接口是由BeanFactory接口派生而来,于是具备BeanFactory全部的功能。ApplicationContext以一种更向面向框架的方式工做以及对上下文进行分层和实现继承,ApplicationContext包还提供了如下的功能spring
序号 | 配置方式 |
---|---|
1 | 基于XML的配置 |
2 | 基于注解的配置 |
3 | 基于Java的配置 |
在项目资源目录下建立applicationContext.xml文件,以下数据库
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
复制代码
若是是web项目的话,在web.xml文件添加以下配置:编程
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
复制代码
若是是java项目能够经过BeanFactory或ApplicationContext来直接加载Spring容器设计模式
BeanFactory bf =
new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
// 或者
ApplicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
复制代码
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 开启注解 配置扫描路径 -->
<context:component-scan base-package="com.dpb.javabean"/>
<!-- 若是有多个路径 ,号隔开
<context:component-scan base-package="com.dpb.javabean,com.dpb.factory"/>
-->
</beans>
复制代码
若是是web项目的话,在web.xml文件添加以下配置:安全
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
复制代码
若是是java项目能够经过BeanFactory或ApplicationContext来直接加载Spring容器bash
BeanFactory bf =
new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
// 或者
ApplicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
复制代码
Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。服务器
注解 | 说明 |
---|---|
@Bean | 由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IoC容器来管理 ,@Bean声明所起到的做用与 元素相似 |
@Configuration | 表示该类是一个配置类。用来定义bean资源 |
@Configuration
public class AppConfig
{
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
复制代码
若是是web项目的话,在web.xml文件添加以下配置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
复制代码
若是是java项目能够经过ApplicationContext来加载
public static void main(String[] args) {
ApplicationContext ctx =
new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = ctx.getBean(MyService.class);
myService.doStuff();
}
复制代码
实现方式 | 说明 |
---|---|
FileSystemXmlApplicationContext | 此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数 |
ClassPathXmlApplicationContext | 此容器也从一个XML文件中加载beans的定义,这里,你须要正确设置classpath由于这个容器将在classpath里找bean配置 |
WebXmlApplicationContext | 此容器加载一个XML文件,此文件定义了一个WEB应用的全部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中。全局做用域与Servlet中的session做用域效果相同。 |
确定不是线程安全的,当多用户同时请求一个服务时,容器会给每个请求分配一个线程,这是多个线程会并发执行该请求多对应的业务逻辑(成员方法),此时就要注意了,若是该处理逻辑中有对该单列状态的修改(体现为该单列的成员属性),则必须考虑线程同步问题.
当一个bean仅被用做另外一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring 的 基于XML的 配置元数据中,能够在 或\ 元素内使用 元素,内部bean一般是匿名的,它们的Scope通常是prototype。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="CustomerBean" class="com.dpb.common.Customer">
<property name="person" ref="PersonBean"/>
</bean>
<bean id="PersonBean" class="com.dpb.common.Person">
<property name="name" value="波波烤鸭"/>
<property name="address" value="深圳"/>
<property name="age" value="17"/>
</bean>
</beans>
复制代码
改成内部bean的方式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="CustomerBean" class="com.dpb.common.Customer">
<property name="person">
<bean class="com.dpb.common.Person">
<property name="name" value="波波烤鸭"/>
<property name="address" value="湖南"/>
<property name="age" value="17"/>
</bean>
</property>
</bean>
</beans>
复制代码
内部 bean 也支持构造器注入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="CustomerBean" class="com.dpb.common.Customer">
<constructor-arg >
<bean class="com.dpb.common.Person">
<property name="name" value="波波烤鸭"/>
<property name="address" value="湖南"/>
<property name="age" value="17"/>
</bean>
</constructor-arg>
</bean>
</beans>
复制代码
id 或 name 值在bean类是没有必要以一个内部 bean 呈现
Spring提供如下几种集合的配置元素:
元素 | 说明 |
---|---|
list | 类型用于注入一列值,容许有相同的值。 |
set | 类型用于注入一组值,不容许有相同的值。 |
map | 类型用于注入一组键值对,键和值均可觉得任意类型。 |
props | 类型用于注入一组键值对,键和值都只能为String类型。 |
<!-- 配置 student对象 -->
<bean class="com.dpb.javabean.Student">
<property name="id" value="10"/>
<property name="name" value="波波烤鸭"/>
<!-- 对象注入 -->
<property name="cat" ref="catId"></property>
<!-- List集合注入 -->
<property name="games">
<list>
<value>LOL</value>
<value>DNF</value>
<value>CS</value>
</list>
</property>
<property name="score">
<map>
<entry key="数学" value="99"/>
<entry key="英语" value="78"/>
<entry key="化学" value="84"/>
</map>
</property>
<property name="props">
<props>
<prop key="userName">admin</prop>
<prop key="password">123</prop>
</props>
</property>
复制代码
有五种自动装配的方式,能够用来指导Spring容器用自动装配方式来进行依赖注入。
装配类型 | 说明 |
---|---|
no | 默认的方式是不进行自动装配,经过显式设置ref 属性来进行装配 |
byName | 经过参数名 自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,以后容器试图匹配、装配和该bean的属性具备相同名字的bean。 |
byType | 经过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,以后容器试图匹配、装配和该bean的属性具备相同类型的bean。若是有多个bean符合条件,则抛出错误。 |
constructor | 这个方式相似于byType, 可是要提供给构造器参数,若是没有肯定的带参数的构造器参数类型,将会抛出异常。 |
autodetect | 首先尝试使用constructor来自动装配,若是没法工做,则使用byType方式。 |
emsp;经过类型来实现自动注入bean。和@Qualifier注解配合使用能够实现根据name注入bean。
emsp;和@Autowired一块使用,在同一类型的bean有多个的状况下能够实现根据name注入的需求
emsp;默认是根据name注入bean的,能够经过设置类型来实现经过类型来注入
Spring支持两种类型的事务管理:
编程式事务管理:这意味你经过编程的方式管理事务,给你带来极大的灵活性,可是难维护。 声明式事务管理:这意味着你能够将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。
它为不一样的事务API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式。 它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如 它支持声明式事务管理。它支持声明式事务管理。 它和Spring各类数据访问抽象层很好得集成。它和Spring各类数据访问抽象层很好得集成。
大多数Spring框架的用户选择声明式事务管理,由于它对应用代码的影响最小,所以更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式容许你经过代码控制事务)少了一点灵活性。
Spring容器 从XML 文件中读取bean的定义,并实例化bean。 Spring根据bean的定义填充全部的属性。Spring根据bean的定义填充全部的属性。若是bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。 若是Bean 实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory 方法。 若是有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。 若是bean实现IntializingBean了,调用它的afterPropertySet方法,若是bean声明了初始化方法,调用此初始化方法。 若是有BeanPostProcessors 和bean 关联,这些bean的postProcessAfterInitialization() 方法将被调用。 若是bean实现了 DisposableBean,它将调用destroy()方法。