Spring IOC
Spring IOC
最近在复习 Spring,重新看了一下 IOC 这部分,整理分享出来。
什么是 spring
spring 是一站式框架,主要包括以下几个方面:
-
web 层:springMVC
-
业务层:事务管理,bean 管理
-
持久层:JDBC模板,或者使用其他的 ORM 框架
spring 特性
方便解耦,简化开发
spring 就是一个大工厂,可以将所有对象创建和依赖关系维护,交给 spring 管理。
AOP 编程的支持
spring 提供面向切面编程,可以方便的实现对程序进行权限拦截,运行监控等功能。
声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
方便程序的测试
spring 对 junit4 支持,可以通过注解方便的测试 spring 程序。
IOC(Inverse of Control)
在讲 IOC 前,我们先来看一下开发的演变:
当我们面向接口编程,创建完接口和实现类后,发现实现类跟接口类之间存在耦合(牵一发而动全身),后来使用工厂模式,类的创建交给工厂类完成,这样实现类又与工厂有耦合,最后采用工厂+反射+配置文件的模式。(工厂类里面的 getBean 方法根据 id 参数返回实例对象,通过反射创建实例。)
所以,IOC 简单的来说就是:将原本在程序中手动创建实现类对象的控制权,交由 spring 框架管理,即创建实现类对象控制权被反正到了 spring框架。
DI(Dependecy Injection)
在讲到 IOC 时,往往也会引出 DI,那么两者有什么区别呢?先看 DI 的概念:
DI:依赖注入的概念,就是在Spring创建这个对象的过程,将这个对象所依赖的属性注入进去。
所以 DI 是依赖于 IOC 的,也就是说要先有 IOC,才能有 DI。
实例
我们使用 IntelliJ IDEA 来演示一个快速入门案例。
1. 创建 maven 模板
打开 idea,选中 maven,在 maven 模板中选择创建一个简单的 web 模板,设置 groupId,artifactId,maven 版本等,然后点击 finish,完成创建。
2. 导入 maven
<!-- spring 基本包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
3. 新建一个 java 接口文件
package com.test.ioc.demo1;
public interface UserService {
public void sayHello();
}
4. 新建一个 java 接口的实现类
package com.test.ioc.demo1;
public class UserServiceImpl implements UserService{
// 添加属性
private String name;
public void sayHello() {
System.out.println("hello spring" + name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5. 编写 spring 核心配置文件(放在 resources 下)
<?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">
<!-- UserService 的创建权交给了 Spring -->
<bean id="userService" class="com.test.ioc.demo1.UserServiceImpl">
<!-- 设置属性 -->
<property name="name" value="李四"></property>
</bean>
</beans>
6. 在程序中读取 spring 配置文件,通过 spring 框架获得 Bean,完成相应操作
package com.test.ioc.demo1;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringDemo1 {
@Test
/**
* Spring 方式实现
*/
public void demo1() {
// 创建 Spring 的工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过工厂获得类
UserService userService = (UserService) applicationContext.getBean("userService");
userService.sayHello();
}
}
这里我们导入 junit4 的 maven 依赖,直接在测试用例中通过 ```@Test```` 注解的方式,测试 spring 程序。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
输出如下: