1.1、Spring简介
Spring Framework是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本。该框架基于 Expert One-on-One Java EE Design and Development(ISBN 0-7645-4385-7)一书中的代码,最初由Rod Johnson和Juergen Hoeller等开发。Spring Framework提供了一个简易的开发方式,这种开发方式,将避免那些可能致使底层代码变得繁杂混乱的大量的属性文件和帮助类。
spring官方模块结构图
1.2、Spring是轻量级、一站式的开源框架
- 轻量级:从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
- 一站式:spring提供javaEE三层结构、每一层都有不同的技术支持。
1.3、Spring的基本核心概念
- AOP:面向切面编程、遵守开闭原则OCP(Open-Close Principle)、是扩展功能而不是修改源代码来实现。
- IOC:控制反(IOC)| 【别名】依赖注入(DI-Dependency Injection)、Spring通过控制反转(IoC)的技术促进了低耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
1.3.1、Spring中的IOC底层原理
控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的。在传统的编程方式中,业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配器负责实例化,这种实现方式还可以将对象之间的关联关系的定义抽象化。而绑定的过程是通过“依赖注入”实现的。
控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式,并在我们的实际工作中起到了有效的作用。
依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下,将其他对象所依赖的功能对象实例化的模式。这就需要一种机制用来激活相应的组件以提供特定的功能,所以依赖注入是控制反转的基础。否则如果在组件不受框架控制的情况下,框架又怎么知道要创建哪个组件?
在Java中依然注入有以下三种实现方式:
1.构造器注入
2.Setter方法注入
3.接口注入
1.3.2、IOC入门案例
package spring.ioc;
/**
* @auther 陈郑游
* @create 2016-12-01-20:31
* @功能描述
* @公司地址
*/
public class User {
void getAdd(){
System.out.println("User getAdd IOC 测试! ! !");
}
}
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--上面的schema约束没必要那么多-->
<bean id="user" class="spring.ioc.User"></bean>
</beans>
package spring.ioc;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @auther 陈郑游
* @create 2016-12-01-20:36
* @功能描述 IOC入门测试
* @公司地址
*/
public class UserTest {
@Test
public void userTest(){
//1、加载配置文件
ApplicationContext context = new
ClassPathXmlApplicationContext("spring/spring-bean.xml");
//2、得到实例
User user = (User)context.getBean("user");
user.getAdd();
//关闭资源
((ConfigurableApplicationContext)context).close();
}
}
1.4、Spring容器
spring容器最基本的接口就是BeanFactor。BeanFactory负责配置、创建、管理Bean,它有一个子接口:ApplicationContext,因此也称之为Spring上下文。Spring容器负责管理Bean与Bean之间的依赖关系。
BeanFactory接口包含以下几个基本方法:
- Boolean containBean(String name):判断Spring容器是否包含id为name的Bean实例。
- <T> getBean(Class<T> requiredTypr):获取Spring容器中属于requiredType类型的唯一的Bean实例。
- Object getBean(String name):返回Sprin容器中id为name的Bean实例。
- <T> T getBean(String name,Class requiredType):返回容器中id为name,并且类型为requiredType的Bean
- Class <?> getType(String name):返回容器中指定Bean实例的类型。
调用者只需使用getBean()方法即可获得指定Bean的引用,无须关心Bean的实例化过程。即Bean实例的创建过程完全透明。
在使用BeanFactory接口时,我们一般都是使用这个实现类:org.springframework.beans.factory.xml.XmlBeanFactory。然而ApplicationContext作为BeanFactory的子接口,使用它作为Spring容器会更加方便。它的实现有:
- FileSystemXmlApplicationContext
- ClassPathXmlApplicationContext
- AnnotationConfigApplicationContex
创建Spring容器实例时,必须提供Spring容器管理的Bean的详细配置信息。Spring的配置信息通常采用xml配置文件来设置,因此,创建BeanFactory实例时,应该提供XML配置文件作为参数。
XML配置文件通常使用Resource对象传入。Resource接口是Spring提供的资源访问接口,通过使用该接口,Spring能够以简单、透明的方式访问磁盘、类路径以及网络上的资源。
对于Java EE应用而言,可在启动Web应用时自动加载ApplicationContext实例,接受Spring管理的Bean无须知道ApplicationContext的存在。一般使用如下方式实例化BeanFactory。
//1、加载配置文件
ApplicationContext context = new
ClassPathXmlApplicationContext("spring/spring-bean.xml");
1.5、Bean
- id属性:不能包含特殊字符(如&…#等)、根据id配置属性。
- name属性:功能跟id一样、但name属性包含特殊字符(如&…#等)、根据id配置属性。
- class属性:创建对象的路径。
- scope属性:作用域属性。
作用域 | 描述 |
---|---|
在每个Spring IoC容器中一个bean定义对应一个单实例对象(默认)。 | |
一个bean定义对应多个对象实例。 | |
在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring | |
在一个HTTP | |
在一个全局的HTTP |