±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËÒÀÀµ×¢Èë¡¢ÒÀÀµ×¢ÈëµÄÅäÖÃÏê½â¡¢depends-on¡¢lazy-init¡¢×Ô¶¯×°ÔØ¡¢·½·¨×¢ÈëµÈÄÚÈÝ¡£
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
ÒÀÀµ×¢Èë
ÒÀÀµ×¢Èë¾ÍÊÇÔÚSpring´´½¨BeanµÄʱºò£¬È¥ÊµÀý»¯¸ÃBean¹¹Ô캯ÊýËùÐèµÄ²ÎÊý£¬»òÕßͨ¹ýSetter·½·¨È¥ÉèÖøÃBeanµÄÊôÐÔ¡£
SpringµÄÒÀÀµ×¢ÈëÓÐÁ½ÖÖ»ùÓÚ¹¹Ô캯ÊýµÄÒÀÀµ×¢ÈëºÍ»ùÓÚsetterµÄÒÀÀµ×¢Èë¡£
»ùÓÚ¹¹Ô캯ÊýµÄÒÀÀµ×¢Èë
¹¹Ô캯ÊýµÄ×¢ÈëÊÇͨ¹ý¹¹Ô캯ÊýµÄ²ÎÊýÀ´ÊµÏֵġ£ÈçÏÂËùʾ£º
public class
ExampleBean {
// Number of years to calculate the Ultimate
Answer
private int years;
// The Answer to Life, the Universe, and Everything
private String ultimateAnswer;
public ExampleBean(int years, String ultimateAnswer)
{
this.years = years;
this.ultimateAnswer = ultimateAnswer;
}
}
|
¸ÃBeanÓÐÒ»¸öÁ½¸ö²ÎÊýµÄ¹¹Ô캯Êý£¬ÄÇôÔõôעÈëÕâЩ²ÎÊýÄØ£¿
ÓÐÈýÖÖ·½·¨¡£
·½·¨1£º°´¹¹Ô캯ÊýµÄÀàÐÍÆ¥Å䣺
<bean
id="exampleBeanA" class="com.flydean.beans.ExampleBean">
<constructor-arg type="int" value="7500000"/>
<constructor-arg type="java.lang.String"
value="42"/>
</bean>
|
ÕâÀïͨ¹ýÖ¸¶¨²ÎÊýµÄÀàÐÍ£¬¼´¿ÉÒÔÖ¸¶¨Äĸö²ÎÊýÊÇyears£¬Äĸö²ÎÊýÊÇultimateAnswer¡£
·½·¨2£º¹¹Ô캯ÊýË÷Òý£º
<bean
id="exampleBeanB" class="com.flydean.beans.ExampleBean">
<constructor-arg index="0" value="7500000"/>
<constructor-arg index="1" value="42"/>
</bean>
|
SpringÖпÉÒÔͨ¹ý¹¹Ô캯ÊýµÄË÷ÒýÀ´Ö¸¶¨Ìض¨µÄ²ÎÊý¡£Òª×¢ÒâSpringµÄË÷ÒýÊÇ´Ó0¿ªÊ¼µÄ¡£
·½·¨3£º¹¹Ô캯ÊýÃû×ÖÆ¥Å䣺
<bean
id="exampleBeanC" class="com.flydean.beans
.ExampleBeanWithConstructorProperties">
<constructor-arg name="years" value="7500000"/>
<constructor-arg name="ultimateAnswer"
value="42"/>
</bean>
|
Èç¹ûͨ¹ý¹¹Ô캯ÊýµÄÃû×ÖÀ´Æ¥Å䣬ÐèҪעÒâ±ØÐëÔÚ±àÒëµÄʱºò¿ªÆôµ÷ÊÔ±êÖ¾£¬Òª²»È»Spring²»ÄÜÔÚ¹¹Ô캯ÊýÖÐÕÒµ½²ÎÊýÃû¡£
Èç¹û²»ÏëÆôÓõ÷ÊÔ±êÖ¾£¬Ôò±ØÐëʹÓÃ@ConstructorProperties
JDK×¢½âÏÔʽÃüÃû¹¹Ô캯Êý²ÎÊý¡£
public class
ExampleBeanWithConstructorProperties {
// Number of years to calculate the Ultimate
Answer
private int years;
// The Answer to Life, the Universe, and Everything
private String ultimateAnswer;
@ConstructorProperties ({"years",
"ultimateAnswer"})
public ExampleBeanWithConstructorProperties (int
years, String ultimateAnswer) {
this.years = years;
this.ultimateAnswer = ultimateAnswer;
}
}
|
»ùÓÚSetterµÄ×¢Èë
Setter×¢ÈëÖ÷ÒªÓÃÀ´Î޲ι¹ÔìÆ÷»òÕß»ñµÃ¶ÔÏóʵÀýÖ®ºó²ÅÉèÖöÔÏóµÄÊôÐÔ¡£ÏÂÃæÊÇSetterµÄÀý×Ó£º
public class
SimpleMovieLister {
// the SimpleMovieLister has a dependency
on the MovieFinder
private MovieFinder movieFinder;
// a setter method so that the Spring container
can inject a MovieFinder
public void setMovieFinder (MovieFinder movieFinder)
{
this.movieFinder = movieFinder;
}
// business logic that actually uses the injected
MovieFinder is omitted...
} |
¶ÔÓÚµÄXMLÎļþÈçÏ£º
<!--Setter
DI -->
<bean id= "movieFinder" class="com.flydean.beans.MovieFinder"/>
<bean id="simpleMovieLister"
class="com.flydean.beans.SimpleMovieLister">
<property name= "movieFinder" ref="movieFinder"/>
</bean> |
³ýÁËXMLÅäÖã¬Ò²¿ÉÒÔʹÓÃ×¢½â£º@Component¡¢@Controller¡£»òÕßʹÓÃ@Configuration×¢½âÖеÄ@Bean·½·¨¡£
ÈçºÎÑ¡Ôñ£¿
¼ÈÈ»ÓÐÕâÑùÁ½ÖÖ×¢È뷽ʽ£¬ÎÒÃÇÔõôѡÔñÄØ£¿
ͨ³£À´Ëµ£¬¶ÔÓÚ±ØÐëµÄÊôÐÔ£¬ÎÒÃÇͨ¹ý¹¹Ô캯ÊýÀ´×¢Èë¡£¶ÔÓÚ¿ÉÑ¡ÊôÐÔ£¬ÎÒÃÇͨ¹ýSetter×¢Èë¡£µ±È»ÄãÒ²¿ÉÒÔÔÚSetter·½·¨ÖÐʹÓÃ@Required×¢½â¡£
µ±È»Èç¹ûµÚÈý·½À಻¹«¿ªÈκÎsetter·½·¨£¬ÄÇô¹¹Ô캯Êý×¢Èë¿ÉÄÜÊÇDIµÄΨһ¿ÉÓÃÐÎʽ¡£
Ñ»·ÒÀÀµ
Ñ»·ÒÀÀµÖ÷Òª³öÏÖÔÚ¹¹Ô캯Êý×¢ÈëµÄÇé¿ö¡£
ÀàAͨ¹ý¹¹Ô캯Êý×¢ÈëÐèÒªÀàBµÄʵÀý£¬ÀàBͨ¹ý¹¹Ô캯Êý×¢ÈëÐèÒªÀàAµÄʵÀý¡£Èç¹ûΪҪÏ໥עÈëµÄÀàAºÍÀàBÅäÖÃbean£¬ÄÇôSpringIOCÈÝÆ÷ÔÚÔËÐÐʱ¼ì²âµ½Õâ¸öÑ»·ÒýÓ㬻áÅ׳öBeanCurrentlyInCreationException¡£
½â¾ö·½Ê½¾ÍÊÇʹÓÃSetter×¢Èë¡£
ÒÀÀµ×¢ÈëµÄÅäÖÃÏê½â
»ù±¾ÀàÐÍ£¬×Ö·û´®»òÕ߯äËû
Èç¹û< property/>ÔªËØµÄvalueÊôÐÔÊÇ»ù±¾ÀàÐÍ£¬Spring»á½«Æäת»»ÎªÀàÐèÒªµÄÀàÐÍ£¬ÅäÖÃÈçÏ£º
<!--Setter
DI -->
<bean id="movieFinder" class= "com.flydean.beans.MovieFinder">
<property name="name" value= "movie"/>
<property name="number" value="123456"/>
</bean>
|
ÕâÊÇÒ»¸ö³£¼ûµÄSetter×¢È롣ΪÁ˼ò½à£¬Ò²¿ÉÒÔʹÓÃp-namespace£¬ÈçÏ£º
<?xml
version="1.0" encoding="UTF-8"?>
<beans xmlns= "http://www.springframework.org/
schema/beans"
xmlns:xsi= "http://www.w3.org/ 2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/
schema/p"
xsi:schemaLocation= "http://www.springframework.org/schema/beans
http://www.springframework.org/ schema/beans/spring-beans.xsd">
<bean id="movieFinder" class=
"com.flydean.beans.MovieFinder"
p:name="movie"
p:number="123456"/>
</beans> |
SpringÈÝÆ÷ʹÓÃJavaBeansÊôÐÔ±à¼Æ÷»úÖÆ½«< value/>ÔªËØÖеÄÎı¾×ª»»Îªjava.util.propertiesʵÀý¡£ÕâÊÇÒ»¸öºÜºÃµÄ¿ì½Ý·½Ê½£¬ÈçÏÂËùʾ£º
<bean
id="mappings"
class= "org.springframework.beans.factory.config.
PropertyPlaceholderConfigurer">
<!-- typed as a java.util.Properties -->
<property name= "properties">
<value>
jdbc.driver.className= com.mysql.jdbc.Driver
jdbc.url=jdbc: mysql://localhost:3306/mydb
</value>
</property>
</bean> |
×¢ÒâÉÏÃæÀý×ÓÖеÄvalueÀïÃæµÄÖµ¡£
ref
ͨ¹ý< ref/>±ê¼ÇµÄbeanÊôÐÔÔÊÐíÔÚͬһÈÝÆ÷»ò¸¸ÈÝÆ÷Öд´½¨¶ÔÈκÎbeanµÄÒýÓ㬶ø²»¹ÜËüÊÇ·ñÔÚͬһXMLÎļþÖС£beanÊôÐÔµÄÖµ¿ÉÒÔÓëÄ¿±êbeanµÄidÊôÐÔÏàͬ£¬Ò²¿ÉÒÔÓëÄ¿±êbeanµÄnameÊôÐÔÖеÄÒ»¸öÖµÏàͬ¡£ÒÔÏÂʾÀýÏÔʾÈçºÎʹÓÃrefÔªËØ£º
ÄÚ²¿bean
ÔÚ< property/> »òÕß < constructor-arg/>ÔªËØÄÚ²¿µÄ<
bean/>ÔªËØ¿ÉÒÔ¶¨ÒåÒ»¸öÄÚ²¿bean,ÏÂÃæÊǸöÀý×Ó£º
<bean
id="simpleMovieLister" class= "com.flydean.beans.SimpleMovieLister">
<property name="movieFinder">
<bean class= "com.flydean.beans.MovieFinder">
<property name= "name" value="movie"/>
<property name= "number" value="123456"/>
</bean>
</property>
</bean> |
ÄÚ²¿bean¶¨Òå²»ÐèÒªID»òÃû³Æ¡£Èç¹ûÖ¸¶¨£¬ÈÝÆ÷Ò²²»»áʹÓÃÕâ¸öÖµ×÷Ϊ±êʶ·û¡£ÈÝÆ÷ÔÚ´´½¨Ê±Ò²ºöÂÔ×÷ÓÃÓò±êÖ¾£¬ÒòΪÄÚ²¿bean×ÜÊÇÄäÃûµÄ£¬²¢ÇÒ×ÜÊÇÓÃÍⲿbean´´½¨µÄ¡£²»¿ÉÄܵ¥¶À·ÃÎÊÄÚ²¿bean£¬Ò²²»¿ÉÄܽ«ËüÃÇ×¢Èëµ½³ý·â±ÕbeanÖ®ÍâµÄÐ×÷beanÖС£
¼¯ºÏ
< list/>, < set/>, <
map/>,ºÍ < props/> ·Ö±ð±»ÓÃÀ´ÉèÖÃJava CollectionÀàÐÍList,
Set, Map£¬ºÍ Properties ÀàÐ͵ÄÊôÐԺͲÎÊý¡£ ÏÂÃæÊǸöÀý×Ó£º
<bean
id="movieFinderE" class= "com.flydean.beans.MovieFinder">
</bean>
<bean class= "com.flydean.beans.CollectionBean">
<property name="properties">
<props>
<prop key="administrator"> administrator@example.org</prop>
<prop key="support"> support@example.org</prop>
<prop key="development"> development@example.org</prop>
</props>
</property>
<property name= "arrayList">
<list>
<value>"a list element followed by
a reference"</value>
</list>
</property>
<property name="hashMap">
<map>
<entry key="an entry" value ="just
some string"/>
<entry key = "a ref" value-ref="movieFinderE"/>
</map>
</property>
<property name="hashSet">
<set>
<value>just some string</value>
<ref bean="movieFinderE" />
</set>
</property>
</bean> |
Ç¿ÀàÐͼ¯ºÏ
ͨ¹ýÔÚJava 5ÖÐÒýÈë·ºÐÍÀàÐÍ£¬¿ÉÒÔʹÓÃÇ¿ÀàÐͼ¯ºÏ¡£Ò²¾ÍÊÇ˵£¬¿ÉÒÔÉùÃ÷¼¯ºÏÀàÐÍ£¬Ê¹ÆäÖ»Äܰüº¬£¨ÀýÈ磩×Ö·û´®ÔªËØ¡£Èç¹ûʹÓÃSpring½«Ç¿ÀàÐͼ¯ºÏ×¢Èëbean£¬Ôò¿ÉÒÔÀûÓÃSpringµÄÀàÐÍת»»Ö§³Ö£¬ÒÔ±ãÔÚ½«Ç¿ÀàÐͼ¯ºÏʵÀýµÄÔªËØÌí¼Óµ½¼¯ºÏ֮ǰ½«Æäת»»ÎªÊʵ±µÄÀàÐÍ¡£ÏÂÃæµÄJavaÀàºÍbean¶¨ÒåµÄÀý×Ó£º
public class
SomeClass {
private Map<String, Float> accounts;
public void setAccounts (Map<String, Float>
accounts) {
this.accounts = accounts;
}
} |
<bean
id="something" class= "com.flydean.beans.SomeClass">
<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>
|
NullºÍEmpty×Ö·û´®Öµ
NullºÍ¿Õ×Ö·û´®ÊDz»Ò»ÑùµÄ£¬ÈçÏ£º
<bean
class="ExampleBean">
<property name="email" value=""/>
</bean> |
ÉÏÃæµÄÀý×ÓÏ൱ÓÚ£º
exampleBean.setEmail(""); |
ÏÂÃæÊÇÔõôÉèÖÃnull£º
<bean class="ExampleBean">
<property name="email">
<null/>
</property>
</bean> |
ÉÏÃæµÄÀý×ÓÏ൱ÓÚ£º
exampleBean.setEmail(null); |
c-namespace
ÉÏÃæ½²µ½ÁËp-namespaceרÃÅÊÇÉèÖÃbeanµÄÊôÐÔÓõģ¬Í¬ÑùµÄc-namespaceÊÇÓÃÀ´ÉèÖù¹Ô캯Êý²ÎÊýµÄ£¬ÈçÏÂËùʾ£º
<bean id="exampleBeanA"
class="com.flydean.beans.ExampleBean">
<constructor-arg type="int" value="7500000"/>
<constructor-arg type= "java.lang.String"
value="42"/>
</bean>
<bean id="exampleBeanB" class="com.flydean.beans.ExampleBean"
c:years = "10" c:ultimateAnswer="answer"
/> |
depends-on
ͨ³£Ò»¸öbeanÒÀÀµÁíÒ»¸öbean£¬ÎÒÃÇ»áÔÚXMLÖÐʹÓÃ<
ref/>À´ÒýÓ㬵«ÊÇÕâÖÖÒÀÀµ¹ØÏµ²¢²»Ö±½Ó¡£ÎÒÃÇ¿ÉÒÔʹÓÃdepends-onÊôÐÔÀ´ÏÔÊ½Ç¿ÖÆÒ»¸ö»ò¶à¸öbeanÔÚʹÓôËÔªËØµÄbean³õʼ»¯Ö®Ç°½øÐгõʼ»¯,ÈçÏÂËùʾ£º
<bean id="beanA"
class= "com.flydean.beans.SomeClass"
depends-on="beanB"></bean>
<bean id=" beanB" class= "com.flydean.beans.MovieFinder"></bean> |
lazy-init
Õý³£À´ËµApplicationContextÖÐÅäÖóɵ¥ÀýģʽµÄbean¶¼»áËæSpringÆô¶¯¶ø³õʼ»¯£¬Èç¹ûÓÐÌØÊâµÄÐèÒª£¬ÏëÑÓ³¤³õʼ»¯¸Ãbean£¬Ôò¿ÉÒÔʹÓÃ
lazy-init ¡£Ò»¸ölazy-initialized bean¸æËßIOCÈÝÆ÷ÔÚµÚÒ»´ÎÇëÇóbeanʵÀýʱ´´½¨Ëü£¬¶ø²»ÊÇÔÚÆô¶¯Ê±¡£
<bean id="beanD"
class= "com.flydean.beans.MovieFinder"
lazy-init="true"></bean>
|
µ«ÊÇ£¬µ±Ò»¸ö¶èÐÔ³õʼ»¯beanÊÇÒ»¸ö·Ç¶èÐÔ³õʼ»¯µÄsingleton beanµÄÒÀÀµÏîʱ£¬ApplicationContext»áÔÚÆô¶¯Ê±´´½¨¶èÐÔ³õʼ»¯bean£¬ÒòΪËü±ØÐëÂú×ãsingletonµÄÒÀÀµÏî¡£
Äú»¹¿ÉÒÔͨ¹ýÔÚ< beans/>ÔªËØÉÏʹÓÃĬÈϵÄlazy
initÊôÐÔÔÚÈÝÆ÷¼¶±ð¿ØÖÆlazy³õʼ»¯£¬ÏÂÃæµÄʾÀýÏÔʾ£º
<beans default-lazy-init="true">
<!-- no beans will be pre-instantiated...
-->
</beans> |
×Ô¶¯×°ÔØ
Èç¹ûÄãÏëÈÃSpring×Ô¶¯°ïÄã×¢ÈëbeanµÄÒÀÀµbeanʱºò£¬¿ÉÒÔʹÓÃSpringµÄautowiring¹¦ÄÜ¡£autowiring
ÓÐ4ÖÖģʽ£º

