一、Spring是什么
Spring是用来处理对象的创建、以及对象之间依赖关系的一个开发框架。它打破了我们传统开发的观念,我们不再需要像以前那样在具体的类中创建具体的对象,而是将对象的创建交给它去完成。Spring框架可以和其他框架一起整合使用,如hibernate、mybatis等。
1.1 Spring的框架图
1)SpringCore:是Spring的核心功能:IOC容器,解决对象创建及依赖关系。(本篇文章主要介绍这个)
2)SpringWeb:Spring对web模块的支持。
3)Spring DAO:是Spring对Jdbc操作的支持。
4)Spring ORM:是Spring对ORM的支持。
5)SpringEE:Spring对javaEE其它模块的支持。
6)Spring AOP:(这个还不是很理解 之后补充)。
1.2 控制反转(Inversion On Control)
控制反转简称IOC,对象的创建交给外部容器自动完成,这个就叫做控制反转。在Spring中,我们可以通过<bean>标签(也可以通过注解)把对象注册到Spring的IOC容器中,然后需要这个对象的时候就交给Spring的IOC容器去创建(一般用注解创建)。
1.3 依赖注入(Dependency Injection)
依赖注入简称DI,用于处理对象之间的依赖关系。例如我们在Spring的IOC容器中通过<bean>标签注册了一个自定义类,这时候我们又想再注册另一个类,这个类的成员变量是我们之前注册的自定义的类,那么我们就可以通过依赖注入把自定义类和这个类关联起来。
二、Spring怎么用
先来一个简单的实例:
2.1 导包
我用的maven所以直接在pom.xml文件中导入了spring所需的依赖:
依赖的代码:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--引入spring核心依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<!--spring test相关依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
</dependencies>
2.2 然后创建文件夹:
上图红框2表示要创建的文件夹,然后右键resource->Build Path->Use as Source Folder (如红框1)
2.3 springContext.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"
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.xsd">
</beans>
导入头文件(spring官网有)
2.4 写一个User类:
2.5 在springContext.xml 文件中注册User:
2.6 写个测试类测试一下:
结果:
以上通过一个很简单的例子我们可以看到springIOC的功能,即把我们自己定义的类注册到spring容器中,然后在需要它的时候通过容器去装载而不用我们手动去new一个。接下来对spring的对象创建和依赖关系做详细讲解。
三、IOC容器深入理解
Spring IOC容器,是Spring的核心内容,用于创建对象和处理对象间的依赖关系,一般用xml文件声明。
先来解释一下<bean>标签。<bean>标签在springIOC容器中其实就是代表着对象类,java中的类可以通过<bean>标签注册到springIOC容器中。
3.1 <bean>标签中的属性说明:
- id:表示对象在springIOC容器中的唯一标识。
- class :表示对应关联的java类,要写类的全限定名。
- scope:有两个选择 1."prototype" 2."singleton" 。当scope="prototype"时 表示多例,即每次我们通过IOC容器创建的java对象都是不一样的,当scope="singleton"时 表示单例,即每次我们通过IOC容器创建的java对象都是同一个。scope属性默认为singleton。
lazy-init:
延迟初始化bean对象,默认值为false,即不延迟创建bean对象,在程序启动时就在IOC中创建bean对象;若其值为true则延迟创建bean对象,即在我们需要对象时才在IOC容器中创建该对象。此属性只对单例bean对象有效。- 2.
init-method:
可以给该属性传递一个在pojo对象中创建的方法例如A方法的方法名A作为init-method的属性值,表示当该pojo对象在IOC容器中被创建后就立刻执行这个A方法。 - 3.
destoy-method:
同上,给该属性传递一个在pojo对象中创建的方法例如B方法的方法名B作为destoy-method的属性值,表示当IOC容器被销毁时(该pojo对象也会在IOC中销毁)会立刻调用这个B方法。
3.2 IOC容器中对象的创建
利用IOC容器创建对象的方式有以下几种:1.调用无参数构造器。2.调用带参数构造器。3.工厂创建对象。包括工厂类的静态方法创建对象和工厂类的非静态方法创建对象。
3.2.1 调用无参构造器
3.2.2 调用带参构造器
<constructor-arg> 标签还有一个ref属性,可以指向IOC容器中的对象, 如下:
3.2.3 工厂创建对象
先创建工厂类:
- 用工厂类的静态方法创建User对象
- 用工厂类的非静态方法创建User对象
3.3 通过注解的方式在SpringIOC容器中注册对象
前面我们都是通过<bean>标签来在IOC容器中注册对象,这里来介绍一个超级方便的方法,即用注解来注册对象,
步骤:
1.先引入context名称空间
2.开启注解扫描
3.使用注解:通过注解的方式,把对象加入到IOC容器中。
- 首先在IOC配置文件中引入context名称空间,即在
<beans>
全局标签中添加xmlns:context="http://www.springframework.org/schema/context"
属性。
即:
- 开启注解扫描:
- 通过注解的方式注入:
在之前定义的User类上加上@Component("user")注解 在容器配置文件中就不用<bean>去注册了
说明:利用@Compenent注解的方式是通用的将对象加入到IOC容器中的方式,而有时候我们需要区别各层对象添加的方式,所以这里我们将Dao层对象添加到IOC容器的注解方式改为:@Repository表示持久层的组件;修改Service层对象添加到IOC容器的注解方式:@Service表示业务逻辑层的组件;修改Servlet层对象添加到IOC容器的注解方式为:@Controller表示控制层的组件。
3.4 处理对象的依赖关系
在IOC容器的配置文件中有5种给对象注入属性的方法:1.通过构造方法。2.通过set方法给属性注入值。3.p名称空间。4.自动装配。5.注解。这里主要讲解第1、2、5中方法。
3.4.1 通过构造方法注入属性
3.4.2 通过set方法注入属性
value也可以用ref代替 引用IOC容器中的其他对象
3.4.3 通过注解方式在java类中注册属性
用@Autowired注解 可以根据对象的类型自动装配,如: