2013-04-12 6 views
11

Mam klasy konfiguracyjnej java zapewniając fooBean bezpośrednio i barBean przez skanowanie składnika.Czy istnieje sposób na zastąpienie komponentu bean wykrytego przez skanowanie składnika?

@Configuration 
@ComponentScan(basePackages = { "com.blah" }) 
public class Config { 

    @Bean 
    public FooBean fooBean { 
     return new FooBean(); 
    } 
} 

i chcę, aby używać go w przypadkach testowych i muszę wymienić fasolę z mocks:

@Configuration 
@Import(Config.class) 
public class TestConfig { 

    @Bean 
    public FooBean fooBean { 
     return new FooBeanMock(); 
    } 

    @Bean 
    public BarBean barBean { 
     return new BarBeanMock(); 
    } 
} 

(tutaj nie ma sensu do ponownego użycia Config, ale w prawdziwym życiu mam 1000 fasoli i muszę drwić tylko kilka)

Tutaj fooBean zostaje nadpisany, ale nie barBean.

Skipping loading bean definition for %s: a definition for bean " + "'%s' already exists. This is likely due to an override in XML. 

Jest również oficjalnym problem dla niego: https://jira.springsource.org/browse/SPR-9682

czy ktoś zna żadnego obejścia, aby zastąpić fasoli odkryta przez skanowania komponentu?

biorąc pod uwagę, że komponent bean jest starszym kodem i nie można go zmodyfikować, a dla jego zależności nie ma opcji ustawiających (atrybuty prywatne + @Resource).

Odpowiedz

4

Spróbuj pominąć niepotrzebne fasolę:

@ComponentScan(basePackages = { "com.blah" }, excludeFilters = @Filter({UnnecessaryBean1.class, UnnecessaryBean2.class})) 
+0

Nie można ich pominąć w głównej konfiguracji. ponieważ potrzebuję komponentu bean i nie widzę możliwości utworzenia tego komponentu w inny sposób z powodu "Biorąc pod uwagę, że komponent bean jest starszym kodem i nie może być modyfikowany i nie ma żadnych programów ustawiających dla jego zależności (atrybuty prywatne + @Resource). ". W konfiguracji testowej, która importuje główną konfigurację, nie ma to żadnego sensu, ponieważ skanowanie komputera z zaimportowanej głównej konfiguracji zostanie wykonane. – mmoossen

+1

Możliwe, że możesz podzielić główną konfigurację na dwie części: 1) skanowanie komponentów 2) wszystko inne. A następnie zaimportuj tylko ten drugi w konfiguracji testowej. Będziesz więc nadpisywać ustawienia skanowania komponentów dla testów. –

+0

, które mogłyby to zrobić. dzięki za pomysł. spróbuję. – mmoossen

0

Tak można zastąpić fasoli odkryta przez skanowania komponentów. Robię to w testowych przypadkach. Używam konfiguracji XML, ale myślę, że konfiguracja Java będzie bardzo podobna.

spring.xml:

<context:component-scan base-package="cz.backend"/> 

MyBeanImpl.java

@Component("myBean") 
public class MyBeanImpl implements MyBean { 
    //Something 
} 

W folderze testu mam:

sprężyny test.xml:

<import resource="classpath:/spring.xml"/> 
<bean id="myBean" class="cz.backend.MyBeanTestMock"/> 

MyBeanTestMock.java:

public class MyBeanTestMock implements MyBean { 
    //Something 
} 

Nazwa override fasoli muszą być takie same.

+0

problem polegał na tym, że opisano kombinację skanowania komponentów i jawnej konfiguracji xml. – mmoossen

+0

jak widać w oficjalnym błędzie, został rozwiązany i rozwiązany w wersji 4.2 – mmoossen

Powiązane problemy