IOC知识点详细汇总
在Spring的IOC容器⾥配置Bean。
  ⼀,基于XML
id:Bean的名称,必须唯⼀,id可以指定多个名字,可⽤逗号,分号,或空格分隔;class为全类名(反射)。也有通过⼯⼚⽅法(静态⼯⼚⽅法&实例⼯⼚⽅法),FactoryBean两种⽅式,详细总结在下⽅。
  ⼆,基于注解
组件扫描:Spring能够从classpath下⾃动扫描,侦测和实例化具有特定注解的组件。
  (1)⾸先在Bean⾥加上相应的注解
主要有以下四种,然后IOC容器实例getBean()时。⼊参为默认的名称,但如果是接⼝的实现类,例如XxxImpl,则习惯利⽤注解的默认value值改为xxx.
  (2),配置<context:component-scan>,
  ①,即⾃动扫描base-package属性所配置的这个包及其⼦包,所有已标识注解的Bean都将被IOC容器进
⾏管理。
如果仅希望扫描特定的类⽽⾮基包中的所有类,可使⽤resource-pattern属性指定要扫描的资源。
  ②,context还有两个⼦节点<context:include-filter>,<context:exclude-filter>作⽤分别为:包含哪些指定表达式的组件,不包含哪些指定表达式的组件。都可有若⼲个,⽀持多种类型的表达式,常⽤的有annotation,assinable.
  <context:include-filter>需配合使⽤use-default-filters属性,默认值为true,会包含除include-filter配置外的类,需要把默认值改为false.
(3),如何利⽤注解来建⽴bean与bean之间的联系?
  @Autowired  @Resource和@Inject,    常⽤第⼀个注解。
  重点:类型兼容的Bean:同⼀个接⼝的不同实现类,出现异常,有两种解决⽅案:
  ①使⽤@Qualifier注解
  ②声明Bean的时候,bean的名字设置为跟属性名或字段名⼀样的
  三.IOC容器BeanFactory&ApplicationContext概述
   (1)Spring提供了两种类型的IOC容器实现
     ① BeanFactory:⾯向Spring本⾝
     ②ApplicationContext:⾯向使⽤Spring框架的开发者
    在Spring IOC容器读取Bean配置创建Bean实例之前,必须对它进⾏实例化,只有在容器实例化后,才可以从IOC容器⾥获取Bean实例并使⽤。
   (2)从IOC容器中获取Bean实例:
     ①利⽤id定位到IOC容器中的Bean实例化bean的三种方式
     ②利⽤类型返回IOC容器中的bean,但要求IOC容器中必须只能有⼀个该类型的bean.
  四.依赖注⼊的⽅式
    有三种:①属性注⼊②构造器注⼊③⼯⼚⽅法注⼊(很少使⽤,不推荐)
    ①属性注⼊即通过setter⽅法注⼊bean的属性值或依赖的对象。使⽤<property>元素,使⽤name属性指定bean的属
性名称,value属性或<value>⼦节点指定属性值。
    ②通过构造⽅法注⼊Bean的属性值或依赖的对象,保证了Bean实例在实例化后就可以使⽤。构造器注⼊在
<constructor-arg>元素⾥声明属性,<constructor-arg>中没有name属性。
  五.注⼊属性值细节
   (1),若字⾯值中包含特殊字符,可以使⽤<![CDATA[ ]]把字⾯值包裹起来。
   (2),通过<ref>元素或ref属性为Bean的属性或构造器参数指定对Bean的引⽤,也可以在属性或构造器⾥包含Bean 的声明,这样的Bean称为内部Bean。当Bean实例仅仅给⼀个特定的属性使⽤时,可以将其声明为内部Bean,不需要设置任何id或name属性,因为他不能使⽤在其他地⽅。
    (3),可以使⽤<null/>元素标签为Bean的字符串或其他对象类型的属性注⼊null值
   (4),⽀持级联属性的配置
   (5),可以通过⼀组内置的Xml标签(例如:<List>,<Set>,<Map>)来配置集合属性
    (6)使⽤p命名空间:需要先导⼊P命名空间,简化了基于XML的配置⽅式
  (7)导⼊外部⽂件时:可以在<beans>中添加context schema定义
    <context :property-placeholder location=" "/>        (Spring 2.5以后)
  六.⾃动装配
  Spring IOC容器可以⾃动装配Bean,需要做的仅仅是在<bean>的autowire属性⾥指定⾃动装配的模式
  ①byType:(根据类型⾃动装配)若IOC容器中有多个与⽬标Bean类型⼀致的Bean,在这种情况下,Spring将⽆法判断哪个Bean最适合该属性,所以不能执⾏⾃动装配。
  ②byName:(根据名称⾃动装配)必须将⽬标Bean的名称和属性名设置的完全相同
  ③constructor(通过构造器⾃动装配)不推荐使⽤,当Bean存在多个构造器时,此种装配⽅式将会很复杂。
  在实际项⽬⾥很少使⽤⾃动装配功能,因为和⾃动装配所带来的好处⽐起来,明确清晰的配置⽂档更
有说服⼒⼀些。
  七.bean之间的关系:继承与依赖
  ①继承:使⽤bean的parent属性指定继承哪个bean的配置。
  ⼋.bean的作⽤域
  九.IOC容器中Bean的⽣命周期
  (1)1.像Tomcat容器管理Servlet⽣命周期⼀样,IOC容器管理了Bean的⽣命周期。
      2. Spring IOC容器对Bean的⽣命周期进⾏管理的过程:
      ①通过构造器或⼯⼚⽅法创建Bean实例
      ②为Bean的属性设置值和对其他Bean的引⽤。
      ③调⽤Bean的初始化⽅法
      ④Bean可以使⽤了
      ⑤当容器关闭时,调⽤Bean的销毁⽅法
    3.在Bean的声明⾥设置init-method和destroy-method属性,为Bean指定初始化和销毁⽅法
  (2)创建Bean后置处理器
Bean后置处理器允许在调⽤初始化⽅法前后对Bean进⾏额外的处理。需要实现BeanPostProcessor接⼝。
不需要配置id属性,IOC容器会⾃动识别。
添加Bean的后置处理器之后的⽣命周期:
       ①通过构造器或⼯⼚⽅法创建Bean实例
      ②为Bean的属性设置值和对其他Bean的引⽤。
      ③将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization⽅法
      ④调⽤Bean的初始化⽅法
      ⑤将Bean实例传递给Bean后置处理器的postProcessAfterInitialization⽅法
      ⑥Bean可以使⽤了
      ⑦当容器关闭时,调⽤Bean的销毁⽅法
⼗,配置Bean的其他两种⽅法:
静态⼯⼚⽅法:直接调⽤某⼀个类的静态⽅法就可以返回Bean的实例
class:指向静态⼯⼚⽅法的全类名
factory-method:指向静态⼯⼚⽅法的名字
constructor-arg:如果⼯⼚⽅法需要传⼊参数,则使⽤constructor-arg来配置参数
  实例⼯⼚⽅法:实例⼯⼚的⽅法,即需要创建⼯⼚本⾝,再调⽤⼯⼚的实例⽅法来返回Bean的实例。factory-bean:指向实例⼯⼚⽅法的Bean。
  FactoryBean:需要实现FactoryBean接⼝。