SpringのIoCコンテナを調査する
このブログは、初心者ではなく、春の使い方をすでに知っている読者に適しています。ここのブロガーは、なぜこれを将来的に使用できるのかを考えるためのステップも使用します。私は最下層に深く入りたいのですが、明らかに深層とは呼べません。
IoCコンセプト
IoC(Inverse of Control)は、文字通り制御の逆転を意味し、プログラムの結合を減らす目的で、Springを介したオブジェクトの作成とオブジェクト間の呼び出しを管理します。次に、制御と反転の2つの単語があります。IoCコンテナの学習に2つの単語を取り入れましょう。
オブジェクト間の呼び出し
あるオブジェクトで別のオブジェクトを使用する場合、そのオブジェクトを取得するために、コンストラクターメソッドであるかファクトリーメソッド(ファクトリーメソッドは実際には新しい)であるかに関係なく、別のオブジェクトのインスタンスを明示的に作成する必要があります。
オブジェクト間で呼び出すには3つの方法があります
1.従来のJavaオブジェクトのメソッドの呼び出し
class UserSerivce{
addUser(){
UserDao dao = new UserDao();
dao.add();
}
}
class UserDao{
add(){
System.out.println("add");
}
}
ここで、UserDaoのメソッドが変更されると、UserServiceのコードも明らかに変更されます。
2.工場モデル
class UserService{
void add(){
UserDao dao = UserFactory.getUserDao();
}
}
class UserDao{
add(){
//*****
}
}
class UserFactory{
public static UserDao getUserDao(){
return new UserDao();
}
}
3.今日見ていくIoCです。
IoCを使用して作成
IoCの下部で使用される3つのテクノロジー
- xml解析
- ファクトリーモード
- 反射
IoCプロセス
1#xml構成クラスを作成し、作成したオブジェクトを構成する
<bean id="userDao" class="com.feng.UserDao">
</bean>
2#ファクトリクラスを作成し、リフレクションメカニズムを使用してオブジェクトを作成します
class UserFactory{
public static UserDao getUserDao(){
String classValue = class属性值;
//利用xml解析xml文件中的class属性来获取class值com.feng.UserDao
Class clazz = Class.forName(classValue);
return (userDao)clazz.newInstance();
}
}
SpringのIoCメソッドはプログラム間の結合を最小限に抑え、オブジェクトの作成とオブジェクト間のスケジューリングを管理のためにSpringにスローできることがわかります。
SpringIoC容器
IoCの考え方はコンテナーに基づいています。IoCコンテナーの最下層は実際にはオブジェクトファクトリです。コンテナーをインスタンス化するために、Springには2つの方法(2つのインターフェイス)が用意されています。
BeanFactory:
BeanFactoryは、IOCコンテナの基本的な機能を提供します。Springのドキュメントで述べたように、このクラスは現在、古いバージョンとの下位互換性を保つためだけのものです。使用する必要がない限り、2番目のコンテナを使用してください。
等:
BeanFactory beanFactory = new ClassPathXmlApplicationContext("bean1.xml");
//加载配置文件不创建对象
User user = beanFactory.getBean("user",user.class);
//此时才创建对象
ApplicationContext:
APIドキュメントから、ApplicationContextがBeanFactoryのサブインターフェースであることを知ることができます。また、ドキュメントから、ApplicaionContextがBeanFactoryのすべての関数を含むだけでなく、より多くの関数をサポートしていることもわかります。
等:
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");//加载配置文件时,创建对象
User user = context.getBean("user",User.class);
ApplicationContextには多くの実装があることがわかります。一般的に使用される2つは、誰もが使い慣れているわけではありません。
FileSystemXmlApplicationContext:默认是从系统的盘符下获取文件
ClassPathXmlApplicationContext:默认是指项目的classpath路径下面的配置文件
IoCエイリアス、依存関係注入
依存性注入(DI、依存性注入)
いわゆる依存性注入とは、IOCコンテナが実行時に特定の依存性を動的にオブジェクトに注入することです。IoCがDIとも呼ばれるのはなぜですか?実際、IoCコンテナーを導入し、依存性注入を使用してオブジェクト間のデカップリングを実現することにより、別の観点から1つを説明しています。
わかりやすい例を次に示します。たとえば、オブジェクトAとオブジェクトBの2つのオブジェクトがあるとします。ここで、AがBを呼び出します。IoCコンテナが必要ですか?Aはコンピューターと見なされ、Bはマウス、キーボード、ハードディスク、およびUSBフラッシュドライブである可能性があります。いずれにしても、コンピューターに接続してコンピューターで使用できます。コンピューター(オブジェクトA)にはUSBフラッシュドライブ(オブジェクトB)IoCコンテナは誰ですか?あなたはIoCコンテナーですが、何をしましたか?コンピューターが使用したいものであれば何でも接続でき、接続後は、USBフラッシュドライブを読み取るか、マウスを接続して、オブジェクトBを制御できます。あなた(IoCコンテナーは彼を満足させる責任があるだけです)、彼はマウスとキーボードの作成方法(オブジェクトの作成)やそれを破壊する方法について心配する必要はありません。とにかく、あなた(IoC)がすべての面倒を見てくれますか?理解。
USBフラッシュドライブ(オブジェクトB)が必要ですが、IoCコンテナーは誰ですか?あなたはIoCコンテナーですが、何をしましたか?コンピューターが使用したいものであれば何でも接続でき、接続後は、USBフラッシュドライブを読み取るか、マウスを接続して、オブジェクトBを制御できます。あなた(IoCコンテナーは彼を満足させる責任があるだけです)、彼はマウスとキーボードの作成方法(オブジェクトの作成)やそれを破壊する方法について心配する必要はありません。とにかく、あなた(IoC)がすべての面倒を見てくれますか?理解。
従来の実装では、オブジェクトAはそれ自体が新規である必要があり、さまざまなコンポーネント間の結合は非常に深刻です。IoCコンテナを使用すると、プログラムの内部から外部コンテナにコンポーネント間の関係がもたらされます。つまり、コンテナは実行時にコンポーネント間の特定の依存関係をコンポーネントに動的に注入します。
SpringIoCの例
エンティティークラス
public class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Hello{" +
"name='" + name + '\'' +
'}';
}
}
beans.xml
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--使用Spring来创建对象,在Spring这些都成为Bean
类型 变量名 = new 类型();
Hello hello = new Hello();
id = 变量名
class = new 的对象
property 相当于给对象的属性设置一个值
ref:引用Spring容器中创建好的对象
value:具体的值,基本数据类型
-->
<bean id="hello" class="com.feng.pojo.Hello">
<property name="name" value="Spring"/>
</bean>
</beans>
テストクラス
public class MyTest {
public static void main(String[] args) {
//获取Spring的上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext( "beans.xml");
//我们的对象现在都在Spring中管理,我们要使用直接去里面取出来即可
Hello hello = (Hello)context.getBean("hello");
System.out.println(hello.toString());
}
}