为了对Spring原理进行理解,自建工厂将类的实例化交给第三方。
demo结构图如下
代码如下
package it.lyz.dao.iml;
import it.lyz.dao.IAccount;
public class Account implements IAccount {
public void save() {
System.out.println("保存了账户!");
}
}
package it.lyz.dao;
public interface IAccount {
void save();
}
package it.lyz.factory;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class factorybean {
private static Properties prop;
private static Map<String,Object> beans;
static {
try{
prop = new Properties();
InputStream in = factorybean.class.getClassLoader().getResourceAsStream("bean.properties");
prop.load(in);
beans = new HashMap<String, Object>();
Enumeration keys = prop.keys();
while (keys.hasMoreElements()){
String key = keys.nextElement().toString();
String path = prop.getProperty(key);
Object ob = Class.forName(path).newInstance();
beans.put(key,ob);
}
}catch (Exception e){
throw new ExceptionInInitializerError("初始化失败");
}
}
public static Object getBeanName(String beanname){
return beans.get(beanname);
}
}
package it.lyz.service.iml;
import it.lyz.dao.IAccount;
import it.lyz.dao.iml.Account;
import it.lyz.factory.factorybean;
import it.lyz.service.IAccountservice;
public class Accountservice implements IAccountservice {
private IAccount account = (IAccount)factorybean.getBeanName("Account");
public void saveAccount() {
int i = 1;
// IAccount account = (IAccount)factorybean.getBeanName("Account");
System.out.println(account);
account.save();
}
}
package it.lyz.service;
public interface IAccountservice {
void saveAccount();
}
package it.lyz.ui;
import it.lyz.dao.IAccount;
import it.lyz.dao.iml.Account;
import it.lyz.factory.factorybean;
import it.lyz.service.IAccountservice;
import it.lyz.service.iml.Accountservice;
public class client {
public static void main(String[] args) {
/*
IAccountservice accountservice = (Accountservice)factorybean.getBeanName("Accountservice");
// IAccount account = (Account)factorybean.getBeanName("Account");
//System.out.println(account);
System.out.println(accountservice);
accountservice.saveAccount();
*/
for(int i=0;i<5;i++) {
IAccountservice as = (IAccountservice) factorybean.getBeanName("Accountservice");
System.out.println(as);
as.saveAccount();
}
}
}
bean.properties配置
Accountservice=it.lyz.service.iml.Accountservice
Account=it.lyz.dao.iml.Account//Accountservice需要写在前面,否则,Accountservice中在方法外面对Account进行初始化会报空指针异常,即无法获取到Account实例