把Spring 2.0 reference文档下载下来,有几天了,前面简单的看了一下新特性什么的,感觉没什么大的变化,今天接着看“核心技术”这一章的3.3节“依赖”
依赖注入是我很了解的技术了,看到3.3.1.2“构造器注入”,我发现了以前使用比较少的这个构造器注入,下面将代码贴上,已备以后参考
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg type="int" value="7500000"/>
<constructor-arg type="java.lang.String" value="42"/>
</bean>
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg index="0" value="7500000"/>
<constructor-arg index="1" value="42"/>
</bean>
以上的两种构造器注入一种用的类型,一种用的索引
引用其他Bean
这里有三种引用的方法,<ref bean="someBean"/>
<ref local="someBean"/>
<ref parent="accountService"/>很少使用
经过试验证明<ref local="someBean"/> 这种方法只有在当前的Xml文件中才能起到作用,使用引用标记
<import resource="teama-applicationContext.xml"/>
不能起作用,会抛出异常。
3.3.3.4.1集合合并
<beans>
<bean id="parent" abstract="true" class="example.ComplexObject">
<property name="adminEmails">
<props>
<prop key="administrator">[email]administrator@somecompany.com[/email]</prop>
<prop key="support">[email]support@somecompany.com[/email]</prop>
</props>
</property>
</bean>
<bean id="child" parent="parent">
<property name="adminEmails">
<!-- the merge is specified on the *child* collection definition -->
<props merge="true">
<prop key="sales">[email]sales@somecompany.com[/email]</prop>
<prop key="support">[email]support@somecompany.co.uk[/email]</prop>
</props>
</property>
</bean>
<beans>
child
bean的adminEmails
属性的<props/>
元素上使用了merge=true
属性。当child
bean被容器实际解析及实例化时,其 adminEmails
将与父集合的adminEmails
属性进行合并。最终:administrator=administrator@somecompany.com
sales=sales@somecompany.com
support=support@somecompany.co.uk
3.3.3.4.2. 强类型集合(仅适用于Java5+)
public class Foo {
private Map<String, Float> accounts;
public void setAccounts(Map<String, Float> accounts) {
this.accounts = accounts;
}
}
<beans>
<bean id="foo" class="x.y.Foo">
<property name="accounts">
<map>
<entry key="one" value="9.99"/>
<entry key="two" value="2.75"/>
<entry key="six" value="3.99"/>
</map>
</property>
</bean>
</beans>
在foo
bean的accounts
属性被注入之前,通过反射,利用强类型Map<String, Float>
的泛型信息,Spring的底层类型转换机制将会把各种value元素值转换为Float
类型,因此字符串9.99、2.75
及3.99
就会被转换为实际的Float
类型。
3.3.3.5. Nulls
<bean class="ExampleBean">
<property name="email"><null/></property>
</bean>
exampleBean.setEmail(null)
。3.3.3.6. XML-based configuration metadata shortcuts(Xml的简写)
<property name="myProperty" value="hello"/>
<constructor-arg value="hello"/>
<entry key="myKey" value="hello"/>
<property name="myProperty" ref="myBean"/>
<constructor-arg ref="myBean"/>
注意,尽管存在等同于<ref bean="xxx">
元素的简写形式,但并没有<ref local="xxx"
>的简写形式,为了对当前xml中bean的引用,你只能使用完整的形式。
<entry>
<key>
<ref bean="myKeyBean" />
</key>
<ref bean="myValueBean" />
</entry>
<entry key-ref="myKeyBean" value-ref="myValueBean"/>
3.3.3.7. 组合属性名称
<bean id="foo" class="foo.Bar">
<property name="fred.bob.sammy" value="123" />
</bean>
foo
bean有个fred
属性,此属性有个 bob
属性,而bob
属性又有个sammy
属性,最后把sammy
属性设置为123
。为了让此定义能工作, foo
的fred
属性及fred
的bob
属性在bean被构造后都必须非空,否则将抛出NullPointerException
异常。3.3.4. 使用depends-on
(强制初始化)
'depends-on'
中将指定的多个bean名字用分隔符进行分隔,分隔符可以是逗号、空格及分号等。下面的例子中使用了'depends-on'
来表达对多个bean的依赖。<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao">
<property name="manager" ref="manager" />
</bean>
<bean id="manager" class="ManagerBean" />
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />
3.3.5. 延迟初始化bean
ApplicationContext
实现的默认行为就是在启动时将所有singleton
bean提前进行实例化。提前实例化意味着作为初始化过程的一部分,ApplicationContext
实例会创建并配置所有的singleton bean。通常情况下这是件好事,因为这样在配置中的任何错误就会即刻被发现(否则的话可能要花几个小时甚至几天)。ApplicationContext
实现在初始化时被提前实例化,那么可以将bean设置为延迟实例化。一个延迟初始化bean将告诉IoC 容器是在启动时还是在第一次被用到时实例化。<bean/>
元素中的lazy-init
属性来进行控制。<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true">
</bean>
<bean name="not.lazy" class="com.foo.AnotherBean"/>
这样当一个bean需要使用到这个bean的时候才会初始化这个bean
3.3.6. 自动装配(autowire)协作者
模式 |
说明 |
no |
不使用自动装配。必须通过ref元素指定依赖,这是默认设置。由于显式指定协作者可以使配置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。而且在某种程度上,它也是系统架构的一种文档形式。 |
byName |
根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。 |
byType |
如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。 |
constructor |
与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。 |
autodetect |
通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。 |
引用开发手册原文:
3.4. bean的作用域
3.4.1. Singleton作用域
当把一个bean定义设置为singlton作用域时,Spring IoC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例。
<bean id="accountService" class="com.foo.DefaultAccountService" scope="singleton"/>
<bean id="accountService" class="com.foo.DefaultAccountService" singleton="true"/>
3.4.2. Prototype作用域
getBean()
方法)时都会创建一个新的bean实例。根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。<bean id="accountService" class="com.foo.DefaultAccountService" scope="prototype"/>
简单地说,如果你用"singleton
"属性那么就必须在那个文件里引用'spring-beans.dtd'
DTD。 如果你用"scope
"属性那么必须 在那个文件里引用'spring-beans-2.0.dtd'
DTD 或'spring-beans-2.0.xsd'
XSD。
今天就看到这里,也许在将来的几天中我会将这个学习笔记作为我的工作日志,里面会写上一些关于Hibernate的学习笔记
<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>
loginAction
bean定义创建一个全新的LoginAction
bean实例,且该loginAction
bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction
bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
Session
,Spring容器会根据userPreferences
bean定义创建一个全新的userPreferences
bean实例,且该userPreferences
bean仅在当前HTTP Session
内有效。与request作用域
一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session
中根据userPreferences
创建的实例,将不会看到这些特定于某个HTTP Session
的状态变化。当HTTP Session
最终被废弃的时候,在该HTTP Session
作用域内的bean也会被废弃掉。3.4.3.5. 作用域bean与依赖
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
<aop:scoped-proxy/>
</bean>
<bean id="userManager" class="com.foo.UserManager">
<property name="userPreferences" ref="userPreferences"/>
</bean>
当注入某种类型对象时,该对象实现了和UserPreferences
类一样的公共接口(即UserPreferences
实例)。并且不论我们底层选择了何种作用域机制(HTTP request、Session
等等),容器都会足够智能的获取到真正的UserPreferences
对象,因此我们需要将该对象的代理注入到userManager
bean中, 而userManager
bean并不会意识到它所持有的是一个指向UserPreferences
引用的代理。在本例中,当UserManager
实例调用了一个使用UserPreferences
对象的方法时,实际调用的是代理对象的方法。随后代理对象会从HTTP Session
获取真正的UserPreferences
对象,并将方法调用委派给获取到的实际的UserPreferences
对象。
今天工作日志(2007.2.14)
(2007.2.27)Spring的org.springframework.web.portlet.mvc.ParameterizableViewController
Method Summary | |
protected ModelAndView |
handleRenderRequestInternal (RenderRequest request, RenderResponse response) Return a ModelAndView object with the specified view name. |
protected void |
|
void |