常见应用上下文类型

  • AnnotationConfigApplicationContext:从一个或多个基于Java的配置中加载Spring应用上下文。
  • AnnotationConfigWebApplicationContext:从一个活多个基于Java的配置类中加载Spring Web应用上下文。
  • ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。
  • FileSystemXmlApplicationContext:从文件系统下的一个或多个XML配置文件中加载上下文定义。
  • XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义。

bean的生命周期

lifecycle
  1. Spring对bean进行实例化
  2. Spring将value和bean的引用注入到bean对应的属性中
  3. 看看bean是否实现一下几个接口
    1. BeanNameAware:让bean知道自己在spring容器里的id
    2. BeanFactoryAware:让bean获取到beanFactory
    3. ApplicationContextAware:让bean获取到上下文
    4. BeanPostProcessor:Bean后置处理器,有两个方法,一个在bean初始化前调用postProcessBeforeInitialization(),一个在初始化后调用postProcessAfterInitialization,类似AOP环绕通知
    5. InitializingBean:要想看看bean属性赋值成功了没用可以用这个的afterPropertiesSet()方法。
  4. 此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁
  5. 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用

Spring 配置的可选方案

  • 在XML中进行显式配置
  • 在Java中进行显式配置
  • 隐式的bean发现机制和自动装配
    Spring 从两个角度实现自动化装配:
    • 组件扫描:Spring会自动发现应用上下文中所创建的bean
    • 自动装配:Spring自动满足bean之间的依赖

@ComponentScan注解 扫描并自动装配

  • 默认,以配置类所在的包为基础包(base package)来扫描组件
  • 扫描不同的包 括号带上包名@ComponentScan("packageName")或者@ComponetScan(basePackages ="packageName")
  • 扫描多个包 @ComponentScan(basePackages ={"packageName1","packageName2"})
  • 指定基础包中包含的类或接口 @ComponentScan(basePackageClasses={CDPlayer.class,DVDPlayer.class})

@AutoWired注解 实现自动装配

  • 放在属性上
  • 放在构造器上
  • 放在Setter方法上
  • 如果没有匹配会抛出异常,可以采用@AutoWired(required=false)