那些年我们一起着迷的Spring:接口及IOC(二)

接口及面向接口编程

接口

  • 用于沟通的中介物的抽象化。

  • 实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法。使其能被修改内部而不影响外部其他实体的与其交互的方式(对外的一种说明,说明会提供哪些功能,内部实现对外不公开)

  • 接口即声明,声明哪些方法对外提供。

  • Java8中接口可以拥有方法体(类似抽象类)

     接口:(1.8以前)只能有声明,不能有实现。(1.8)静态方法与default方法可以有方法体!
     抽象类:既可以有声明也可以有实现。(抽象方法只能声明,不能实现;非抽象方法必须实现)
     类:实现
    

面向接口编程

  • 结构设计中,分清层次及调用关系,每层只向外(上层)提供一组功能的接口,各层仅依赖接口而非实现类

  • 接口内部的实现变动不影响各层之间的调用,这一点在公共服务中尤为重要

  • “面向接口编程”中的“接口”是用于【隐藏具体的实现】和【实现多态性】的组件

IOC控制反转

控制反转:控制权的转移,应用程序本身不负责依赖对象的创建与维护,而是由外部容器负责创建和维护。
依赖注入(DI):是一种实现方式,由IOC容器在运行期间,动态的将某种依赖关系注入到对象之中
目的:创建对象并且组装对象之间的关系

这里写图片描述

获得依赖对象的过程被反转了。(不是由自己创建,而是由外部容器负责创建和维护。)【获得依赖对象的过程由自身管理变为了由IOC主动注入】
所谓依赖注入,就是IOC容器在运行期间,动态的将某种依赖关系注入到对象中。

单元测试

springIOC及Bean容器(2)

创建UnitTestBase类,完成对Spring配置文件的加载/销毁
所有的单元测试类都继承自UnitTestBase,通过它的getBean方法获取想要得到的对象
子类(具体执行单元测试的类)加注解:@RunWit(BlockJUnit4ClassRunner.class)


package com.zjx.interfaces.test;

import org.junit.After;
import org.junit.Before;
import org.springframework.beans.BeansException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils;


public class UnitTestBase {
    /**
     * 相对路径应用上下文
     */
    private ClassPathXmlApplicationContext context;

    /**
     * XML文件的存放路径
     */
    private String springXmlPath;

    public UnitTestBase() {

    }

    public UnitTestBase(String springXmlPath){
        this.springXmlPath = springXmlPath;
    }
    @Before
    public void before(){
        if (StringUtils.isEmpty(springXmlPath)) {
            springXmlPath = "classpath*:spring-*.xml";//加载spring配置文件
        }
        try {
            // xml文件用逗号或者空格符隔开,均可加载
            context = new ClassPathXmlApplicationContext(springXmlPath.split("[,\\s]+"));
            context.start();
        } catch (BeansException e) {
            e.printStackTrace();
        }
    }
    @After
    public void after(){
        context.destroy();
    }

    @SuppressWarnings("unchecked")
    protected <T extends Object> T getBean(String beanId){
        try {
            return(T)context.getBean(beanId);
        } catch (BeansException e) {
            e.printStackTrace();
            return null;
        }
    }

    protected <T extends Object> T getBean(Class<T> clazz){
        try {
            return context.getBean(clazz);
        } catch (BeansException e) {
            e.printStackTrace();
            return null;
        }
    }
}


Spring框架中都用的

设计模式

代理模式:在AOP和remoting中被用的比较多。
单例模式:在spring配置文件中定义的bean默认为单例模式。
模板方法模式:用来解决代码重复的问题。
前端控制器模式:Spring提供了DispatcherServlet来对请求进行分发。
依赖注入模式:贯穿于BeanFactory / ApplicationContext接口的核心理念。
工厂模式:BeanFactory用来创建对象的实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值