Spring IOC

Posted weixuqin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>

输出如下:

技术图片


以上是关于Spring IOC的主要内容,如果未能解决你的问题,请参考以下文章

Spring之IOC原理及代码详解

Spring IOC源代码具体解释之整体结构

Spring 框架学习——IOC思想原型及实质

Spring IOC源代码具体解释之容器依赖注入

[Spring 源解系列] 重温 IOC 设计理念

Spring IoC