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>

输出如下:


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • mybatis 学习笔记(四):mybatis 和 spring 的整合

    在这里我们通过原始 dao 开发和,mapper 代理开发 dao 层两种方式来举例 mybatis 和 spring 整合的操作。

    希希里之海
  • spring 学习(三):aop 学习

    3 aop底层使用动态代理实现 (1)第一种情况,有接口情况,使用动态代理创建接口实现类代理对象 (2)第二种情况,没有接口情况,使用动态代理创建类的子类代...

    希希里之海
  • mybatis 学习笔记(一):mybatis 初认识

    MyBatis是一个Java持久层框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来。mybatis 可以将 preparedStatement...

    希希里之海
  • Maven构建的Spring项目需要哪些依赖?

    用户2409797
  • Spring依赖配置详解

    说故事的五公子
  • Java——Spring整合Mybatis(IDEA版)

    该文主要教大家如何整合spring和mybatis,整合完成效果,可以从数据库中查询出学生信息:

    说故事的五公子
  • maven依赖的版本管理

    在一个项目中,这样做的必要性不大,这种机制一般用于maven项目继承,子项目可以直接使用简化的依赖配置,从而确保和父项目版本一致。

    pollyduan
  • ssm项目pom.xml必导入坐标

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    多凡
  • Spring整合Mybatis(IDEA版)

    该文主要教大家如何整合spring和mybatis,整合完成效果,可以从数据库中查询出学生信息:

    说故事的五公子
  • SSM整合所需的maven配置文件

    说故事的五公子

扫码关注云+社区

领取腾讯云代金券