Pro Spring 3读书笔记(一) - 18965050/pro-spring-3 GitHub Wiki

Spring Modules

spring3.1的模块包括: spring模块-1 spring模块-2 spring模块-3

spring3.1的一些公共依赖包: spring公共依赖包-1 spring公共依赖包-2 spring公共依赖包-3 spring公共依赖包-4

IoC和DI

控制反转(Inversion of Control)包括两种类型: 依赖注入(Dependency Injection)和依赖查找(Dependency LookUp)

依赖查找又分为:

  • 依赖拉取(Dependency Pull): 通过注册中心的方式获取依赖 dependency-pull
  • 上下文依赖查找(Contextualized Dependency Lookup): 不通过注册中心方式获取依赖 dependency-pull

依赖注入又分为:

  • 构造器依赖注入(Constructor Dependency Injection)
  • 属性依赖注入(Setter Dependency Injection)

依赖查找的典型应用比如EJB2.0, 需要依赖JNDI来查询Bean 依赖注入的典型应用比如Spring. 但Spring也结合了依赖查找, 比如通过ApplicationContext.getBean()方法获取某个bean

依赖查找和依赖注入比较:

  • 依赖查找需要有注册中心(不管是外部的还是自己实现的), 这样导致对现有代码有冲击
  • 依赖查找比较容易出错, 比如bean名称没拼对等等.

Bean和BeanFactory

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

ApplicationContext继承自BeanFactory, 其拥有的能力还包括: 国际化, 事件发布, AOP服务, 事务等等(这个直接看源码)

Bean的配置目前主流有两种方式: XML和注解

Spring DI方式:

  • 属性注入(Setting Injection)
  • 构造器注入(Constructor Injection): 需要注意ConstructionConfusion
  • 参数注入(Parameter Injection)
  • 方法注入(Method Injection)

Bean Name

每个bean都至少有一个名称, 如果name没有设定, 则使用id作为name, 如果id也没有设定, 则使用类的全限定名作为name

bean可以有别名, 别名有两种方式定义:

  • name中除第一个外都是别名(通过空格,逗号,分号分隔)
  • 通过<alias>标签定义

Bean Scope

  • singleton: 单例, 默认
  • prototype: 每次生成一个新的实例
  • request: HttpServletRequest级别
  • session: HttpSession级别
  • global session: ServletContext级别
  • thread: 线程级别
  • custom: 通过实现Scope接口和CustomScopeConfigurer配置来实现

装配(Autowire)

装配可以根据名称(name),类型(type)和构造器(constructor)来进行. 默认情况下, 如果bean只有默认构造函数, 则通过类型装配;如果还有其他构造函数, 则通过构造器装配

生命周期

bean生命周期

Spring Aware

BeanNameAware,ApplicationContextAware

Factory Bean

FactoryBean是Bean的工厂类. 但如何获取FactoryBean呢? 可通过在bean前面加连字符(&)的方式获取:

MessageDigestFactoryBean factoryBean =
(MessageDigestFactoryBean) ctx.getBean("&shaDigest");

PropertyEditor

JDK中的PropertyEditor用于对象属性值和String类型之间的相互转换. 在Spring3.1的版本中, 内部提供了13种内建PropertyEditor的实现类, 默认注册到BeanFactory中: Spring PropertyEditor-1 Spring PropertyEditor-2

自定义PropertyEditor:

  1. 继承PropertyEditorSupport,实现setAsText()方法

  2. 将其注册到org.springframework.beans.factory.config.CustomEditorConfigurer.customEditors 属性中去

ApplicationContext配置

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)

Profile

Spring3.1提供了profile功能, 类似于maven的profile

使用JSR330

使用JSR330进行DI注入

⚠️ **GitHub.com Fallback** ⚠️