一. Spring 原理讲解
Spring 是一个轻量容器框架(开源);Spring的核心是 IoC(控制反转) 和 AOP(面向切面编程);
Spring 由7个模块组成:
- Spring Core(核心容器):核心容器提供 Spring 框架的基本功能;
- Spring Context(Spring 上下文):Spring 上下文是一个配置文件,向 Spring框架提供上下文信息;
- Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中;
- Spring DAO:JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息;
- Spring ORM:Spring 框架插入了若干个ORM框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map;
- Spring Web:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文;
- Spring MVC框架:MVC框架是一个全功能的构建 Web应用程序的 MVC 实现;
√ 什么是框架?
- 解释一:制定一套规范或者规则(思想),大家(程序员)在该规范或者规则(思想)下工作;
- 解释二:一些牛人前辈或对牛人前辈的总结而出的一套解决方案;
二. Spring IoC (控制反转)
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。
设计原理:把耦合从代码中移出去,放在同一的 XML 文件中,通过一个容器在需要的时候把这个依赖关系实现,及把需要的接口实现注入到需要它的类中。
IoC 中最基本的 Java 技术就是"反射"编程,反射编程方式相对于正常的编程方式要慢十几倍,通过 SUN 改良之后反射方式生成的对象和普通方式生成的对象相差不大了(依然有一倍以上的差距);
控制反转一般分为两种类型
- 依赖注入(Dependency Injection,简称DI): 组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection);
- 依赖查找(Dependency Lookup): 容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码获得相关资源.
三. Spring AOP (面向切面变成)
AOP 是 Aspect Oriented Programming的缩写;AOP同OOP都是一种编程思想,且AOP 实际上是OOP的一种延续,我们用类比法进行理解:
AOP 同 OOP 的关联:1. 都是编程思想;
AOP 同 OOP 的区别:1. OOP关注的是纵向业务,而AOP关注的是横向业务;
2. 从业务角度来说,OOP 是对实体业务属性和行为进行抽象封装,AOP面对的是在处理过程中的某个步骤或阶段;
说明:
上图中将国内商务部、国际商务部和广告制作部归并(抽象)到商务部,以及将开发部、测试部、设计部归并(抽象)到技术部是用到了OOP 的编程思想;
国际商务部、国内商务部和开发部都有访问客户的业务,广告制作部和设计部,此时用抽象无法形象体现出来(同一类中的其他部门没有对应的业务),这里就可以使用AOP 编程思想;
四. Spring 模块说明
Spring 框架是一个分层架构,由7个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 Bean 的方式;组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。
Bean的概念:由 IoC 容器管理的那些组成你应用程序的对象;Bean 是 Spring 管理的基本单位,在基于Spring 的 Java EE 应用中,所有的组件都被当成Bean 处理(包括数据源、Hibernate的SessionFactory、事物管理器等)。Bean 就是由 Spring 容器初始化、装配及管理的对象,除此之外,bean 就与应用程序中其他对象没有什么区别了。
1. Spring Core (核心容器):
概念理解:核心容器提供 Spring 框架的基本功能(Spring Core)。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory 使用 IoC 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
实际应用:Spring 有两个核心接口(BeanFactory 和 ApplicationContext),其中ApplicationContext 是BeanFactory 的子接口。他们都可代表 Spring 容器,Spring 容器是生成 Bean 实例的工厂,并且管理容器中的 Bean。
- 1. 定义接口
1 public interface HelloService { 2 public void sayHello(); 3 }
- 2. 定义接口实现类
1 public class HelloServiceImpl implements HelloService{ 2 public void sayHello(){ 3 System.out.println("Hello World!"); 4 } 5 }
- 3. 在配置文件(helloworld.xml)中注册Bean信息
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation=" 6 http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 10 11 <!-- id 表示组件的名字,class表示组件类 --> 12 <bean id="helloService" class="com.ljq.test.HelloServiceImpl" /> 13 14 </beans>
- 4. 应用
1 public class HelloServiceTest { 2 @Test 3 public void testHelloWorld() { 4 // 1、读取配置文件实例化一个IOC容器 5 ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml"); 6 // 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现” 7 HelloService helloService = context.getBean("helloService", HelloService.class); 8 // 3、执行业务逻辑 9 helloService.sayHello(); 10 } 11 }
说明:上诉 1-4 即为一个Spring Bean 的实际应用;其实就是如下4个步骤
- 定义服务层代码
- 在配置文件中进行声明
- 读取配置文件实例化一个 IOC 容器(这里有复杂的源码,另作分析)
- 从容器中获取Bean
- 执行业务逻辑
ApplicationContext经常用到的三个实现:
- 1.ClassPathXmlApplicationContext:从类路径中的XML文件载入上下文定义信息。把上下文定义文件当成类路径资源。
- 2.FileSystemXmlApplicationContext:从文件系统中的XML文件载入上下文定义信息。
- 3.XmlWebApplicationContext:从Web系统中的XML文件载入上下文定义信息。
2. Spring Context (Spring 上下文):
Spring 上下文是一个配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
在spring使用过程中,通常的做法是让服务器启动时即实例化所有的bean,这样做在一定程度上提高了web应用的速度。
要配置在服务器启动加载applicationcontext通常有两种方法:
- ContextLoaderListener 具体配置是在web.xml中增加:
1 <listener> 2 <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> 3 </listener>
- ContextLoaderServlet 具体配置是在web.xml中增加:
1 <servlet> 2 <servlet-name>context</servlet-name> 3 <servlet-class> 4 org.springframework.web.context.ContextLoaderServlet 5 </servlet-class> 6 <load-on-startup>1</load-on-startup> 7 </servlet>
无论通过上面的哪一种配置都可以达到服务器启动即实例化bean的目的,如果要想指定applicationContext.xml的位置可以在增加:
1 <context-param> 2 <param-name>contextConfigLocation</param-name> 3 <param-value>/WEB-INF/appContext.xml</param-value> 4 </context-param>
通过以上配置就可以达到在服务器启动时实例化指定的applicationContext.xml配置文件了。
3. Spring AOP
通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中
4. Spring DAO
JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
说明:针对1-7的详细应用在接下来的章节中结合实例进行讲解