Pro Spring 3读书笔记(一) - 18965050/pro-spring-3 GitHub Wiki
spring3.1的模块包括:
spring3.1的一些公共依赖包:
控制反转(Inversion of Control)包括两种类型: 依赖注入(Dependency Injection)和依赖查找(Dependency LookUp)
依赖查找又分为:
- 依赖拉取(Dependency Pull): 通过注册中心的方式获取依赖
- 上下文依赖查找(Contextualized Dependency Lookup): 不通过注册中心方式获取依赖
依赖注入又分为:
- 构造器依赖注入(Constructor Dependency Injection)
- 属性依赖注入(Setter Dependency Injection)
依赖查找的典型应用比如EJB2.0, 需要依赖JNDI来查询Bean 依赖注入的典型应用比如Spring. 但Spring也结合了依赖查找, 比如通过ApplicationContext.getBean()方法获取某个bean
依赖查找和依赖注入比较:
- 依赖查找需要有注册中心(不管是外部的还是自己实现的), 这样导致对现有代码有冲击
- 依赖查找比较容易出错, 比如bean名称没拼对等等.
BeanFactory是Bean的容器, 每个Bean都对应一个BeanDefinition实例.BeanFactory的实现类一般会实现BeanDefinitionRegistry接口, 用于获取BeanDefinition实例.
BeanFactory可通过BeanDefinitionReader的不同实现类(PropertiesBeanDefinitionReader, XmlBeanDefinitionReader)来读取properites或xml文件, 创建BeanDefinition实例.
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader rdr = new XmlBeanDefinitionReader(factory);
rdr.loadBeanDefinitions(new FileSystemResource("src/main/resources/xmlBeanFactory.xml"));
Oracle oracle = (Oracle)factory.getBean("oracle");
ApplicationContext继承自BeanFactory, 其拥有的能力还包括: 国际化, 事件发布, AOP服务, 事务等等(这个直接看源码)
Bean的配置目前主流有两种方式: XML和注解
Spring DI方式:
- 属性注入(Setting Injection)
- 构造器注入(Constructor Injection): 需要注意ConstructionConfusion
- 参数注入(Parameter Injection)
- 方法注入(Method Injection)
每个bean都至少有一个名称, 如果name没有设定, 则使用id作为name, 如果id也没有设定, 则使用类的全限定名作为name
bean可以有别名, 别名有两种方式定义:
- name中除第一个外都是别名(通过空格,逗号,分号分隔)
- 通过<alias>标签定义
- singleton: 单例, 默认
- prototype: 每次生成一个新的实例
- request: HttpServletRequest级别
- session: HttpSession级别
- global session: ServletContext级别
- thread: 线程级别
- custom: 通过实现Scope接口和CustomScopeConfigurer配置来实现
装配可以根据名称(name),类型(type)和构造器(constructor)来进行. 默认情况下, 如果bean只有默认构造函数, 则通过类型装配;如果还有其他构造函数, 则通过构造器装配
BeanNameAware,ApplicationContextAware
FactoryBean是Bean的工厂类. 但如何获取FactoryBean呢? 可通过在bean前面加连字符(&)的方式获取:
MessageDigestFactoryBean factoryBean =
(MessageDigestFactoryBean) ctx.getBean("&shaDigest");
JDK中的PropertyEditor用于对象属性值和String类型之间的相互转换. 在Spring3.1的版本中, 内部提供了13种内建PropertyEditor的实现类, 默认注册到BeanFactory中:
自定义PropertyEditor:
-
继承PropertyEditorSupport,实现setAsText()方法
-
将其注册到org.springframework.beans.factory.config.CustomEditorConfigurer.customEditors 属性中去
ApplicationContext继承自BeanFactory, 除了BeanFactory功能之外, 还包括:
-
国际化(Internationalization): ApplicationContext实现了MessageSource接口, 可通过其接口中的getMessage()方法来获取国际化字符串, 也可以使用MessageSourceResolvable的实现类而不是通过code和参数来获取国际化字符串
-
事件发布(Event publication): ApplicationContext实现了ApplicationEventPublisher接口, 可用于发布ApplicationEvent事件, 所有实现ApplicationListener的监听器都可以监听到.
-
资源管理和访问(Resource management and access): ApplicationContext继承ResourceLoader,实现了不同资源(Resource)的加载
-
其他生命周期接口(Additional life-cycle interfaces)
-
基础组件自动配置能力提升(Improved automatic configuration of infrastructure components)
Spring3.1提供了profile功能, 类似于maven的profile
使用JSR330进行DI注入