Werfen wir einen Blick zurück auf die Geschichte der Computerentwicklung. Von Anfang an umfasste der erste Computer eine Fläche von 170 Quadratmetern und wog 30 Tonnen. Die heutigen persönlichen Notebooks sind etwas leichter Ein Trend im Entwicklungsprozess ist auch im Technologiebereich der gleiche. Enterprise JavaBean (Enterprise JavaBean, EJB) war bei seiner Einführung sehr erfolgreich, aber im Laufe der Zeit begannen die Leute, bequemere, einfachere und leichtere technische Frameworks zu verfolgen. So entstand Spring, und Spring war kontinuierlich in anderen Bereichen tätig (ich werde hier nicht auf Details eingehen), und die Essenz von Spring umfasst Kontrollinversion und Abhängigkeitsinjektion.
Eine kurze Diskussion der Inversion of Control (IOC)
Lassen Sie uns zunächst das Wort „Steuerung“ verstehen, das heißt im Fall der „Vorwärts“-Steuerung, wenn jemand in einem System eine Anforderung hat Bei Funktionen müssen mindestens zwei Klassen zusammenarbeiten. Verwenden Sie das Schlüsselwort new unter einer Eintragsklasse, um eine Objektinstanz einer anderen Klasse zu erstellen. Dies ähnelt der Idee der objektorientierten Programmierung Klasse, in dieser Einstiegsklasse muss ich jedes Mal, wenn ich esse, ein Paar Einweg-Essstäbchen kaufen (jedes Mal neu, wenn ich sie benutze). In dieser Beziehung muss „ich“ (der Anrufer) „jedes Mal“ die Initiative ergreifen, um „ Kaufen Sie Einweg-Essstäbchen (eine andere Kategorie). Ich sage den Essstäbchen, dass Sie ehrlich zu mir kommen und meine Hände nehmen. Nun, in dieser Beziehung der positiven Kontrolle ist es definitiv so unrealistisch und die Leute sind immer faul. Der genauere Weg besteht darin, ein Paar gewöhnliche Essstäbchen (keine Einwegstäbchen) zu kaufen und sie in einen Behälter (im Frühjahr IOC-Behälter genannt) zu stecken ), wenn Sie es verwenden müssen, sagen Sie zum Behälter: IOC Ich möchte Stäbchen verwenden (senden Sie eine Anfrage an den Behälter), und dann werden die Stäbchen in Ihre Hand „injiziert“, und in diesem Prozess Unter ihnen, Sie sind nicht mehr die kontrollierende Partei, sondern haben sich zu einem Anforderer entwickelt (obwohl Sie immer noch der Anrufer sind), der sich darauf verlässt, dass der Container Ihnen Ressourcen zur Verfügung stellt, und die Kontrolle befindet sich auf dem Container, daher wird dies üblicherweise als Inversion von bezeichnet Kontrolle.
Erste Beteiligung an der Abhängigkeitsinjektion (Abhängigkeitsinjektion)
Um mit dem obigen Beispiel fortzufahren, unter der Einheit der Umkehrung der Kontrolle: Wie kamen die Stäbchen zu meiner Hand (das heißt, wie kamen wir Holen Sie sich die Anforderungsklasse), dies ist ein Abhängigkeitsinjektionsprozess.
Lassen Sie uns noch einmal über IOC und DI sprechen
Das Hollywood-Prinzip in den Designprinzipien beschreibt: „Suchen Sie nicht nach uns, wir suchen nach Ihnen.“ Die Baidu-Enzyklopädie erklärt dies. Die Beschreibung lautet: „Rufen Sie uns nicht an, wir rufen Sie an (rufen Sie uns nicht an, wir rufen Sie an)“ Dies ist ein berühmtes Hollywood-Prinzip. In Hollywood müssen Sie, nachdem Sie Ihren Lebenslauf bei einer Schauspielfirma eingereicht haben, nur noch nach Hause gehen und warten. Da das darstellende Kunstunternehmen die vollständige Kontrolle über das gesamte Unterhaltungsprojekt hat, können Schauspieler die Aufträge des Unternehmens nur passiv annehmen und ihre Auftritte bei Bedarf abschließen. Dies spiegelt sich perfekt im IOC wider. Es ist das Designkonzept, das sich von der herkömmlichen Methode zum Erstellen von Objekten, also dem Erstellen eines neuen Objekts, zum Senden eines „Lebenslaufs“ an den IOC-Container und zum passiven Warten auf den IOC-Container ändert um Ressourcen für Sie zurückzugeben. Die Umkehrung der Kontrolle bezieht sich auf „das Unterhaltungsunternehmen kontrolliert die Schauspieler“, und wenn es um Abhängigkeit geht, bedeutet es, dass „die Schauspieler das Unternehmen brauchen, um für sie zu arbeiten“, indem sie sich auf den Container verlassen Der Prozess ist die Abhängigkeitsinjektion. Im Wesentlichen sind IOC und DI Manifestationen unterschiedlicher Dimensionen unter derselben Idee.
Code-Implementierung
Da der Prozess des Erhaltens von Ressourcen bei der Umkehrung der Kontrolle als Abhängigkeitsinjektion bezeichnet wird, konzentriert sich die Code-Implementierung hier auch auf die Abhängigkeitsinjektion. Es gibt drei Methoden der Abhängigkeitsinjektion: Konstruktionsinjektion, Einstellungsinjektion und Schnittstelleninjektion.
1. Schnittstelleninjektion: Definieren Sie die Informationen, die in die Schnittstelle eingefügt werden sollen, und schließen Sie die Injektion über die Schnittstelle ab. (Spring unterstützt diese Injektionsmethode nicht – der Grund für die Nichtunterstützung liegt darin, dass Spring behauptet, dass sie nicht invasiv ist und „ohne dieses Framework leben kann“. Wenn Schnittstelleninjektion verwendet wird, verstößt dies gegen dieses Prinzip.) Dies wird nicht der Fall sein Hier erfolgt die Erklärung der Code-Implementierung.
2.Setter-Injektion
Wir lösen uns zunächst von Spring, um die Setter-Injektion zu implementieren
public interface UserDao{ addUser(String username); }
public class UserDaoImpl implements UserDao{ @Override public void addUser(String username) { System.out.println("添加用户:"+username); } }
public class UserMessage{ private UserDao userDao; //使用设值方式赋值 public void setUserDao(UserDaoImpl userDao) { this.userDao = userDao; } @Override public void addUser(String userName, String password) { userDao.addUser(userName, password); } }
Wir beobachten sorgfältig, tatsächlich ist der Ansatz hier im Wesentlichen derselbe wie bei UserDao userDao=new UserDaoImpl() Hier muss ich Polymorphismus erwähnen, das heißt, die übergeordnete Klasse kann auf die Methode der Unterklasse verweisen. Ein Effekt besteht darin, die Kopplung zwischen User Message und UserDao zu verringern. Wenn man noch einmal darüber nachdenkt, könnte der Leser sagen, dass die Umkehrung der Kontrolle und die Abhängigkeitsinjektion, die Sie erwähnt haben, das Anfordern von Ressourcen aus dem Container erfordert. Lassen Sie uns oben erklären, wie die Injektion erfolgt.
<!-- 使用spring管理对象的创建,还有对象的依赖关系 --> <bean id="userManager" class="scau.zzf.service.UserMessage"> <!-- (1)UserMessageImpl使用了userDao,Ioc是自动创建相应的UserDao实现,都是由容器管理--> <!-- (2)在UserMessageImpl中提供构造函数,让spring将UserDao实现注入(DI)过来 --> <!-- (3)让spring管理我们对象的创建和依赖关系,必须将依赖关系配置到spring的核心配置文件中 --> <property name="userDao" ref="UserDao"></property> <!-- 构造注入 --> <!-- <constructor-arg ref="userDao"/> --> </bean> <bean id="UserDao" class="scau.zzf.Dao.UserDao"> </bean>
Zuerst müssen wir die Bean zusammenbauen, das heißt, die Bean im Spring-Container konfigurieren und dann die Bean-Objektinstanz zurückgeben. Wir können unsere XML-Datei über XmlBeanFactory lesen, um relevante Bean-Informationen zu erhalten.
public class test { public static void main(String[] args) throws Exception { BeanFactory factory=new XmlBeanFactory(new FileSystemResource("src/appllication.xml")); UserMessage userMessage=(UserMessage)factory.getBean("UserMessage"); userMessage.add("德玛西亚"); } }
Bei tatsächlichen Bewerbungen lesen wir die Informationen nicht manuell aus. Sie müssen lediglich eine Anfrage senden. Natürlich ist es notwendig, einen solchen Prozess zu verstehen.
Lassen Sie uns nun kurz erklären, wie Sie die Injektion durch Annotationen implementieren.
@Configuration public class UserConfig { @Bean public UserDao getUserDao(){ return new UserDao(); } @Bean public UserMessage getUserMessage(){ return new UserMesssgae(getUserDao); } }
Die Funktion von @Configuration besteht darin, die gesamte Klasse zu einer Konfigurationsklasse zu machen. Die @Bean-Annotation teilt Spring mit, dass die Methode unter dieser Annotation ein Objekt zurückgibt, und dieses Objekt muss die Bean registrieren Behält den Spring-Anwendungskontext bei. Standardmäßig sind die Beans von Spring Singletons. Das heißt, im obigen Beispiel ist das zurückgegebene Objekt von Anfang bis Ende dasselbe, egal wie oft wir getUserDao() verwenden. Weitere Anweisungen zur Konfiguration von JavaConfig finden Leser als Referenz im anderen Artikel des Autors „SSH eleganter konfigurieren“.