zoukankan      html  css  js  c++  java
  • 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"/>

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

  • 相关阅读:
    SpringRMI解析3-RmiServiceExporter逻辑细节
    SpringRMI解析2-RmiServiceExporter逻辑脉络
    SpringRMI解析1-使用示例
    SpringMVC解析5-DispatcherServlet逻辑细节
    SpringMVC解析4-DispatcherServlet逻辑脉络
    SpringMVC解析3-DispatcherServlet组件初始化
    SpringMVC解析2-ContextLoaderListener
    算法笔记_074:子集和问题(Java)
    算法笔记_073:哈密顿回路问题(Java)
    算法笔记_072:N皇后问题(Java)
  • 原文地址:https://www.cnblogs.com/lchzls/p/5769461.html
Copyright © 2011-2022 走看看