package com.learn.spring;
/**
* 这个Factory模拟Spring,我把它改成interface
* Spring的意思是这样的,当你拿到任何的具体的子类的时候,
*
* @author Leon.Sun
*
*/
public interface BeanFactory {
/**
* 它里面有一个方法叫做getBean
* 每个bean有自己的一个名字
*/
Object getBean(String id);
}
package com.learn.spring;
/**
* 作为Car来说,他实现了Moveable接口,
* Moveable里面有一个run,
* @author Leon.Sun
*
*/
public class Car implements Moveable {
public void run() {
System.out.println("冒着烟奔跑中car......");
}
}
package com.learn.spring;
public interface Moveable {
void run();
}
package com.learn.spring;
import java.util.Properties;
public class Test {
public static void main(String[] args) throws Exception {
/**
* 在java.util里面有一个Propertie
* 总而言之这个Properties是读配置文件的
*/
Properties props = new Properties();
/**
* 我们需要的是一个InputStream,这个InputStream怎么读,
* 由于我现在把Spring.properties是放在source里面,
* 所以他编译之后会放在bin里面,也就是会放在项目的classpath里面,
* 总而言之你要知道他可以把配置文件读出来,先学脉络,load什么?
* 站在Java虚拟机的角度,每一个class的类load到内存之后,
* 都会当成一个Class对象,getClassLoader就拿到装载这个对象那个类装载器
* 然后他有一个方法getResourceAsStream,这句话是说你把这个文件当做InputStream
* 也就是当做可以读进来的流来给他拿过来,注意他的类路径在根上,你要写清楚了
* 把这个文件当做InputStream,把它转换成一个Properties对象,
* 转换成对象之后,他这个文件里面缩写的配置文件的信息,VehicleType这个就会被称之为key,
* com.learn.spring.Car这个就被称之为value
*
* 如果我想改成别的产品简单,比如我改成Train,我只要改这么一个地方
* 就变成小火车..... 你发现我只要直接改配置文件,我从配置文件拿到的具体的类型就已经发生了改变
*
*/
props.load(Test.class.getClassLoader().getResourceAsStream("com/learn/spring/spring.properties"));
/**
* 他的类的名字
* 左边的那个是key,
* 如果你看的还是不太清就打印一下
*/
String vehicleTypeName = props.getProperty("VehicleType");
/**
* com.learn.spring.Car
* 你可以发现这样可以读取配置文件的信息
* 读到这个信息之后,注意我拿到的是一个字符串,
* 我想把这个字符串所代表的这个类给他产生一个新对象出来,
* 我们要用到JAVA的反射机制
*/
System.out.println(vehicleTypeName);
/**
* Class.forName的意思是把这个字符串所代表的这个类给他load到内存,
* 大家知道JAVA的程序要想运行,首先会把Class文件load到内存,装载到内存,
* 装载到内存只是把Class文件装载到内存,但是他并没有产生这个类的对象,
* 产生这个类的对象用newInstance,会调用他参数为空的构造方法,
* 所以你只要保证这个参数为空的构造方法就行了,这时候它会产生一个新对象
* 产生的新对象是Object类型,你要想用的话把他强制转化为Moveable类型
*/
Object o = Class.forName(vehicleTypeName).newInstance();
/**
* 把他强制转换为Moveable类型
*/
Moveable m = (Moveable)o;
m.run();
/**
* Spring的意思是说,你不要再new这个Car了
* 具体new什么你写在配置文件里面吧
* 你要想new Car就new Car,想new别的就new别的
* Car和Train实现了Moveable接口,
* 就不要在这里new了,我们能不能写在配置文件里面,
* 答案是可以的,我先写一种配置文件,JAVA里面有一种最常见的配置文件
* 在Test里面我new什么是根据配置文件来定的,这就不行了吗,
* 这个东西具体怎么写,
*/
// Moveable m = new Car();
// m.run();
}
}
package com.learn.spring;
public class Train implements Moveable {
@Override
public void run() {
System.out.println("小火车....");
}
}
VehicleType=com.learn.spring.Train