×Ô¶¯×¢ÈëµÄÏÞÖÆºÍȱÏÝ
ËäÈ»×Ô¶¯×¢ÈëÓÃÆðÀ´ºÜˬ£¬µ«ÊÇËüÒ²ÓÐÈçϵÄȱÏÝ£º
propertyºÍconstructor-argµÄÏÔʾÉèÖûḲ¸Ç×Ô¶¯×¢È룬²¢ÇÒ×Ô¶¯×¢Èë²»ÄÜ×¢Èë¼òµ¥ÀàÐÍ¡£
×Ô¶¯×¢Èë²»ÈçÏÔʾÅäÖþ«È·¡£
×Ô¶¯×¢Èë¿ÉÄܺÍÈÝÆ÷ÖеĺܶàbeanÏàÆ¥Åä¡£¿ÉÄÜ»á³öÏÖÎÊÌâ¡£
´Ó×Ô¶¯×°ÔØÖÐÅųýBean
ʹÓÃautowire-candidateÊôÐÔÉèÖÃΪfalse£¬¿ÉÒÔ·ÀÖ¹bean±»×Ô¶¯×¢Èë¡£¸ÃÊôÐÔÖ»»áÓ°Ïì°´ÀàÐÍ×¢ÈëµÄ·½Ê½¡£Èç¹û°´name×¢È룬Ôò²»ÊÜÓ°Ïì¡£
ÏÂÃæÊÇ×Ô¶¯×¢ÈëµÄÀý×Ó£º
<bean id="simpleMovieLister"
class= "com.flydean.beans.SimpleMovieLister"
autowire="byType">
</bean>
<!--Setter DI -->
<bean id="movieFinder" class= "com.flydean.beans.MovieFinder">
<property name="name" value="movie"/>
<property name="number" value="123456"/>
</bean> |
SimpleMovieListerÈçÏ£º
package com.flydean.beans;
import lombok.Data;
@Data
public class SimpleMovieLister {
// the SimpleMovieLister has a dependency
on the MovieFinder
private MovieFinder movieFinder;
// a setter method so that the Spring container
can inject a MovieFinder
public void setMovieFinder (MovieFinder movieFinder)
{
this.movieFinder = movieFinder;
}
// business logic that actually uses the injected
MovieFinder is omitted...
} |
ÔÚÉÏÃæµÄÀý×ÓÖУ¬movieFinderÊôÐÔ½«»á±»×Ô¶¯×¢Èë¡£
·½·¨×¢Èë
ÔÚbeanµÄÉúÃüÖÜÆÚ²»Í¬µÄʱºò£¬Èç¹ûÒ»¸öbeanÒªÒÀÀµÓÚÁíÍâÒ»¸öbeanÔò¿ÉÄܳöÏÖÎÊÌâ¡£ ±ÈÈçÒ»¸öµ¥ÀýģʽµÄbeanA
ÒÀÀµÓÚ¶àÀýģʽµÄbeanB¡£ ÒòΪbeanAÊǵ¥ÀýģʽµÄ£¬ËùÒÔÔÚ´´½¨beanAµÄʱºò¾ÍÒѾ½«ÆäÒÀÀµµÄbeanB´´½¨ÁË£¬²»¿ÉÄÜÔÚÿ´ÎbeanAÐèÒªbeanBµÄʱºò¶¼´´½¨Ò»¸öеÄbeanBµÄʵÀý¡£
½â¾ö·½·¨ÓкܶàÖÖ£¬ÎÒÃÇÒ»Ò»½øÐн²½â¡£
·½·¨1£ºÊµÏÖApplicationContextAware
Èç¹ûʵÏÖÁËApplicationContextAware£¬Ôò¿ÉÒÔͨ¹ýgetBean·½·¨ÔÚÿ´ÎÐèÒªbeanBµÄʱºò£¬ÇëÇóËûµÄеÄʵÀý£¬ÈçÏ£º
public class CommandManager
implements ApplicationContextAware {
private ApplicationContext applicationContext;
public Object process (Map commandState) {
// grab a new instance of the appropriate Command
Command command = createCommand();
// set the state on the (hopefully brand new)
Command instance
command.setState(commandState);
return command.execute();
}
protected Command createCommand() {
// notice the Spring API dependency!
return this.applicationContext.getBean ("command",
Command.class);
}
public void setApplicationContext(
ApplicationContext applicationContext) throws
BeansException {
this.applicationContext = applicationContext;
}
} |
ÕâÖÖ·½·¨²¢²»¿ÉÈ¡µÄ£¬ÒòΪҵÎñ´úÂëºÍSpring¿ò¼Ü²úÉúÁËñîºÏ¡£·½·¨×¢ÈëÊÇSpring IoC ÈÝÆ÷µÄÒ»¸ö¸ß¼¶ÌØÐÔ£¬Ëü¿ÉÒԺܺõĴ¦ÀíÕâÖÖÇé¿ö¡£
²éÕÒ·½·¨×¢Èë
²éÕÒ·½·¨×¢ÈëÊÇÖ¸ÈÝÆ÷ÖØÐ´container-managed beanÉϵķ½·¨£¬²¢·µ»ØÈÝÆ÷ÖÐÁíÒ»¸öÃüÃûbean¡£²éÕÒͨ³£Éæ¼°Ò»¸öÔÐÍbean£¬Èçǰһ½ÚÖÐÃèÊöµÄ³¡¾°ÖÐËùʾ¡£Spring¿ò¼Üͨ¹ýʹÓÃcglib¿âÖеÄ×Ö½ÚÂ붯̬Éú³É¸²¸Ç¸Ã·½·¨µÄ×ÓÀàÀ´ÊµÏָ÷½·¨×¢Èë¡£
ÒòΪʹÓÃÁËcglib£¬ËùÒÔbean²»ÄÜÊÇfinalÀ࣬·½·¨Ò²²»ÄÜÊÇfinalÀàÐÍ¡£
²éÕÒ·½·¨²»ÊÊÓÃÓÚ¹¤³§·½·¨£¬ÓÈÆä²»ÊÊÓÃÓÚÅäÖÃÀàÖеÄ@Bean·½·¨£¬ÒòΪÔÚÕâÖÖÇé¿öÏ£¬ÈÝÆ÷²»¸ºÔð´´½¨ÊµÀý£¬Òò´ËÎÞ·¨¶¯Ì¬´´½¨ÔËÐÐʱÉú³ÉµÄ×ÓÀà¡£
ÏÂÃæÊÇÒ»¸ö²éÕÒ·½·¨µÄÀý×Ó£º
public abstract class
CommandManagerB {
public Object process (Map commandState) {
// grab a new instance of the appropriate Command
interface
AsyncCommand command = createCommand();
return null;
}
// okay... but where is the implementation
of this method?
public abstract AsyncCommand createCommand();
} |
ÕâÀïÎÒÃǶ¨ÒåÁËÒ»¸ö³éÏóÀ࣬Ҫ²éÕҵķ½·¨¾ÍÊÇcreateCommand¡£·µ»ØµÄ¶ÔÏóÀ࣬ÈçÏ£º
public class AsyncCommand
{
}
|
ÏÂÃæÊÇXMLÅäÖÃÎļþ£º
<!-- a stateful bean
deployed as a prototype (non-singleton) -->
<bean id="myCommand" class= "com.flydean.beans.AsyncCommand"
scope="prototype">
<!-- inject dependencies here as required
-->
</bean>
<!-- commandProcessor uses statefulCommandHelper
-->
<bean id="commandManager" class=
"com.flydean.beans.CommandManagerB">
<lookup-method name= "createCommand"
bean="myCommand"/>
</bean> |
CommandMangerBÿ´Îµ÷ÓÃcreateCommand£¬¶¼»á·µ»ØÒ»¸öеÄAsyncCommandʵÀý¡£
ÔÚ»ùÓÚ×¢½âµÄÇé¿öÏ£¬Ò²¿ÉÒÔÕâÑùʹÓãº
public abstract class
CommandManagerC {
public Object process (Object commandState)
{
Command command = createCommand();
return command.execute();
}
@Lookup("myCommand")
protected abstract Command createCommand();
} |
ÆäÖÐ@Lookup(¡°myCommand¡±) ÖеÄÃû×ÖÒ²¿ÉÒÔÊ¡ÂÔ£¬Ôò°´ÕÕĬÈϵÄÀàÐÍÀ´½âÎö¡£
ÈÎÒâ·½·¨Ìæ»»
ÎÒÃÇÉõÖÁ¿ÉÒÔʹÓÃreplaced-methodÌæ»»beanµÄ·½·¨ÊµÏÖ¡£ÎÒÃÇÓиöMyValueCalculatorÀ࣬ÓÐÒ»¸öÎÒÃÇÏëÖØÐ´µÄ·½·¨computeValue¡£
public class MyValueCalculator
{
public String computeValue(String input) {
// some real code...
return "abc";
}
// some other methods...
} |
Ò»¸öʵÏÖÁËorg.springframework.beans.factory.support.MethodReplacer½Ó¿ÚµÄÀàÌṩÁËÐµķ½·¨£¬ÈçÏÂËùʾ£º
public class ReplacementComputeValue
implements MethodReplacer {
public Object reimplement (Object o, Method
m, Object[] args) throws Throwable {
// get the input value, work with it, and return
a computed result
String input = (String) args[0];
return "def";
}
} |
beanµÄ¶¨ÒåÈçÏ£º
<bean id="myValueCalculator"
class= "com.flydean.beans.MyValueCalculator">
<!-- arbitrary method replacement -->
<replaced-method name="computeValue"
replacer="replacementComputeValue">
<arg-type>String</arg-type>
</replaced-method>
</bean>
<bean id="replacementComputeValue"
class="com.flydean.beans .ReplacementComputeValue"/> |
±¾ÕµÄÀý×Ó¿ÉÒԲο¼bean-diÖеÄbean-di²¿·Ö¡£
|