• 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>
    

    输出如下:


  • 相关阅读:
    MyBatis之启动分析(一)
    通俗算法教程03
    数学倒底有没有绝对的严格性和形式化?
    通俗算法教程02
    .NET Core 中正确使用 HttpClient 的姿势
    通俗算法教程01
    我要写一篇文章吗?
    [ASP.NET MVC 小牛之路]18
    [ASP.NET MVC 小牛之路]17
    [ASP.NET MVC 小牛之路]16
  • 原文地址:https://www.cnblogs.com/weixuqin/p/10984286.html
Copyright © 2020-2023  润新知