spring day01-go1
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的更多相关文章
- Spring day01笔记
struts:web层,比较简单(ValueStack值栈,拦截器) hibernate:dao层,知识点杂 spring:service层,重要,讲多少用多少 --> [了解] sprin ...
- Spring day01
1 实例化Spring容器 新建springday01项目1.F盘jar/Spring/first/五个jar包拷贝到lib下,复制xml文件到项目first包下2.First.java测试如何启动容 ...
- 开放源代码的设计层面框架Spring——day01
spring第一天 一.Spring概述 1.1spring概述 1.1.1spring介绍 Spring是分层的Jav ...
- spring框架入门day01
struts:web层,比较简单(ValueStack值栈,拦截器) hibernate:dao层,知识点杂 spring:service层,重要,讲多少用多少 --> [了解] spring ...
- Spring day02笔记
spring day01回顾 编写流程(基于xml) 1.导入jar包:4+1 --> beans/core/context/expression | commons-logging 2.编写目 ...
- 05_ssm基础(三)之Spring基础
11.spring入门引导 12.spring_HelloWord程序 实现步骤: 0.找到spring压缩包,并解压 1.拷贝jar包 2.添加主配置文件(官方文档约28页) 3.在测试中使用 13 ...
- spring框架入门day02
0. 绪论 在第二天的学习中的学习JdbcTemplate之前,想要下载最新版本的mysql server8.0.11 结果在将所有的东西配置好后,发现报错, · Establishing SSL c ...
- 05_ssm基础(六)之SpringMVC
36.springMVC之入门 1.springMVC简介 Spring MVC是基于MVC模式的一个Web框架,它解决WEB开发中常见的问题(参数接收.文件上传.表单验证.国际化.等等),而且使用简 ...
- [刘阳Java]_Spring相关配置介绍_第5讲
这一节我们介绍一下Spring框架的相关常用配置 Spring依赖注入的两种方式(构造方法注入和setter方式注入) p-namespace方式配置 properties属性文件配置方式 集合对象配 ...
- [刘阳Java]_Spring IOC程序代码如何编写_第3讲
第2讲我们介绍了Spring IOC的基本原理,这篇文章告诉大家Spring IOC程序代码是如何编写的,从而可以更好的理解IOC和DI的概念(所有的Java类的初始化工作扔给Spring框架,一个J ...
随机推荐
- PDO知识
PDO: 一.含义: 数据访问抽象层 二.作用 :通过PDO能够访问其它的数据库 三. 用法: 1.造对象 ①$dsn="mysql:dbname=zz;host=localhost&quo ...
- mssql 常用SQL语句或函数
按 OrderDate 的顺序计算 SalesOrderHeader 表中所有行的行号,并只返回行 50 到 60(含). WITH OrderedOrders AS ( SELECT SalesOr ...
- zepto源码--几个判断函数--学习笔记
几个需要经常用到的类型判断: 自定义一个类似于typeof的函数,提供更多的类型判断. class2type[toString.call(obj)] 是对class2type的取值 在后面通过循环对c ...
- 实战案例:DIV嵌套
缘于页面结构语义化的考虑,我们应该慎用div和span这两个通用元素,只有当划分页面结构模块时才使用div元素,因为模块本身是没有任何语义的,他仅代表一块独立的结构.如果想对段落内部分内联元素或文本应 ...
- imx6 mac地址设置
imx6的mac地址总是固定的值,所以需要更改,采用的方法是在uboot中设置环境变量,之后在kernel中使用uboot中设置的mac地址的值.本文记录更改的过程. 参考链接: http://www ...
- Shell数组例子
Shell数组例子 循环打印数组,并统计数组的个数: [root@slavedb array]# cat a.sh #!/bin/bash array=( freddy freddie tang sh ...
- python之map、filter、reduce、lambda函数
map map函数根据提供的函数对指定的序列做映射,定义:map(function, sequence[,sequence,...])--->list 例1 >>> map(l ...
- postgress Sql数据库的复制
1.保证本地可正常执行pg_dump,即就是本地有安装postgress数据库,最好把bin目录添加到环境变量path中2.在命令行中执行如下语句: pg_dump -U zhangsan -h 19 ...
- MagicNotes:自我管理中的破窗效应
MagicNotes,思绪随风飞扬,偶尔在这里停留. 在<程序员修炼之道——从小工到专家>这本书里,有这么一段描述: 在市区,有些建筑漂亮而整洁,而另一些却是破败不堪的“废弃船只”.为什么 ...
- 详解 ASP.NET并行,异步,多线程
最近在学习.net4以上版本新特性的时候,发现在异步这方面提供了很多好玩的.以下Mark 2篇好文,温故而知新! http://www.cnblogs.com/wisdomqq/archive/201 ...