(一)IoC/DI
功能
配置解析:将配置文件解析为BeanDefinition结构,便于BeansFactory创建对象
对象创建:BeansFactory 根据配置文件通过反射创建对象,所有类对象都在一个工厂类中创建,采用反射机制动态加载类,避免代码膨胀
对象生命周期管理:在 BeanDefinition 中配置scope(每次返回新对象还是之前创建好的)、lazy-init(用到时创建还是启动时创建)属性
组成
ApplicationContext:执行入口
ClassPathXmlApplicationContext:ApplicationContext 的实现类
BeanConfigParser:将配置文件解析为 BeanDefinition
XmlBeanConfigParser:BeanConfigParser 的实现类
BeanDefinition:类的定义,包括对象 id、classname、创建配置等
BeansFactory:根据配置文件解析得到的 BeanDefinition 创建对象
RateLimiter.java:要创建的对象
RedisCounter.java:RateLImiter 的依赖类
DiDemo:主程序
beans.xml:配置文件
过程
写好要创建的类 RateLimiter
在 xml 配置文件中写明要创建的类信息
在客户端传入配置文件名 beans.xml,获取 applicationContext 对象的实例 ClassPathXmlApplicationContext
在 ClassPathXmlApplicationContext 中通过 XmlBeanConfigParser 解析配置文件,获取 BeanDefinition
通过 BeansFactory ,根据 BeanDefinition 创建目标类 rateLimiter、rediscounter 对象,及两者的依赖关系
代码
ApplicationContext
1 packagedi;2
3 public interfaceApplicationContext {4 Object getBean(String beanId);5 }
View Code
ClassPathXmlApplicationContext
1 packagedi;2
3 importjava.io.IOException;4 importjava.io.InputStream;5 importjava.util.List;6
7 public class ClassPathXmlApplicationContext implementsApplicationContext{8 privateBeansFactory beansFactory;9 privateBeanConfigParser beanConfigParser;10
11 publicClassPathXmlApplicationContext(String configLocation) {12 this.beansFactory = newBeansFactory();13 this.beanConfigParser = newXmlBeanConfigParser();14 loadBeanDefinitions(configLocation);15 }16
17 private voidloadBeanDefinitions(String configLocation) {18 InputStream in = null;19 try{20 in = this.getClass().getResourceAsStream(configLocation);21 if (in == null) {22 throw new RuntimeException(("Can not find config file: " +configLocation));23 }24
25 List beanDefinitions =beanConfigParser.parse(in);26 beansFactory.addBeanDefinitions(beanDefinitions);27 } finally{28 if(in != null) {29 try{30 in.close();31 } catch(IOException e) {32 }33 }34 }35 }36
37 @Override38 publicObject getBean(String beanId) {39 returnbeansFactory.getBean(beanId);40 }41 }
View Code
BeanConfigParser