一、Spring的核心机制:依赖注入
依赖注入以配置文件管理Bean实例之间的耦合,让Bean实例之间的耦合从代码层次分离出来。依赖注入是一种优秀的解耦方式。
Spring IoC容器的3个基本要点:
①应用程序的各组件面相接口编程。面相接口编程可以将各组件之间的耦合提升到接口层次,从而有利于项目后期的扩展。
②应用程度的各组件不再由程序主动产生,而是由Spring容器来负责产生、并初始化。
③Spring采用配置文件、或Annotation来管理Bean的实现类、依赖关系,Spring容器则根据配置文件、利用反射来创建实例,并为之注入依赖关系
依赖注入有两种方式:设值注入和构造注入
①设值注入:程序中定义set方法(反射时调用),配置文件中配置其属性<property name="XXX" ref="XXXbeanid"/>
②构造注入:通过构造函数设置,配置文件中配置其构造函数的参数类型<constructor-arg index="0" ref="XXXbeanid"/>
构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。
建议采用以设值注入为主,构造注入为辅的注入策略。
二、Spring核心接口(主要用ApplicationContext)
Spring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口。
Application包括BeanFactory的全部功能,因此建议优先使用ApplicationContext。除非对某些内存非常关键的应用才考虑使用BeanFactory。
当系统创建ApplicationContext容器时,默认会预初始化所有的singleton Bean。也就是说,当ApplicationContext容器初始化完成后,容器中所有singleton Bean也实例化完成。这意味着:系统前期创建ApplicationContext时将有较大的系统开销,但一旦ApplicationContext初始化完成,程序后面获取singleton Bean实例时将拥有较好的性能。
三、ApplicationContext的事件机制
ApplicationContext的事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext的事件处理。
Spring提供如下几个内置事件:
要想定义自己的Event则只需定义一个继承ApplicationEvent的类,而要想实现自己的监听器则只需定义一个实现ApplicationListener接口的类(实现该接口必须实现如下方法:onApplicationEvent(ApplicationEvent event)每当容器内发生任何事件时,此方法都被触发),为Spring容器注册事件监听器,只需要在xml文件中配置该bean(监听器类)即可。
跟别的事件机制有点不同的地方是,程序可以主动调用ApplicationContext的publishEvent()方法来主动触发容器事件
ApplicationContext ctx =new ClassPathXmlApplicationContext("bean.xml");
EmailEvent ele=new EmailEvent();
ctx.publishEvent(ele);
通过bean反向访问容器,Spring提供两个接口:BeanFactoryAware和ApplicationContextAware,只要实现setBeanFactory和setApplicationContext方法即可得到,虽然这样让Bean拥有了访问容器的能力,但污染了代码,导致代码与Spring接口耦合在一起。因此如不是特别必要,建议不要直接访问容器。