spring day01-go1

时间:2023-03-11 16:25:56

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中必须提前声明这个被引入的类。

spring day01-go1

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();

}

}

运行如下:

spring day01-go1

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

spring day01-go1

将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"/>

运行结果如下:

spring day01-go1

若将xml改为:

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

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

spring day01-go1

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