Ermöglichen Sie der APP, die die Instanz direkt erstellt hat, die Instanz über den DI-Container abzurufen. Die Vorteile der Verwendung von DI sind wie folgt.
Die im DI-Container registrierte Komponente heißt "Bean". Die Konfiguration wird als "Bean-Definition" bezeichnet.
Wird als Konfigurationsklasse mit @Configuration deklariert Bean Definition mit @Bean
AppConfig.java
@Configuration
public class AppConfig {
@Bean
TestRepository testRepo() {
retrun new TestRepositoryImpl();
}
}
--xml Basis
Bean-Definition im
.xml
<beans>
<bean id="test" class="com.test.TestImpl" />
</beands>
--Notationsbasis
Eine Methode zum Scannen einer Klasse mit einer Anmerkung zur Bean-Definition und zum Registrieren im DI-Container (Komponentenscan). Die intuitivste Implementierung.
Bean Definition Seite
TestImpl.java
@Component
publi classTestImpl implements Test {
}
Benutzerseite Fügen Sie dem Konstruktor @Autowired für die automatische Injektion hinzu.
TestImpl.java
@Component
publi class TestUseImpl implements TestUse {
@AutoWired
public TestUseImpl(Test test) {
}
}
Es gibt drei Methoden, aber die Konstruktorinjektion scheint gut zu sein. Ausgelassen. Eine konstellare Injektion scheint empfohlen zu werden, da die DI-Instanz endgültig wird. https://irof.hateblo.jp/entry/2017/04/16/222737
Auto-Wiring ist ein Mechanismus, der automatisch in einen DI-Container injiziert wird, ohne explizit eine Bean mit @Bean zu definieren. Wird intern nach Typ oder Name aufgelöst. Wenn jedoch mehrere DI-Container mit demselben Typ definiert sind, tritt ein Fehler auf, da der DI-Container keine Rolle spielt, welcher verwendet wird. In solchen Fällen werden @Qualifier und @Resouce verwendet.
Angenommen, Sie registrieren eine Methode, die dieselbe Convert-Klasse in der Bean zurückgibt, wie unten gezeigt.
AppConfig
@Configuration
@ComponentScan
public class AppConfig {
@Bean
Convert getA() {
return new ConvertA();
}
@Bean
Convert getB() {
return new ConvertB();
}
Bei dem Versuch, wie folgt zu injizieren, kann die pg-Seite nicht bestimmen, ob "getA" oder "getB" injiziert werden soll.
MainService
@Service
public class MainService {
@Autowired
private Convert getA;
public String execute() {
return getA.getConvert();
}
Es ist möglich zu trennen, indem explizit angegeben wird, welches mit der folgenden Beschreibung injiziert werden soll.
@Qualifier("getA")
@Autowired
private Convert getA;
// @Resouce durchsucht den Container nach der Zielinstanz nach dem Eigenschaftsnamen
//Wenn der Name mit dem Namen der Zieleigenschaft übereinstimmt, kann er weggelassen werden.
@Resouce(name = "getA")Oder@Resouce
@Autowired
private Convert getA;
Schlechtes Beispiel
@Service
public class MainService {
private final Convert getA;
@Resouce(name = "getA")
public MainService (Convert a) {
getA = a;
}
public String execute() {
return getA.getConvert();
}
Recommended Posts