2017-01-26 20 views
8

Dahili olarak yayı kullanan bir sınıf kavanozda (dış kitaplık) var.Belirli bir fasülyenin yay otomatik kapaması nasıl devre dışı bırakılır?

@Configuration 
public class TestConfig { 

    @Bean 
    public TestBean bean() { 
     return Library.createBean(); 
    } 
} 

Bu istisna tr atış yapıyor: Ben yapılandırma var Benim uygulamada

public class Library { 

    public static TestBean createBean() { 
     ApplicationContext context = new AnnotationConfigApplicationContext(springConfigs); 
     return context.getBean(TestBean); 
    } 
} 

:

@Component 
public class TestBean { 

    @Autowired 
    private TestDependency dependency; 

    ... 
} 

Ve kütüphane inşa nesneler için API sağlar: Yani kütüphane sınıf bir benzeri yapıya sahiptir : Field dependency in TestBean required a bean of type TestDependency that could not be found..

Fakat Bahar, bir şey enjekte etmeye çalışmamalıdır, çünkü fasulye zaten yapılandırılmıştır.

Belirli bir çekirdekten Spring otomatik kablo sistemini devre dışı bırakabilir miyim?

+0

Fasulye zaten nasıl yapılandırıldığını biliyor musunuz? – randominstanceOfLivingThing

+0

'Library.createBean()' nesneyi yarattığından beri, neden TestDependency ' – Avinash

+0

'dan @Outowired koydu? Bu bir kütüphane kaynak kodu. – sata

cevap

3

, bir fasulye değil sarmak için bir yardımcıya yarattı Otomatik Kabuk:

public static <T> FactoryBean<T> preventAutowire(T bean) { 
    return new FactoryBean<T>() { 
     public T getObject() throws Exception { 
      return bean; 
     } 

     public Class<?> getObjectType() { 
      return bean.getClass(); 
     } 

     public boolean isSingleton() { 
      return true; 
     } 
    }; 
} 

... 

@Bean 
static FactoryBean<MyBean> myBean() { 
    return preventAutowire(new MyBean()); 
} 
+0

Harika genel çözüm! – sata

0

Tam olarak değil ama otomatikleştirilmiş ek açıklamada gerekli = false (@Autoried(require=false))'u ekleyebilirsiniz. Ancak, NullPointer istisnasının size ulaşabileceğine dikkat edin.

+0

Yapamam. 'TestBean' bir kütüphane kaynak kodundan bir sınıf. – sata

+0

Bunun için TestDependency için beand oluşturmak ve autowire-candidate = false işaretlemek için XML yaklaşımı ile gitmek zorundayım korkarım o zaman o autowiring – LowCool

+0

için işaretlemez Eğer @Outowired işaretlerseniz (require = false) o zaman her zaman boş ya da otomatik olarak kurmayı dener ve başarısız olursa devam edilsin mi? – jDub9

0

Belirli bir fasülyenin otomatik kablolamasını devre dışı bırakmak imkansız gibi görünüyor.

Bazı geçici çözümler var. Biz bir hedef fasulye için sarmalayıcı yapabilir ve bunun yerine orijinal fasulye kullanmalı: Bu benim için çalıştı

public class TestBeanWrapper { 

    private final TestBean bean; 

    public TestBeanWrapper(TestBean bean) { 
     this.bean = bean; 
    } 

    public TestBean bean() { 
     return bean; 
    } 
} 

@Configuration 
public class TestConfig { 

    @Bean 
    public TestBeanWrapper bean() { 
     return new TestBeanWrapper(Library.createBean()); 
    } 
} 

@RestController 
public class TestController { 

    @Autowired 
    private TestBeanWrapper bean; 

    ... 
} 
3

: Juan'ın cevabı @ dayanarak

import org.springframework.beans.factory.FactoryBean; 
... 
@Configuration 
public class TestConfig { 

    @Bean 
    public FactoryBean<TestBean> bean() { 
     TestBean bean = Library.createBean(); 

     return new FactoryBean<TestBean>() 
     { 
      @Override 
      public TestBean getObject() throws Exception 
      { 
       return bean; 
      } 

      @Override 
      public Class<?> getObjectType() 
      { 
       return TestBean.class; 
      } 

      @Override 
      public boolean isSingleton() 
      { 
       return true; 
      } 
     }; 
    } 
} 
+0

'un ur tarama paketindeki xml dosyasını içe aktarmam gerekiyor. Teşekkürler! – Alexey

+0

Vay! Bu gerçekten çalışıyor, teşekkürler! – sata