Spring架构学习(1)编码实现依赖注入
来源:互联网 发布:资本结构优化 编辑:程序博客网 时间:2024/06/14 15:51
本示例通过生产者和消费者的例子演示如何通过普通编码实现spring的依赖注入
首先编写商品类、生产者、消费者代码如下
package my.spring.pojo;public class Product {public int serialno;public String name;public Product(int id){setSerialno(id);setName("product"+id);}public int getSerialno() {return serialno;}public void setSerialno(int serialno) {this.serialno = serialno;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
package my.spring.pojo;import java.util.List;public class Producer {private static int counter=0;private int id;public Producer(int id){this.id=id;}public int getId() {return id;}public void setId(int id) {this.id = id;}public void produce(List<Product> products){this.counter++;Product product=new Product(counter);products.add(products.size(),product);System.out.println("producer:product"+counter+" current size:"+products.size());}}
package my.spring.pojo;import java.util.List;public class Consumer {private int id;public Consumer(int id){this.id=id;}public int getId() {return id;}public void setId(int id) {this.id = id;}public void consume(List<Product> products){if(products!=null && products.size()>0){Product product=products.get(0);System.out.println("consumer:product"+product.getSerialno()+" current size:"+products.size());products.remove(0);}}}
然后需要一个调度者统一管理生产者、消费者以及产品队列,因此需要将生产者、消费者注入调度者中
package my.spring.pojo;import java.util.ArrayList;import java.util.List;public class Dispatcher {private Producer producer;private Consumer consumer;private static List<Product> products;public Dispatcher(){this.products=new ArrayList<Product>();}public Dispatcher(Producer producer,Consumer consumer){this.producer=producer;this.consumer=consumer;this.products=new ArrayList<Product>();}public void setProducer(Producer producer) {this.producer = producer;}public void setConsumer(Consumer consumer) {this.consumer = consumer;}public void dispatch(){Thread thread1=new Thread(){public void run(){while(true){producer.produce(products);try {int ms=(int) (Math.random()*1000);sleep(ms);} catch (InterruptedException e) {e.printStackTrace();}}};};Thread thread2=new Thread(){public void run(){while(true){consumer.consume(products);try {int ms=(int) (Math.random()*500);sleep(ms);} catch (InterruptedException e) {e.printStackTrace();}}}};thread1.start();thread2.start();thread1.run();thread2.run();}}
然后就要写实现类了
package my.spring.demo;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.config.ConstructorArgumentValues;import org.springframework.beans.factory.support.AbstractBeanDefinition;import org.springframework.beans.factory.support.BeanDefinitionRegistry;import org.springframework.beans.factory.support.DefaultListableBeanFactory;import org.springframework.beans.factory.support.RootBeanDefinition;import my.spring.pojo.Consumer;import my.spring.pojo.Dispatcher;import my.spring.pojo.Producer;public class CodeImpl {public void run(){//Producer producer=new Producer(101);//Consumer consumer=new Consumer(24);////Dispatcher dispatcher=new Dispatcher(producer, consumer);//dispatcher.dispatch();DefaultListableBeanFactory beanRegistry=new DefaultListableBeanFactory();BeanFactory container=bindViaCode(beanRegistry);Dispatcher dispatcher=(Dispatcher)container.getBean("dispatcherA");dispatcher.dispatch();}public static BeanFactory bindViaCode(BeanDefinitionRegistry registry){//设置生产者和消费者的构造器参数ConstructorArgumentValues productArgumentValues=new ConstructorArgumentValues();productArgumentValues.addIndexedArgumentValue(0,101);ConstructorArgumentValues consumerArgumentValues=new ConstructorArgumentValues();consumerArgumentValues.addIndexedArgumentValue(0,28);AbstractBeanDefinition producer=new RootBeanDefinition(Producer.class,productArgumentValues,null);AbstractBeanDefinition consumer=new RootBeanDefinition(Consumer.class,consumerArgumentValues,null);AbstractBeanDefinition dispatcher=new RootBeanDefinition(Dispatcher.class);registry.registerBeanDefinition("producerA", producer);registry.registerBeanDefinition("consumerA", consumer);registry.registerBeanDefinition("dispatcherA", dispatcher);//通过构造器注入参数ConstructorArgumentValues argumentValues=new ConstructorArgumentValues();argumentValues.addIndexedArgumentValue(0, producer);argumentValues.addIndexedArgumentValue(1, consumer);dispatcher.setConstructorArgumentValues(argumentValues);//通过setter方法注入//MutablePropertyValues propertyValues=new MutablePropertyValues();//propertyValues.addPropertyValue("producer", producer);//propertyValues.addPropertyValue("consumer", consumer);return (BeanFactory) registry;}}
通过单元测试运行可得
现对几个主要的类作简要说明:
例子中BeanFactory、BeanDefinationRegistry、DefaultListableBeanFactory的关系为
1、BeanDefination:定义的一个类实例(顶层接口),其中包含了属性(property)、构造器(constructor)等具体实现,为实现属性等元数据修改提供统一接口;
从包含的方法可知其定义了各种set和get类基本属性(类名、父类名、抽象、单例、延迟加载、描述、依赖、源定义类等等),功能十分强大。其直接继承的抽象类AbstrcatBeanFactory,再往下就是ChildBeanDefinition, GenericBeanDefinition, RootBeanDefinition,其中GenericBeanDefination比较常用。
2、BeanDefinationRegistry:BeanDefination的注册接口,说俗了也就是BeanDefination的一个容器,本身继承了AliasRegistry,即定义了对类别名操作函数;其子类DefaultListableBeanRegistry为最经典的类注册器,其中最为重要属性如下:
/** Map of bean definition objects, keyed by bean name */private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(64);
3、ConstructorArgumentValues:构造器的参数容器
private final Map<Integer, ValueHolder> indexedArgumentValues = new LinkedHashMap<Integer, ValueHolder>(0);private final List<ValueHolder> genericArgumentValues = new LinkedList<ValueHolder>();
4、MutablePropertyValues:可变参数容器
private final List<PropertyValue> propertyValueList;private Set<String> processedProperties;private volatile boolean converted = false;
- Spring架构学习(1)编码实现依赖注入
- Spring架构学习(2)通过Properties文件实现依赖注入
- Spring学习笔记(1)---依赖注入
- Spring学习笔记(5)----依赖注入的简单实现
- Spring学习笔记(5)----依赖注入的简单实现
- Spring学习(三)之依赖注入实现
- Spring学习笔记(6)----编码剖析Spring依赖注入的原理
- Spring学习笔记(6)----编码剖析Spring依赖注入的原理
- Spring 学习-------依赖注入
- Spring学习(一)---依赖注入(DI)1
- spring框架学习(二)依赖注入
- spring框架学习(二)依赖注入
- Spring学习笔记(8)-----------依赖注入
- spring框架学习(二)依赖注入
- spring框架学习(二)依赖注入
- spring框架学习(二)依赖注入
- spring框架学习(二)依赖注入
- spring框架学习(二)依赖注入
- 秦殇 二进制txt 异或
- iOS基础面试题(一)
- makefile $@ $< $^ 自动化变量
- iOS基础面试题(二)
- 排序算法总结(算法导论)
- Spring架构学习(1)编码实现依赖注入
- SVN代码管理使用方法和注意事项
- iOS基础面试题(三)
- javascript初学者课程
- 在apache中隐藏php文件后缀
- 用免费radius软件实现设备AAA管理(转)
- Oracle单行函数 (二)
- iOS基础面试题(四)
- "北京成功故事"系列报道之四:巴伐利亚啤酒酿造师在北京