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. nrf51822-使用16位自定义UUID

    以 ble_app_uart为例 工程中创建的nus服务以及其中的两个特性值都是128位的UUID.nordic sdk中使用128位UUID的方式和标准128UUID类似,它是提供一个基准UUID, ...

  2. 如何在Qt 4程序中优化布局结构(表格讲解,很清楚)

    原文地址:http://blog.csdn.net/qter_wd007/archive/2010/03/13/5377882.aspx 在迄今为止讲到每一个例子中,我们只是简单的把窗口部件放置到某个 ...

  3. 搭建PHP环境LAMP(Linux+Apache+MySQL+PHP)

     1.安装Apache yum -y install httpd 用/etc/init.d/httpd start 启动apache apache默认的程序目录是/var/www/html 2.安装M ...

  4. 各个JSON技术的比较

    JSON技术的调研报告 一 .各个JSON技术的简介和优劣1.json-libjson-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括com ...

  5. UITextView打开文字中的URL

    1. 背景介绍 UITextView里显示的文字带有url,点击url可以打开对应的网页,可以分两种打开方式:(1)在App内打开url:(2)用safari打开url. 2. 实现代码: (1)声明 ...

  6. 浏览器获取ip地址

    /** * 获取浏览器的ip地址 * @param request * @return */ public static String getIP(HttpServletRequest request ...

  7. Java冒泡排序,Java对象冒泡排序

    今天呆公司特别无聊,百度了一下Java机试题,看到一个冒泡排序. 粘上我全部的代码: 实体类: package accp.com.internet;/** * 人物类 * @author xuxiao ...

  8. Fiddler-005-获取 Cookie 信息

    随着网络安全(例如:登录安全等)要求的不断提升,越来越多的登录应用在登录时添加了验证码登录,而验证码生成算法也在不断的进化,因而对含登录态的自动化测试脚本运行造成了一定程度的困扰,目前解决此种问题的方 ...

  9. hexo 搭建博客

    使用hexo搭建网站.记录一下. hexo搭建方法: https://wsgzao.github.io/post/hexo-guide/ http://jacob110.github.io/2015/ ...

  10. Javascript对象、Jquery扩展简单应用

    Javascript对象,表现方式一: person = new Object(); person.firstname = "An"; person.lastname = &quo ...