まず、私たちはJavaオブジェクトを取得する方法を知っておく必要があるすべての4つがあります。
1.新しいステートメントは、オブジェクトをインスタンス化します。
2.リフレクションを通じてオブジェクトを作成します。
クローンによってオブジェクトを作成する。3.()メソッド
3.道をデシリアライズして、オブジェクトを作成します。
春の枠組みの中で、カップリングを低減するために、XMLは、以下に話をする、オブジェクトが反射することによって得られる、プロファイルプロパティをロードし、使用することができるプロキシ・オブジェクトのプロパティ・プロファイルをロードすることによって得られます。
第一歩
プロフィールを作成
accountService=com.itheima.service.impl.AccountServiceImpl
accountDao=com.itheima.dao.impl.AccountDaoImpl
説明のプロフィール:
AccountServiceのは、鍵となります
com.itheima.service.impl.AccountServiceImplクラスの完全修飾名である値である(完全修飾クラス名は、オブジェクトによって反映されるように得られるようにする理由)
第二のステップ
次に読み出されるコンフィギュレーション・ファイルをロードするために、オブジェクトのメソッドを使用してオブジェクトのプロパティの一例です
設定ファイルの読み込み完了は、取り扱いが容易なオブジェクトを作成するために、クラスの完全修飾名と、完全修飾クラス名を取得します
package com.itheima.factory;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class BeanFactory {
private static Properties props;
static {
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
//实例化对象
props = new Properties();
try {
//读取配置文件
props.load(in);
} catch (IOException e) {
e.printStackTrace();
}
}
public static Object getBean(String beanName){
Object bean = null;
//getProperty方法 官方文档解释
/*
使用此属性列表中指定的键搜索属性。
*/
String beanPath = props.getProperty(beanName);
try {
//获得对象
bean = Class.forName(beanPath).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
//返回对象,谁调用我我返回给谁
return bean;
}
}
第三段階
復興
以下に示すように上記のコードは、依然として問題が問題です
public static void main(String[] args) {
//IAccountService as = new AccountServiceImpl();
for(int i=0;i<5;i++){
IAccountService as = (IAccountService)BeanFactory.getBean("accountService");
as.saveAccount();
System.out.println(as);
}
}
上記のコードは、私は彼に5回のサイクルを聞かせて、図に示すように、各時間は、彼の出力の結果は、同じではありません
一度呼び出されていない、これは非効率の原因となります、新しいオブジェクトを生成します。
だから我々はこの種の問題を解決する方法(リード春のコンテナに対応する第4ステップの概念)を見て、第四段階に来ました
第四段階
あなたは、新しいオブジェクトを作成するたびにgetBeanメソッドを呼び出しますなぜ我々は最初の)理由はここのnewInstance(ということで、知っている必要があります
解決策は、彼がアップし、保存するので、静的コード・ブロック、オブジェクトを取得するだけでなく、コンテナマップの一例が、また、容器内部にオブジェクトを追加する地図を取っ完成したオブジェクトを作成することでした。
package com.itheima.factory;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class BeanFactory {
private static Properties props;
private static Map<String,Object> beans;
static {
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
//实例化对象
props = new Properties();
try {
//读取配置文件
props.load(in);
//实例化容器
beans = new HashMap();
//查看API文档发现
//keys()继承自Hashtable<Object,Object>
//使用keys()可以获取配置文件的所有键
Enumeration keys = props.keys();
//遍历枚举
while(keys.hasMoreElements()){
String key = keys.nextElement().toString();
//根据Key获取value
String beanPath = props.getProperty(key);
//反射创建对象
Object value = Class.forName(beanPath).newInstance();
//把key和value存入map集合
beans.put(key,value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//对象已经在初始化时就创建了,所以获取对象就没有那么麻烦了
public static Object getBean(String beanName) {
return beans.get(beanName);
}
}
最後のステップ
静的コードブロックの初期化中にオブジェクトが作成するだけでなく、コンテナに追加されているので今、どんなに何回getBean呼び出し、オブジェクトは、一つだけ、なぜ一つだけではありません、あなたはありませんもう一度、コンテナから取得するgetBeanメソッドを介して取得します取得するのnewInstance()
記事を書いた後:
私は春を学ぶための最初の時間を覚えて、時間は20日前です
今日、再び春を学び、水が突然ハハ、記事を感じることができます。
私はひどく書かれて見て、首長を渡す、それがアドバイスがたくさんあります。