Was ist der Unterschied zwischen @Autowired und immer eine Bohne von der Anwendung Kontext?
Ich habe einen dao-unit-test ist wie folgt deklariert:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring/applicationContext.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public class RegisterDaoTest extends AbstractTransactionalJUnit4SpringContextTests {
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath:/spring/applicationContext.xml");
private IRegisterDao registerDao = applicationContext.getBean(IRegisterDao.class);
Wenn ich das Gerät testen, alle pass und ich kann sehen, dass die db immer neu in zwischen unit-test-Ausführungen.
Meiner test-db ist wie folgt definiert:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:mem:test;sql.syntax_ora=true;create=true"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<jdbc:initialize-database data-source="dataSource" ignore-failures="DROPS">
<jdbc:script location="file:Artifacts/Hsql Version Scripts/install/droptables.sql" separator=";"/>
<jdbc:script location="file:Artifacts/Hsql Version Scripts/install/install.sql" separator="/;"/>
</jdbc:initialize-database>
Aber wenn ich mein test, um zu verwenden, @Autowired, unten definiert, ist es nicht ausgeführt init-db-Skripte.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring/applicationContext.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public class RegisterDaoTest extends AbstractTransactionalJUnit4SpringContextTests {
/*
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath:/spring/applicationContext.xml");
private IRegisterDao registerDao = applicationContext.getBean(IRegisterDao.class);
*/
@Autowired
private IRegisterDao registerDao;
Sehe ich nicht, was der Unterschied ist. Ich habe zwei Datei ApplicationContext.XML-Dateien, eine im Hauptgebäude und eine in der test (so kann ich das überschreiben der db mit test-db)
Mir, es sollte ausführen die gleichen. Bin ich etwas fehlt?
Dank,
- Wo ist dein IRegisterDao definiert in der xml-Datei? können Sie bitte teilen Sie das?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Standardmäßig eine Feder Kontext zahlen keine Aufmerksamkeit auf @Autowired Anmerkungen. Um zu verarbeiten, der Kontext muss eine AutowiredAnnotationBeanPostProcessor bean registriert in den Kontext.
Register eins von diesen für Sie (zusammen mit ein paar anderen), also müssen Sie es (es sei denn, Sie registrieren AutowiredAnnotationBeanPostProcessor sich selbst, das perfekt ist gültig).
Wenn Sie mögen es nicht, wenn @Autowired in deinem code, dann können Sie explizit injizieren Eigenschaften in der XML-Verwendung , die nur bewegt sich die Unordnung von einem Ort zum anderen.
Wenn Ihr Rahmen ist äußerst einfach, dann können Sie implizite autowiring, wie beschrieben hier. Im wesentlichen, sagt Sie Frühjahr zu autowire automatisch durch den Namen der Eigenschaft oder Art. Dieses benötigt sehr wenig Konfiguration, aber es ist sehr schnell außer Kontrolle Gerät - es ist die automatische Natur bedeutet, es ist schwer zu kontrollieren, und gibt Ihnen sehr wenig Flexibilität.
Im Allgemeinen @Autowired ist wirklich die beste option.
Zusammenhang mit der Anwendung, werden Sie die Injektion der bean selbst.
Anmerkung Verdrahtung ist nicht aktiviert in der Spring-container standardmäßig. Also, bevor Sie
können annotation-based-autowiring, die Sie brauchen, um es zu aktivieren in der Spring-Konfiguration.
Der einfachste Weg, dies zu tun ist mit der
Hoffe, das hilft.
<context:annotation-config />
- Konfiguration, aber ich lief noch in der Abweichung. Ich dachte entlang der Linien als auch..., die ist, warum ich bin verwirrt, warum es einen Unterschied macht.Diese beiden Szenarien sind sehr unterschiedlich: im ersten Fall hast du ZWEI Kontexten Anwendung: bei test-spring-framework und einer manuell erstellen, indem Sie für jeden test. Spring-test-framework verwendet @ContextConfiguration um zu bestimmen, welche Kontext-Dateien geladen werden. Wenn die nachfolgenden tests verwenden die gleiche context-Dateien, der Kontext ist nicht neu, es wird wiederverwendet. Das ist, warum die db wird nur initialisiert, wenn Sie nicht zusätzlich erstellen Sie einen neuen Kontext manuell.
Wenn Sie brauchen, um eine erneute Initialisierung des db-für jede Prüfung, die Sie auslösen sollte, es manuell zum Beispiel in
@Before
Methode. Sie können auch versuchen annotation@DirtiesContext
für deinen test, neben@ContextConfiguration
.Deutlich zu machen: sollten Sie nicht erstellen Sie Rahmen manuell an, wenn mit spring-test-framework.
@Autowired
ist der richtige Ansatz, aber Sie müssen feststellen, dass andere Mittel zum initialisieren Sie die Datenbank vor jedem test.