一、Spring基础
</br>
- 核心容器:Spring Core
- 应用上下文:Spring Context
- AOP模块:Spring AOP
- JDBC和DAO模块:Spring Dao
- 对象实体映射:Spring ORM
- Web模块:Spring Web
- MVC模块:Spring Web MVC
1、Spring简介
Spring 是一个开源框架.
Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能.
Spring 是一个 IOC(DI) 和 AOP 容器框架
-
Spring描述
轻量级:Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API
依赖注入(DI --- dependency injection、IOC)
面向切面编程(AOP --- aspect oriented programming)
容器: Spring 是一个容器, 因为它包含并且管理应用对象的生命周期
框架: Spring 实现了使用简单的组件配置组合成一个复杂的应用. 在 Spring 中可以使用 XML 和 Java 注解组合这些对象
一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库 (实际上 Spring 自身也提供了展现层的 SpringMVC 和 持久层的 Spring JDBC)
2、Spring环境搭建
1)安装Spring tool suite插件
SPRING TOOL SUITE 是一个 Eclipse 插件,利用该插件可以更方便的在 Eclipse 平台上开发基于 Spring 的应用。
安装方法说明(springsource-tool-suite-3.4.0.RELEASE-e4.3.1-updatesite.zip):
Help --> Install New Software...
Click Add...
In dialog Add Site dialog, click Archive...
Navigate to springsource-tool-suite-3.4.0.RELEASE-e4.3.1-updatesite.zip and click Open
Clicking OK in the Add Site dialog will bring you back to the dialog 'Install'
Select the xxx/Spring IDE that has appeared
Click Next and then Finish
Approve the license
Restart eclipse when that is asked
3)搭建环境
- 把以下 jar 包加入到工程的 classpath 下:
Spring 的配置文件: 一个典型的 Spring 项目需要创建一个或多个 Bean 配置文件, 这些配置文件用于在** Spring IOC 容器**里配置 Bean,Bean 的配置文件可以放在 classpath 下, 也可以放在其它目录下
-
HelloWorld实例
** 配置文件**
<?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 -->
<!-- 通过反射来创建对象 -->
<bean id="helloWorld" class="com.atguigu.spring.beans.HelloWorld">
<!-- 赋值 -->
<property name="name" value="spring"></property>
</bean>
</beans>
** HelloWorld**
package com.atguigu.spring.beans;
public class HelloWorld {
private String name;
public HelloWorld(){
System.out.println("HelloWorld's Contructor....");
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("HelloWorld's setName : " + name);
this.name = name;
}
public void hello(){
System.out.println("hello: " + name);
}
}
** 测试类**
package com.atguigu.spring.beans;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args){
// 1、创建 Spring 的 IOC 容器对象
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
// 2、从 IOC 容器中获取 Bean 实例
HelloWorld h = (HelloWorld) context.getBean("helloWorld");
// 3、调用方法
h.hello();
}
}
** 测试结果**
十一月 02, 2016 6:23:35 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1f17ae12: startup date [Wed Nov 02 18:23:35 CST 2016]; root of context hierarchy
十一月 02, 2016 6:23:35 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [ApplicationContext.xml]
HelloWorld's Contructor....
HelloWorld's setName : spring
hello: spring
二、Spring中的bean配置
</br>
1、内容介绍
</br>
1)IOC & DI & AOP 概述
</br>
-
配置 bean
配置形式:基于 XML 文件的方式;基于注解的方式
-
Bean 的配置方式:
- 通过全类名(反射)
- 通过工厂方法(静态工厂方法 & 实例工厂方法)
- FactoryBean
IOC 容器 BeanFactory & ApplicationContext 概述
-
依赖注入的方式:
- 属性注入
- 构造器注入
注入属性值细节
自动转配
-
bean 之间的关系:
- 继承
- 依赖
-
bean 的作用域:
- singleton
- prototype
- WEB 环境作用域
使用外部属性文件
spEL
IOC 容器中 Bean 的生命周期
Spring 4.x 新特性:泛型依赖注入
1.1 IOC
IOC(Inversion of Control):其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式
- 由IOC容器来控制对象之间的依赖关系
- IOC在编程过程中对业务对象不会造成很强的侵入性,使用IOC之后,会使对象有更好的可实行性、可重用性、可扩展性
- 降低了组件之间的耦合度
- 提高了开发效率和产品质量
- 统一标准,提高了模块的复用性
- 模块具有热插拔性
1.2 DI
DI(Dependency Injection): IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入. 相对于 IOC 而言,这种表述更直接
1.3 AOP
AOP专门用来处理分布在系统中各个模块之间交叉关注点的问题,在javaEE应用中,常常用AOP来处理一些具有横切性质的系统级服务,如:事务管理、安全检查、缓存、对象池管理等。
AOP代理其实就是有AOP框架动态生成一个AOP对象,该对象可作为目标对象使用
AOP的通俗理解:
一个组件A,不关心其他的常用的服务组件B,当组件A使用组件B的时候,不是组件A自己去调用,而是通过Spring中xml的配置文件来调用,这样,就使得组件A压根不知道组件B是什么样的,B的一切跟组件A是无关的,组件A只需要关心自己的业务逻辑。
3)在Spring的IOC容器中配置bean
- 在 xml 文件中通过 bean 节点来配置 bean
<!-- 通过全类名的方式配置bean
class:bean的全类名,通过反射的方式在 IOC 容器中创建bean,所以要求bean中必须包含无参的构造器
id:唯一的表示容器中的bean
-->
<bean id="helloWorld" class="com.atguigu.spring.beans.HelloWorld">
</bean>
- id:Bean 的名称。
在 IOC 容器中必须是唯一的
若 id 没有指定,Spring 自动将权限定性类名作为 Bean 的名字
id 可以指定多个名字,名字之间可用逗号、分号、或空格分隔
在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用.
-
Spring 提供了两种类型的 IOC 容器实现.
BeanFactory: IOC 容器的基本实现.
ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口.
BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;
ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory无论使用何种方式, 配置文件时相同的.
4)ApplicationContext接口
</br>
-
ApplicationContext 的主要实现类:
ClassPathXmlApplicationContext:从类路径下加载配置文件
FileSystemXmlApplicationContext: 从文件系统中加载配置文件
ConfigurableApplicationContext 扩展于 ApplicationContext,新增加两个主要方法:refresh() 和 close(), 让 ApplicationContext 具有启动、刷新和关闭上下文的能力
ApplicationContext 在初始化上下文时就实例化所有单例的 Bean
WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作
5)从IOC容器中获取Bean
</br>
- 调用ApplicationContext接口的getBean()方法
</br>
三、Spring的依赖注入
</br>
Spring支持 三种 形式的依赖注入:
- 属性注入
- 构造器注入
- 工厂方法注入(基本不用)
</br>
1、属性注入
属性注入即通过** setter 方法注入Bean 的属性值或依赖的对象**
属性注入使用** <property>** 元素, 使用** name 属性指定 Bean 的属性名称,value** 属性或 <value> 子节点指定**属性值 **
属性注入是实际应用中最常用的注入方式
<bean id="helloWorld" class="com.atguigu.spring.beans.HelloWorld">
<!-- 赋值,name为属性名(必须保持一致),Value为属性值 -->
<property name="name" value="spring"></property>
</bean>
</br>
2、构造方法注入
通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。
构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中没有 name 属性
*** 必须声明相应的构造器,同时也要声明无参构造器(要养成这种习惯)***
bean中有三个属性:
private String name; // 名称
private long age; // 年龄
private boolean sex; // 性别
private String name; // 名称
private long age; // 年龄
private boolean sex; // 性别
public HelloWorld(){
System.out.println("HelloWorld's Contructor....");
}
public HelloWorld(String name,long age,boolean sex){
this.name = name;
this.age = age;
this.sex = sex;
}
<!-- 构造器注入 -->
<!-- 1、按索引匹配入参 -->
<bean id="helloWorld" class="com.atguigu.spring.beans.HelloWorld">
<constructor-arg value="xiaoxiao" index="0"></constructor-arg>
<constructor-arg value="100" index="1"></constructor-arg>
<constructor-arg value="false" index="2"></constructor-arg>
</bean>
<!-- 2、按类型匹配入参 -->
<bean id="helloWorld" class="com.atguigu.spring.beans.HelloWorld">
<constructor-arg value="xiaoxiao" type="java.lang.String"></constructor-arg>
<constructor-arg value="100" type="long"></constructor-arg>
<constructor-arg value="true" type="boolean"></constructor-arg>
</bean>