ref="billingDAO">
在这个例子中,orderServicebean用了构造函数注入,而BillingServicebean用了setter注入。
构造函数注入可以确保bean正确地构建,但是setter注入更加的灵活和易于控制,特别是当class有多个属性并且它们中的一些是可选的情况是更是如此。
12. 不要滥用注入
就像前面提到的,Spring的ApplicationContextEclipseandIntelliJ,java代码更加的易于阅读,维护和管理比使XML文件可以替你创建java对象,但不是所有的java对象都应该通过注入创建。
例如,域对象就不应该通过ApplicationContext创建。
Spring是一个优秀的框架,但是考虑到可读性和可操控性,基于XML配置的配置会在定义很多bean的时候出现麻烦。
过渡使用依赖注入将会使XML配置更加的复杂和冗长。
切记,当使用高效的IDE时,例如
结论
XML是Spring流行的配置格式。
存在大量bean定义时,基于XML的配置会变得冗长而不易使用。
Spring提供了丰富的配置选项。
适当地使用这些选项可以使XML配置更加的清晰,但其它的一些选项,例如自动装配,可能会降低可读性和可维护性。
参考本文中提到的这些技巧可能会帮助你创建干净而易读的XML配置文件
id="beanId"
(1)
name="beanName"
(2)
class="beanClass"(3)
parent="parentBean"(4)
abstract="true|false"(5)
singleton="true|false"(6)
lazy-init="true|false|default"(7)
autowire="no|byName|byType|constructor|autodetect|default"(8)
dependency-check="none|objects|simple|all|default"(9)
depends-on="dependsOnBean"(10)
init-method="method"(11)
destroy-method="method"(12)
factory-method="method"(13)
factory-bean="bean">(14)
(1)、id:
Bean的唯一标识名。
它必须是合法的XMLID,在整个XML文档中唯一。
(2)、name:
用来为id创建一个或多个别名。
它可以是任意的字母符合。
多个别名之间用逗号或空格分开。
(3)、class:
用来定义类的全限定名(包名+类名)。
只有子类Bean不用定义该属性。
(4)、parent:
子类Bean定义它所引用它的父类Bean。
这时前面的class属性失效。
子类Bean会继承父类Bean的所有属性,子类Bean也可以覆盖父类Bean的属性。
注意:
子类Bean和父类Bean是同一个Java类。
(5)、abstract(默认为”false”):
用来定义Bean是否为抽象Bean。
它表示这个Bean将不会被实例化,一般用于父类Bean,因为父类Bean主要是供子类Bean继承使用。
(6)、singleton(默认为“true”):
定义Bean是否是Singleton(单例)。
如果设为“true”,则在BeanFactory作用范围内,只维护此Bean的一个实例。
如果设为“flase”,Bean将是Prototype(原型)状态,BeanFactory将为每次Bean请求创建一个新的Bean实例。
(7)、lazy-init(默认为“default”):
用来定义这个Bean是否实现懒初始化。
如果为“true”,它将在BeanFactory启动时初始化所有的SingletonBean。
反之,如果为“false”,它只在Bean请求时才开始创建SingletonBean。
(8)、autowire(自动装配,默认为“default”):
它定义了Bean的自动装载方式。
1、“no”:
不使用自动装配功能。
2、“byName”:
通过Bean的属性名实现自动装配。
3、“byType”:
通过Bean的类型实现自动装配。
4、“constructor”:
类似于byType,但它是用于构造函数的参数的自动组装。
5、“autodetect”:
通过Bean类的反省机制(introspection)决定是使用“constructor”还是使用“byType”。
(9)、dependency-check(依赖检查,默认为“default”):
它用来确保Bean组件通过JavaBean描述的所以依赖关系都得到满足。
在与自动装配功能一起使用时,它特别有用。
1、none:
不进行依赖检查。
2、objects:
只做对象间依赖的检查。
3、simple:
只做原始类型和String类型依赖的检查
4、all:
对所有类型的依赖进行检查。
它包括了前面的objects和simple。
(10)、depends-on(依赖对象):
这个Bean在初始化时依赖的对象,这个对象会在这个Bean初始化之前创建。
(11)、init-method:
用来定义Bean的初始化方法,它会在Bean组装之后调用。
它必须是一个无参数的方法。
(12)、destroy-method:
用来定义Bean的销毁方法,它在BeanFactory关闭时调用。
同样,它也必须是一个无参数的方法。
它只能应用于singletonBean。
(13)、factory-method:
定义创建该Bean对象的工厂方法。
它用于下面的“factory-bean”,表示这个Bean是通过工厂方法创建。
此时,“class”属性失效。
(14)、factory-bean:
定义创建该Bean对象的工厂类。
如果使用了“factory-bean”则“class”属性失效。
下面列出[元素的所有可用的指定方式:]
bean:
可以在当前文件中查找依赖对象,也可以在应用上下文(ApplicationContext)中查找其它配置文件的对象。
local:
只在当前文件中查找依赖对象。
这个属性是一个XMLIDREF,所以它指定的对象必须存在,否则它的验证检查会报错。
external:
在其它文件中查找依赖对象,而不在当前文件中查找。
总的来说,和大部分的时候可以通用。
“bean”是最灵活的方式,它允许你在多个文件之间共享Bean。
而“local”则提供了便利的XML验证。
如何使用spring的作用域:
这里的scope就是用来配置springbean的作用域,它标识bean的作用域。
在spring2.0之前bean只有2种作用域即:
singleton(单例)、non-singleton(也称prototype),Spring2.0以后,增加了session、request、globalsession三种专用于Web应用程序上下文的Bean。
因此,默认情况下Spring2.0现在有五种类型的Bean。
当然,Spring2.0对Bean的类型的设计进行了重构,并设计出灵活的Bean类型支持,理论上可以有无数多种类型的Bean,用户可以根据自己的需要,增加新的Bean类型,满足实际应用需求。
1、singleton作用域
当一个bean的作用域设置为singleton,那么SpringIOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。
换言之,当把一个bean定义设置为singleton作用域时,SpringIOC容器只会创建该bean定义的唯一实例。
这个单一实例会被存储到单例缓存(singletoncache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例,这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中只有一个class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。
配置实例:
或者
2、prototype
prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当与一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototypebean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。
不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。
清除prototype作用域的对象并释放任何prototypebean所持有的昂贵资源,都是客户端代码的职责。
(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。
)
配置实例: