2011-02-09 9 views
18

वसंत ढांचे एक्सएमएल-आधारित कॉन्फ़िगरेशन के साथ एनोटेशन-आधारित कॉन्फ़िगरेशन ओवरराइड कर सकते हैं? मुझे एक बीन की निर्भरता को बदलने की जरूरत है जो पहले ही एनोटेशन के माध्यम से परिभाषित है और मैं बीन का लेखक नहीं हूं।वसंत ढांचे एक्सएमएल-आधारित विन्यास के साथ एनोटेशन-आधारित कॉन्फ़िगरेशन ओवरराइड कर सकते हैं?

उत्तर

14

यह ठीक होना चाहिए। एक वसंत बीन संदर्भ आपको "बाद वाले" परिभाषाओं को "पहले वाले" ओवरराइड करने के साथ, बीन्स को फिर से परिभाषित करने की अनुमति देता है। यह एक्सएमएल परिभाषित सेम के साथ-साथ एनोटेशन-परिभाषित बीन्स पर भी लागू होना चाहिए, भले ही वे मिश्रित हों।

उदाहरण के लिए, यदि आप

@Configuration 
public class MyAnnotatedConfig { 
    @Bean 
    public Object beanA() { 
     ... 
    } 
} 

<bean class="com.xyz.MyAnnotatedConfig"/> 

<bean id="beanA" class="com.xyz.BeanA"/> 

है इस मामले में, beanA के XML परिभाषा पूर्वता लेना चाहिए।

+2

हालांकि, यह इस प्रकार के आधार पर '@ ऑटोवायर' फ़ील्ड के लिए काम नहीं कर सकता है? यह 'org.springframework.beans.factory को फेंकने लगता है। NoSuchBeanDefinitionException: प्रकार का कोई अनोखा बीन [com.xyz.BeanA] परिभाषित नहीं किया गया है: अपेक्षित एकल मिलान बीन लेकिन पाया 2: [बीनए, बीनए]' (वसंत 3.2) – Arjan

16

मुझे नहीं पता था कि वसंत कॉन्फ़िगरेशन मिश्रण कर सकता है। यहां विस्तृत और बहुत उपयोगी उदाहरण है।

बीन 1 वास्तविक बीन है जिसे हम कॉन्फ़िगर कर रहे हैं।

package spring; 

import javax.annotation.PostConstruct; 
import javax.annotation.PreDestroy; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.stereotype.Component; 

@Component 
public class Bean1 { 

    private String naber; 

    @Autowired 
    @Qualifier("FireImpl1") 
    private Fire fire; 

    @PostConstruct 
    public void init() { 
     System.out.println("init"); 
     getFire().fire(); 
    } 

    @PreDestroy 
    public void destroy() { 
     System.out.println("destroy"); 
    } 

    public void setNaber(String naber) { 
     this.naber = naber; 
    } 

    public String getNaber() { 
     return naber; 
    } 

    public void setFire(Fire fire) { 
     this.fire = fire; 
    } 

    public Fire getFire() { 
     return fire; 
    } 
} 

आग निर्भरता इंटरफ़ेस

package spring; 

public interface Fire { 

    public void fire(); 
} 

और डमी कार्यान्वयन 1

package spring; 

import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.stereotype.Component; 

@Component 
@Qualifier("FireImpl1") 
public class FireImpl1 implements Fire { 

    public void fire() { 
     System.out.println(getClass()); 
    } 
} 

और डमी कार्यान्वयन है 2

package spring; 

import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.stereotype.Component; 

@Component 
@Qualifier("FireImpl2") 
public class FireImpl2 implements Fire { 

    public void fire() { 
     System.out.println(getClass()); 
    } 
} 

config.xml

<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" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation=" 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 
      http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 
    <context:component-scan base-package="spring" /> 
    <bean id="bean1" class="spring.Bean1"> 
     <property name="naber" value="nice" /> 
     <property name="fire" ref="fireImpl2" /> 
    </bean> 
</beans> 

और मुख्य वर्ग

package spring; 

import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class Spring { 

    public static void main(String[] args) { 

     ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring/config.xml"); 
     applicationContext.registerShutdownHook(); 
     Bean1 bean = (Bean1) applicationContext.getBean("bean1"); 
     System.out.println(bean.getNaber()); 
    } 
} 

यहां उत्पादन

init 
class spring.FireImpl2 
nice 
destroy 

हालांकि एनोटेशन FireImpl1, xml config FireImpl2 साथ overrided को निर्भरता को हल करता है। बहुत अच्छा है।

संबंधित मुद्दे