专题一 IoC

  • 接口及面向接口编程
  • 什么是 IoC
  • Spring 的Bean配置
  • Bean 的初始化
  • Spring 的常用注入方式

接口

  • 用于沟通的中介物的抽象化
  • 实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的方式
  • 对应 Java 接口即声明了哪些方法是对外公开提供的
  • 在 Java8 中,接口可以拥有方法体

面向接口编程

  • 结构设计中,分清层次及调用关系,每层只向外(上层)提供一组功能接口,各层间仅依赖接口而非实现类
  • 接口实现的变动不影响各层间的调用,这一点在公共服务中尤为重要
  • “面向接口编程” 中的 “接口” 是用于隐藏具体实现和实现多态性的组件

什么是IoC

  • IoC :控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护
  • DI (依赖注入)是其一种实现方式, IoC 的别名
  • 目的:创建对象并且组装对象之间的关系

扩展理解

  2004年, Martin Fowler 探讨了同一个问题,既然 IoC 是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理对象变为由 IoC 容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection,DI)”。他的这个答案,实际上给出了实现 IoC 的方法:注入。所谓依赖注入,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。

IoC房屋中介

  房屋中介         IoC

  1. 找中介     ----> 1. 找IoC容器

  2. 中介介绍房子  ----> 2. 找IoC容器

  3. 租房、入住   ----> 3. 使用对象

自从有了IoC之后

  • 不必自己创建对象了
  • IoC机制就提供了
  • 面向接口编程了
  • IoC藏实现了
  • 不管对象了
  • IoC管了
  • 变好了
  • IoC

单元测试

  • 下载 junit-*.jar 并引入工程
  • 创建 UnitTestBase 类,完成对 Spring 配置文件的加载、销毁
  • 所有的单元测试类都继承自 UnitTestBase ,通过它的 getBean 方法获取想要得到的对象
  • 子类(具体执行单元测试的类)加注解: @RunWith(BlockJUnit4ClassRunner.class)
  • 单元测试方法加注解: @Test
  • 右键选择要执行的单元测试方法执行或者执行一个类的全部单元测试方法

UnitTestBase 类

package com.imooc.test.base;

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; private String springXmlpath; public UnitTestBase() {} public UnitTestBase(String springXmlpath) {
this.springXmlpath = springXmlpath;
} @Before // Test 执行前执行
public void before() {
if (StringUtils.isEmpty(springXmlpath)) {
springXmlpath = "classpath*:spring-*.xml";
}
try {
context = new ClassPathXmlApplicationContext(springXmlpath.split("[,\\s]+"));
context.start();
} catch (BeansException e) {
e.printStackTrace();
}
} @After // Test 执行结束后执行
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-ioc.xml

<?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" > <bean id="oneInterface" class="com.imooc.ioc.interfaces.OneInterfaceImpl"></bean> </beans>

测试类

package com.imooc.test.ioc.interfaces;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import com.imooc.ioc.interfaces.OneInterface;
import com.imooc.test.base.UnitTestBase; @RunWith(BlockJUnit4ClassRunner.class)
public class TestOneInterface extends UnitTestBase { public TestOneInterface() {
super("classpath*:spring-ioc.xml");
} @Test
public void testSay() {
OneInterface oneInterface = super.getBean("oneInterface");
oneInterface.say("This is a test.");
} }

输出结果

Bean容器初始化

  • 基础:两个包
      - org.springframework.beans
      - org.springframework.context
      - BeanFactory 提供配置结构和基本功能,加载并初始化 Bean
      - ApplicationContext 保存了 Bean 对象并在 Spring 中被广泛使用
  • 方式,ApplicationContext
      - 本地文件(绝对路径 xml 文件)
      - Classpath(相对路径 xml 文件)
      - Web 应用中依赖 servlet 或 Listener

文件

FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("D:/workspace/appcontext.xml");

Classpath

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-context.xml");

Web应用

    <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

本文出自:艺意

Ioc及Bean容器(三)的更多相关文章

  1. Spring学习二----------IOC及Bean容器

    © 版权声明:本文为博主原创文章,转载请注明出处 接口 用于沟通的中介物的抽象化 实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的 ...

  2. Spring——IOC与Bean容器

    [IOC] (1)IOC:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护.也就是说由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中 (2)DI: ...

  3. IOC及Bean容器

    1. 接口及面向接口编程 1.1. 接口 用于沟通的中介物的抽象化 实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的方式 对应JA ...

  4. Spring课程 Spring入门篇 2-1 IOC和bean容器

    课程链接: 本节讲了5部分内容,6为项目demo: 1 接口及面向接口编程 2 什么是IOC 3 Spring的bean配置 4 Bean的初始化 5 Demo 自己理解: 1 高层模块和底层模块都依 ...

  5. IOC和bean容器

  6. Spring 框架 详解 (三)-----IOC装配Bean

    IOC装配Bean: 1.1.1 Spring框架Bean实例化的方式: 提供了三种方式实例化Bean. * 构造方法实例化:(默认无参数) * 静态工厂实例化: * 实例工厂实例化: 无参数构造方法 ...

  7. Spring容器装配Bean的三种方式

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  8. Spring中三个重要概念 IOC AOP Bean

    Spring中三个重要概念 IOC AOP Bean 首先讲解一下Spring框架,以及为什么要使用Spring 框架? spring 是一个很好的容器框架, 是轻量级的IoC和AOP的容器框架,主要 ...

  9. Spring框架---IOC装配Bean

    IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicat ...

随机推荐

  1. 运用SharedPreferences“偷取”输入的信息

    运用SharedPreferences"偷取"输入的信息 本次的任务是 利用SharedPreferences来完成信息的保存和读取 就是你输入什么 手机就可以把输入的内容&quo ...

  2. 【竞价网站绝技】根据访客ip,页面显示访客所属城市的html代码(借用YY IP地址库)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 1003 Emergency Dijkstra

    这题做的心很累,我用的还是 1018的思路做的,但是 使用dfs 求最大人数对于某些有问题(现在也不知道错哪了), 看了别人的代码后才发现,其实完全不用这么麻烦,只需设置一个点的权重,一遍DJ(自创简 ...

  4. intent和手势探测

    一.三种启动方法 setComponent ComponentName comp = new ComponentName( this, SecondActivity.class); Intent in ...

  5. 回顾django内容

    回顾: 1 HTTP协议:(重点) -请求 -请求首行 -GET /index HTTP/1.1 -请求头部(在django框架中,可以从META中取出来) -key:value------>\ ...

  6. VC6 LINK : fatal error LNK1168: cannot open Debug/Test.exe for writing

    在使用VC++运行程序时,第一次没有任何问题,但是当再次运行时就会出现:LINK : fatal error LNK1168: cannot open Debug/Test.exe for writi ...

  7. python_flask框架学习之路(1)

    1.初识web,了解utl . 术语: scheme://host:port/path?query-string=xxx#yyyy 例子:https://i.cnblogs.com/EditArtic ...

  8. noip第26课资料

  9. C# WebAPI系列(2)

    上篇中简单介绍了一下WebApi,本章主要介绍一下Controller相关的知识. 在实际应用中,Controller是WebAPI的链接服务器和客户端的窗口.Controller的好坏影响整个系统的 ...

  10. 03 of learning python

    01 input输入的是str类型 如果输入的是数字的话,要记得强制转换一下! 02 isdigit() 这个方法是用来检测字符串是否全部由数字组成 str.isdigit() 如果字符串只包含数字则 ...