1.复制xml到container/ioc下
2.B类实现序列化接口,构造函数和f1函数
A类实现序列化接口,将B类作为其成员变量,且get/set方法,执行execute方法去调用b.f1()
3.修改xml,在bean A中添加<property name="b" ref="b1"/>
4.测试使用set注入方法实例化A,调用a的execute方法,如果不执行第3步,则报空指针异常。
5.若此时添加C类,实现序列化,构造函数以及f1函数,要求A在execute方法去调用c.f1(),则A中必须修改代码
故写一个接口Service,定义f1方法
6.B和C分别实现Service接口
7.将A中的成员变量改为接口类型private Service service,execute方法则调用service.f1(),这样,只需要修改xml中
<property name="service" ref="c1"/>即为execute方法则调用了c.f1()
<property name="service" ref="b1"/>即为execute方法则调用了b.f1()

此处考察依赖注入,即在一个类中需要调用其他类的方法,那么我们需呀在xml中使用ref属性指定我们引入的其他类。当然,在xml中必须提前声明这个被引入的类。

B.class:

package container.ioc;

public class B implements Service{

public B(){
System.out.println("B的无参构造器");
}

public void f1(){
System.out.println("B的f1方法");
}
}

A.class:

package container.ioc;

public class A {

private B b;

public A() {
System.out.println("A的无参构造器");

}

public B getB() {
return b;
}

public void setB(B b) {
System.out.println("A的setB方法...");
this.b = b;
}

public void execute(){
System.out.println("A的execute方法...");
b.f1();
//service.f1();
}

}

C.class:

package container.ioc;

public class C implements Service{

public C() {
System.out.println("C的无参构造器");
}

public void f1(){
System.out.println("C的f1方法");
}

}

xml核心代码:

<!-- 容器启动之后,会检查整个配置文件,
然后将a1,b1两个对象创建好,通过调用a1的set方法来建立其与b1的依赖关系 -->
<bean id="b1" class="container.ioc.B"/>
<bean id="c1" class="container.ioc.C"/>
<bean id="a1" class="container.ioc.A">
<!-- 容器会调用a1的setB方法 -->

<property name="b" ref="b1"/>
</bean>

要理解为什么使用service接口:

Service.java:

package container.ioc;

public interface Service {

public void f1();
}

TestCase代码:

package container.ioc;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestCase {

@Test
public void test1(){

String cfg = "container/ioc/applicationContext.xml";
ApplicationContext ac =
new ClassPathXmlApplicationContext(cfg);
A a = ac.getBean("a1",A.class);
a.execute();

}

}

运行如下:

若将xml中<property name="b" ref="b1"/>这行代码去掉,则报错,空指针异常。A这个类中的属性使用到了B类,因此必须在xml中声明A的属性和B这个bean的依赖关系。

将A中的属性B改为Service接口:

package container.ioc;

public class A {

//private B b;
//尽量使用接口类型
private Service service;

public A() {
System.out.println("A的无参构造器");

}

// public B getB() {
// return b;
// }
//
// public void setB(B b) {
// System.out.println("A的setB方法...");
// this.b = b;
// }

public Service getService() {
return service;
}

public void setService(Service service) {
this.service = service;
}

public void execute(){
System.out.println("A的execute方法...");
//b.f1();
service.f1();
}

}

xml中修改如下:

<!-- <property name="b" ref="b1"/> -->

<property name="service" ref="c1"/>

运行结果如下:

若将xml改为:

<!-- <property name="b" ref="b1"/> -->

<property name="service" ref="b1"/>

即为接口的应用。要熟练掌握。

