Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Spring5²Î¿¼Ö¸ÄÏ:ÒÀÀµ×¢Èë
 
×÷Õߣºflydean³ÌÐòÄÇЩÊÂ
  1651  次浏览      27
 2020-9-18  
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜÁËÒÀÀµ×¢Èë¡¢ÒÀÀµ×¢ÈëµÄÅäÖÃÏê½â¡¢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ÔªËØ£º

<ref bean="someBean"/>

ÄÚ²¿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²¿·Ö¡£

 
   
1651 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
JavaÐéÄâ»ú¼Ü¹¹
JVM¡ª¡ªJavaÐéÄâ»ú¼Ü¹¹
JavaÈÝÆ÷Ïê½â
Java½ø½×--ÉîÈëÀí½âArrayListʵÏÖÔ­Àí
Java²¢·¢ÈÝÆ÷£¬µ×²ãÔ­ÀíÉîÈë·ÖÎö
×îпγÌ
java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
SpringBoot&Cloud¡¢JavaSSM¿ò¼Ü
Spring Boot Åàѵ
³É¹¦°¸Àý
¹úÄÚÖªÃûÒøÐÐ Spring+SpringBoot+Cloud+MVC
±±¾© Java±à³Ì»ù´¡ÓëÍøÒ³¿ª·¢»ù´¡
±±¾© Struts+Spring
»ªÏÄ»ù½ð ActiveMQ Ô­Àí
ijÃñº½¹« Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