Spring是一个开源的轻量级javase标准版本javaee企业版本开发应用框架,其目的是用于简化企业级应用程序开发。
应用程序是由一组相互协作的对象组成。而在传统应用程序开发中,一个完整的应用是由一组相互协作的对象组成。所以开发一个应用程序除了要开发业务逻辑之外,最多的是关注如何使用这些对象协作来完成所需功能,而且要低耦合、高内聚。业务逻辑开发是不可避免的,那如果有个框架出来帮我们来创建对象及管理这些对象之间的依赖关系。可能有人说了,比如抽象工厂、工厂方法设计模式不也可以帮我们创建对象,生成器模式帮我们处理对象间的依赖关系,不也能完成这些功能吗?可是这些又需要我们创建另一些工厂类、生成器类,我们又要额外管理这些类,增加了我们的负担,如果能有种通过配置方式来创建对象,管理对象之间依赖关系,我们不需要通过工厂和生成器来创建及管理对象之间的依赖关系,这样我们是不是减少了许多工作,加速了开发,能节省出很多时间来干其他事。Spring框架刚出来时主要就是来完成这个功能。
Spring框架除了帮我们管理对象及其依赖关系,还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力,还能帮我们管理数据库事务,本身提供了一套简单的JDBC访问实现,提供与第三方数据访问框架集成Hibernate、JPA,与各种JavaEE技术整合如javaMail 任务调度等。提供一套自己的web层框架SpringMVC、而且还能非常简单的与第三方web框架集成。
传统程序开发,创建对象及组装对象间依赖关系由我们程序内部进行控制,这样会加大各个对象间的耦合,如果我们要修改对象间的依赖关系就必须修改源代码,重新编译、部署;而如果采用Spring,则由Spring根据配置文件来进行创建及组装对象间依赖关系,只需要改配置文件即可,无需重新编译。
非常轻量级的容器
AOP
简单的数据库事务管理
JDBC抽象及ORM框架支持
灵活的web层支持
简化各种技术集成
Core
Beans
Context
EL
AOP
Aspects
事务模块
JDBC模块
ORM模块
OXM模块
JMS模块:用于JMS java messageing service 提供一套,消息生产者、消息消费者模板用于更加简单的使用JMS,JMS用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
web模块
web-servlet模块
web-strits模块
test模块
典型web应用程序应用场景
远程访问应用场景
EJB应用场景
Ioc是什么 Inversion of Control 即 控制反转,不是什么技术,而是一种设计思想。
DI 依赖注入
IOC容器基本原理
IOC容器的概念
IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化、定位、配置应用程序的对象及建立这些对象的依赖。
在Spring中BeanFactory是Ioc容器的实际代表者
SpringIoc容器如何知道哪些是它管理的对象呢?这就需要配置文件。
Bean的概念
由Ioc容器管理的那些组成应用程序的对象我们就叫它Bean
Bean是由Spring容器初始化、装配及管理的对象。
package com.lizhenhua.test;
public interface HelloI {
public void sayHello();
}
package com.lizhenhua.test;
public class HelloImpl implements HelloI {
@Override
public void sayHello() {
System.out.println("你好,世界");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- id表示组件的名字,class表示组件的实现类 -->
<bean id="hello" class="com.lizhenhua.test.HelloImpl"></bean>
</beans>
package com.lizhenhua.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloTest {
@Test
public void testHelloWorld(){
//1.读取配置文件实例化一个Ioc容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.从容器中获取Bean,注意此处完全面向接口编程,而不是面向实现
HelloI helloI = context.getBean("hello", HelloI.class);
//3.执行业务逻辑
helloI.sayHello();
}
}
Spring IOC容器代表就是org.springframework.beans.BeanFactory接口BeanFactory接口提供了ioc容器最基本功能,而org.springframework.context.AplicationContext接口扩展了BeanFactory提供了与Spring AOP集成、国际化处理、事件传播及提供不同层次的context实现。
//从文件系统获取资源
File file = new File("fileSystemConfig.xml");
Resource resource = new FileSystemResource(file);
BeanFactory beanFactory = new XmlBeanFactory(resource);
//从classpath获取资源
Resource resource2 = new ClassPathResource("classpath.xml");
BeanFactory beanFactory2 = new XmlBeanFactory(resource2);
//从classpaht获取资源
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath.xml");
//从文件系统获取资源
BeanFactory beanFactory = new FileSystemXmlApplicationContext("fileSystem.xml");
Object getBean(String name)根据名称返回一个Bean,客户端需要自己进行类型转换
T getBean(String name,Class<T> requiredType) 根据名称和指定的类型返回一个Bean,客户端无需自己进行类型转换,如果类型转换失败,容器抛出异常
T getBean(Class<T> requiredType)根据指定的类型返回一个Bean,客户端无需自己进行类型转换,如果没哟偶或多于一个Bean存在容器将抛出异常
Map<String ,T> getBeansOfType(Class<T> type) 根据指定的类型返回一个键值为名字和值为Bean对象的map,如果没有Bean对象存在则返回空的Map
一、准备配置文件:就向前边的helloworld配置文件一样,在配置文件中声明Bean定义也就是配置元数据。 (由我们开发人员配置)
二、有IOC容器进行解析元数据 :Ioc容器的Bean Reader读取并解析配置文件,根据定义生成BeanDefinition配置元数据对象,Ioc容器根据BeanDefinition进行实例化、配置及组装Bean (不需要开发人员编写,由IOC容器自动执行)
三、实例化ioc容器:由客户端实例化容器,获取需要的Bean (由开发人员编写)
除了测试程序的代码外,也就是程序的入口,所有代码都没有出现Spring任何组件,而且所有我们写的代码没有实现框架拥有的接口,因而能非常容易的替换掉Spring,是不是非入侵
客户端代码完全面向接口编程,无需知道实现类,可以通过修改配置文件来更换接口实现,客户端代码不需要任何修改。是不是低耦合。
如果在开发初期没有真正的实现,我们可以模拟一个实现来测试,不耦合代码,是不是很方便测试。
Bean之间几乎没有依赖关系,是不是很容易重用