spring day01-go1的更多相关文章

  1. Spring day01笔记

    struts:web层,比较简单(ValueStack值栈,拦截器) hibernate:dao层,知识点杂 spring:service层,重要,讲多少用多少 --> [了解]   sprin ...

  2. Spring day01

    1 实例化Spring容器 新建springday01项目1.F盘jar/Spring/first/五个jar包拷贝到lib下,复制xml文件到项目first包下2.First.java测试如何启动容 ...

  3. 开放源代码的设计层面框架Spring——day01

    spring第一天     一.Spring概述         1.1spring概述             1.1.1spring介绍                 Spring是分层的Jav ...

  4. spring框架入门day01

    struts:web层,比较简单(ValueStack值栈,拦截器) hibernate:dao层,知识点杂 spring:service层,重要,讲多少用多少  --> [了解] spring ...

  5. Spring day02笔记

    spring day01回顾 编写流程(基于xml) 1.导入jar包:4+1 --> beans/core/context/expression | commons-logging 2.编写目 ...

  6. 05_ssm基础(三)之Spring基础

    11.spring入门引导 12.spring_HelloWord程序 实现步骤: 0.找到spring压缩包,并解压 1.拷贝jar包 2.添加主配置文件(官方文档约28页) 3.在测试中使用 13 ...

  7. spring框架入门day02

    0. 绪论 在第二天的学习中的学习JdbcTemplate之前,想要下载最新版本的mysql server8.0.11 结果在将所有的东西配置好后,发现报错, · Establishing SSL c ...

  8. 05_ssm基础(六)之SpringMVC

    36.springMVC之入门 1.springMVC简介 Spring MVC是基于MVC模式的一个Web框架,它解决WEB开发中常见的问题(参数接收.文件上传.表单验证.国际化.等等),而且使用简 ...

  9. [刘阳Java]_Spring相关配置介绍_第5讲

    这一节我们介绍一下Spring框架的相关常用配置 Spring依赖注入的两种方式(构造方法注入和setter方式注入) p-namespace方式配置 properties属性文件配置方式 集合对象配 ...

  10. [刘阳Java]_Spring IOC程序代码如何编写_第3讲

    第2讲我们介绍了Spring IOC的基本原理,这篇文章告诉大家Spring IOC程序代码是如何编写的,从而可以更好的理解IOC和DI的概念(所有的Java类的初始化工作扔给Spring框架,一个J ...

随机推荐

  1. Cadstar格式导入功能

    Cadstar格式导入功能   Skip to end of metadata   Attachments:4 Added by Wenlong Hua, last edited by Wenlong ...

  2. Python的运行

    1.在命令行中运行 2.使用shell(IDLE) 3.新建.py脚本 只要是编辑器都可以 4.脚本在IDLE中运行 5.在windows下的cmd下运行脚本

  3. XLAT转码:以DS:【BX+AL】为地址,提取存储器中的一个字节再送入AL

    data segment a db ,,,,,,,, b dw ;sum of a table db 11h,22h,33h,44h,55h,66h,77h,88h,99h ends code seg ...

  4. dom classList

    才发现dom对象就有classList属性,通过它可以判断该dom是否有指定的class名存在. var tar = e.target; var classList = tar.classList; ...

  5. C# 时间与时间戳互转 13位

    /// <summary> /// 将c# DateTime时间格式转换为Unix时间戳格式 /// </summary> /// <param name="t ...

  6. windows server 2008服务器IIS绑定阿里云域名

    一.打开Internet 信息服务(IIS)管理器   二.将你的网站放到服务器目录下,比如D盘下的WWW文件夹.   三.在IIS中,添加网站,网站的物理路径指向第二部中创建的网站.   五.在绑定 ...

  7. iOS Architecture和Valid architectures

    目前ios的指令集有以下几种: 1,armv6,支持的机器iPhone,iPhone2,iPhone3G及对应的iTouch 2,armv7,支持的机器iPhone4,iPhone4S 3,armv7 ...

  8. :first与:first-child的区别

    说的简单,:first表示单个元素,:fisrt-child表示的多个元素(集合). 如果追求深一点的话, 1.$(:first).css()表示全局或局部全局的第一个,也就是表示单个元素 2.$(: ...

  9. scp与rsync限速

    一/scp限速1M #scp -l 1000 文件名 账号@远程机器IP此时的传输速率就是1M/8=100K左右 二/rsync是(限制为 100k Bytes/s): #rsync -auvzP-- ...

  10. 第二篇 SQL Server代理作业步骤和子系统

    本篇文章是SQL Server代理系列的第二篇,详细内容请参考原文. SQL Server代理作业由一系列的一个或多个作业步骤组成.一个作业步骤分配给一个特定的作业子系统(确定作业步骤去完成的工作). ...