
写在前面本文继续完善IOC部分内容主要是增加beanfactory相关内容使其变得更加丰满以及增加事件通知相关内容从而能够更好的感知程序执行的进程以及时做出需要执行的动作。源码 。1增强beanfactory在Java程序语言中我们用一个interface代表一种特性如java.io.Closeable代表需要关闭释放资源或者是一种能力如java.lang.Cloneable代表具备克隆的能力这样特性以及能力互相独立某个类想要拥有某个特性或者是某个能力的话只需要实现对应的接口就行了。这种设计原则还有一个专门的名称interface segregation,即接口隔离原则。我们就来按照接口隔离原则来强化beanfactory。1.1具备信息列举能力的beanfactory/** * 拥有列举能力的bean工厂比如列举所有的bean名称某种类型的bean列表等 */publicinterfaceListableBeanFactoryextendsBeanFactory{booleancontainsBeanDefinition(StringbeanName);intgetBeanDefinitionCount();String[]getBeanDefinitionNames();String[]getBeanNamesForType(Class?type);TMapString,TgetBeansOfType(ClassTtype)throwsBeansException;}比如需要获取某个类型的bean名称列表就可以使用该接口了。1.2具有可配置能力的beanfactory/** * 支持配置的bean工厂比如配置bean处理器等 */publicinterfaceConfigurableBeanFactoryextendsBeanFactory,SingletonBeanRegistry{StringSCOPE_SINGLETONsingleton;StringSCOPE_PROTOTYPEprototype;voidaddBeanPostProcessor(BeanPostProcessorbeanPostProcessor);intgetBeanPostProcessorCount();voidregisterDependentBean(StringbeanName,StringdependentBeanName);String[]getDependentBeans(StringbeanName);String[]getDependenciesForBean(StringbeanName);}比如需要配置后置bean处理器就可以使用该接口。1.3具备信息列举能力的和可配置能力的beanfactory单点麻烦那就直接来个煎饼果子套餐/** * 可列举可配置的套餐接口 */publicinterfaceConfigurableListableBeanFactoryextendsListableBeanFactory,AutowireCapableBeanFactory,ConfigurableBeanFactory{}1.4优化AutowireCapableBeanFactory在前面的内容中AutowireCapableBeanFactory是一个具体的实现类它提供了解析Autowired注解注入bean的能力这里也按照当前的套路进行优化删除原有的AutowireCapableBeanFactory类然后定义AutowireCapableBeanFactory接口/** * 拥有Autowired注解处理能力的bean工厂 */publicinterfaceAutowireCapableBeanFactoryextendsBeanFactory{intAUTOWIRE_NO0;intAUTOWIRE_BY_NAME1;intAUTOWIRE_BY_TYPE2;ObjectapplyBeanPostProcessorsBeforeInitialization(ObjectexistingBean,StringbeanName)throwsBeansException;ObjectapplyBeanPostProcessorsAfterInitialization(ObjectexistingBean,StringbeanName)throwsBeansException;}定义抽象类给出默认的实现publicabstractclassAbstractAutowireCapableBeanFactoryextendsAbstractBeanFactoryimplementsAutowireCapableBeanFactory{}定义实现类publicclassDefaultListableBeanFactoryextendsAbstractAutowireCapableBeanFactoryimplementsConfigurableListableBeanFactory{}DefaultListableBeanFactory就是spring实际使用的bean工厂类了可以看作是IOC的发动机。是核心类。uml图2环境支持定义可以获取系统属性的接口publicinterfacePropertyResolver{booleancontainsProperty(Stringkey);StringgetProperty(Stringkey);StringgetProperty(Stringkey,StringdefaultValue);TTgetProperty(Stringkey,ClassTtargetType);TTgetProperty(Stringkey,ClassTtargetType,TdefaultValue);TClassTgetPropertyAsClass(Stringkey,ClassTtargetType);StringgetRequiredProperty(Stringkey)throwsIllegalStateException;TTgetRequiredProperty(Stringkey,ClassTtargetType)throwsIllegalStateException;StringresolvePlaceholders(Stringtext);StringresolveRequiredPlaceholders(Stringtext)throwsIllegalArgumentException;}按照接口隔离原则定义环境获取能力的接口publicinterfaceEnvironmentCapable{EnvironmentgetEnvironment();}定义总的环境接口publicinterfaceEnvironmentextendsPropertyResolver{String[]getActiveProfiles();String[]getDefaultProfiles();booleanacceptsProfiles(String...profiles);}3事件3.1事件对象/** * 定义应用事件 */publicclassApplicationEventextendsEventObject{privatestaticfinallongserialVersionUID1L;protectedStringmsgnull;publicApplicationEvent(Objectarg0){super(arg0);this.msgarg0.toString();}}继承了java.util.EventObject加入到jdk的事件体系中。3.2监听器对象publicclassApplicationListenerimplementsEventListener{voidonApplicationEvent(ApplicationEventevent){System.out.println(event.toString());}}继承了java.util.EventListener加入到了jdk的时间体系中。3.3容器刷新事件publicclassContextRefreshEventextendsApplicationEvent{privatestaticfinallongserialVersionUID1L;publicContextRefreshEvent(Objectarg0){super(arg0);}publicStringtoString(){returnthis.msg;}}3.4事件发布publicinterfaceApplicationEventPublisher{voidpublishEvent(ApplicationEventevent);voidaddApplicationListener(ApplicationListenerlistener);}实现类publicclassSimpleApplicationEventPublisherimplementsApplicationEventPublisher{ListApplicationListenerlistenersnewArrayList();OverridepublicvoidpublishEvent(ApplicationEventevent){for(ApplicationListenerlistener:listeners){listener.onApplicationEvent(event);}}OverridepublicvoidaddApplicationListener(ApplicationListenerlistener){this.listeners.add(listener);}}负责维护监听器和发布事件。4测试?xml version1.0 encodingUTF-8?beansbeanidbbsclasscom.hc.minispring.ioc.four_beanfactory_and_event.test.BaseBaseServiceinit-methodinitpropertytypecom.hc.minispring.ioc.four_beanfactory_and_event.test.AServiceImplnameasrefaservice//beanbeanidaserviceclasscom.hc.minispring.ioc.four_beanfactory_and_event.test.AServiceImplconstructor-argtypeStringnamenamevalueabc/constructor-argtypeintnamelevelvalue3/propertytypeStringnameproperty1valueSomeone says/propertytypeStringnameproperty2valueHello World!/propertytypecom.hc.minispring.ioc.four_beanfactory_and_event.test.BaseServicenameref1refbaseservice//beanbeanidbaseserviceclasscom.hc.minispring.ioc.four_beanfactory_and_event.test.BaseServiceinit-methodinit/bean/beans测试类publicclassTest1{publicstaticvoidmain(String[]args){ClassPathXmlApplicationContextctxnewClassPathXmlApplicationContext(four_beanfactory_and_event/beans.xml);AServiceaService;BaseServicebService;try{bService(BaseService)ctx.getBean(baseservice);bService.sayHello();}catch(BeansExceptione){e.printStackTrace();}}}运行Context Refreshed... Base Service says hello---four bean injected by annotation Autowired run... Process finished with exit code 0写在后面参考文章列表手把手带你写一个 Mini 。