每当我们需要使用一个类时,我们最常见的操作是在spring的配置文件中加上如下配置:
<bean id = "fsx" class = "org.fsx.BeanDemo"/>
OK, 这样定义完成后我们就可以从bean工厂中直接根据id获取所定义的对象,并任性的使用它,于是有人不由的发出"spring真是强大或是简单”的感慨。这样的确可以起作用,但如果认为spring中定义一个Bean只有这么点功能,那就未免太小瞧spring了,本文将详细阐述如何完整的定义一个Bean。首先一个Bean的完整包括如下属性:
<bean id="" class="" autowire="" autowire-candidate=""
      primary="" lazy-init="" depends-on="" factory-bean=""  factory-method="" parent="" abstract="" destroy-method="" init-method="" name="" scope=""/>
  • id: 这个属性非常简单,用于在Bean工厂中唯一的标识一个Bean。
  • class: 这个属性用于表明所要定义的类的全限定名。
  • name: 用于定义别名,也就是说同一个类在Bean工厂中可能有多个名字,根据其中任意一个都可以引用该类。注意在name中可以定义多个别名,别名之间用逗号隔开,如 name=“temp01, temp02, temp03”。
  • abstract:告诉beanFactory任何时候都不要实例化这个类,如果在Bean标签中将这个属性定义成true,是打算将这个Bean作为其它Bean的父类。
  • parent:parent的属性值是其它定义的某个Bean的id,他可以将如下属性传递给当前Bean:class、属性值定义、构造方法定义、初始化方法、销毁方法或者静态工厂方法。需要说明的是,当在parent Bean中指定了属性或构造方法定义,那么对应的子类中必须要有相应的构造方法和属性,否则会提示错误。当然,这些属性也可以在childBean中自定义,以覆盖ParentBean中的定义。以下属性:depends-on、lazy-init、autowire mode、scope,这四个属性不会从parentBean中继承。需要注意的是parentBean定义时可以不定义class方法,此时该ParentBean将被用于一个纯模板,必须告诉BeanFactory不要预实例化它,方法有两种:定义abstract=“true”【推荐】,init-lazy=“true”。
  • init-method、destroy-method:类在创建和销毁时需要执行的方法, 注意方法必须为无参方法。
  • autowire:所定义Bean中属性将采用自动装配的方式注入,自动自动装配方式包括以下几种:byName,byType,constructor,default, no。默认值为no。其中byName是根据名字进行匹配,byType是根据类型进行匹配,constructor是根据构造方法进行匹配【从BeanFactory中挑选出所有符合某一个构造方法的形式参数的bean集合,然后调用该构造方法并将这些Bean作为形式参数传入。spring会选择一个符合条件的参数最多的构造方法,如果有多个则报异常】。
  • autowire-candidate:顾名思义,表示配置该属性的Bean能否允许被自动注入到某个其它的Bean属性中,注意这个属性的设置不会影响非自动注入性的注入,如明确指定将某个Bean注入到Bean属性中。
  • primary:当配置该属性的Bean和其它Bean一起都有资格被自动注入到某个Bean的属性当中,将primary配置为true的Bean相对其它的Bean具有更高的优先级被选择。
  • lazy-init:告诉BeanFactory不要在其启动的时候将该Bean初始化,在使用的时候再进行实例化
  • depends-on:告诉BeanFactory当前Bean实例化应放在depends-on属性所指定的Bean实例化之后,可以指定多个Bean,中间用逗号隔开。个人觉得现在这个属性没什么用处了。
  • factory-bean,factory-method: 首先factory-bean属性和class属性是互斥的,一旦指定了factory-bean属性,class便失去了意义。factory-bean需要和factory-method结合起来使用,表示调用factory-bean所指定的bean中factory-method方法,该方法需为实例方法。不指定factory-bean,factory-method所指定的方法必须为class所指定的类中的静态方法。一旦指定了factory-method,bean factory便不会调用构造方法来实例化Ban,此时可以使用contract-args来为factory-method指定实际参数。