23.3. 依赖注入实现

创建松耦合、基于配置的程序

Java反射机制能够在运行时动态加载类,而不是在编译期。 在一些框架开发中经常将要实例化的类名保存到配置文件中,在运行时从配置文件中读取类名字符串,然后动态创建对象,建立依赖关系 。采 用new创建对象依赖关系是在编译期建立的,反射机制能够将依赖关系推迟到运行时建立,这种依赖 关系动态注入进来称为依赖注入

config.txt

com.a52work.Discourse75

Discourse.java

package com.a52work;

public interface Discourse {
    public int getDiscourse();         //折扣的变量
}

Discourse75.java

package com.a52work;

public class Discourse75 implements Discourse{
    // 继承接口,返回75折
    @Override
    public int getDiscourse() {
        return 75;
    }
}

Discourse85.java

package com.a52work;

public class Discourse85 implements Discourse {
    // 继承接口,返回85折
    @Override
    public int getDiscourse() {
        return 85;
    }
}

Person.java

package com.a52work;

public class Person {
    private double price = 80.0;

    public void buy(Discourse d) {
        System.out.println("当前折扣:" + d.getDiscourse());
        System.out.println("原价:"+ price);
        System.out.println("折后价:" + price*d.getDiscourse()/100);
    }
}

Test.java

package com.a52work;

import java.io.BufferedReader;
import java.io.FileReader;

public class Test {
    public static void main(String[] args) throws Exception {

        Person p1 = new Person();
   /* Discourse d = new Discourse75();
       Discourse d1 = new Discourse85();*/

        BufferedReader br = new BufferedReader(new FileReader("D:\\Java_Study/Day26/src/com/a52work/config.txt"));
        String line = br.readLine();
        Class cls = Class.forName(line);
        Discourse d = (Discourse) cls.newInstance();
        p1.buy(d);
        System.out.println("-----------");
        //p1.buy(d1);

    }
}