动态工厂
1、工厂的各自实现
public class TeacherFactory {
public Teacher createTeacher(){
Teacher teacher = new Teacher();
System.out.println("TeacherFactory 负责创建 teacher类实例对象..");
return teacher;
}
}
2、beandefine
public class BeanDefined {
/*
*
*
* <bean id ,class, scope.factory-bean,factory-method>
**/
private String beanId;
private String classPath;
private String scope ="singleton";
private String factoryBean=null;
private String factoryMethod=null;
public String getFactoryBean() {
return factoryBean;
}
public void setFactoryBean(String factoryBean) {
this.factoryBean = factoryBean;
}
public String getFactoryMethod() {
return factoryMethod;
}
public void setFactoryMethod(String factoryMethod) {
this.factoryMethod = factoryMethod;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
public String getBeanId() {
return beanId;
}
public void setBeanId(String beanId) {
this.beanId = beanId;
}
public String getClassPath() {
return classPath;
}
public void setClassPath(String classPath) {
this.classPath = classPath;
}
3、动态工厂
指定工厂创建
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BeanFactory {
private List<BeanDefined> beanDefinedList;
private Map<String ,Object> SpringIoc;//已经创建好实例对象
public List<BeanDefined> getBeanDefinedList() {
return beanDefinedList;
}
public BeanFactory(List<BeanDefined> beanDefinedList) throws Exception {
this.beanDefinedList = beanDefinedList;
SpringIoc = new HashMap(); //所有scope="singleton" 采用单类模式管理bean对象
for(BeanDefined beanObj:this.beanDefinedList){
if("singleton".equals(beanObj.getScope())){
Class classFile= Class.forName(beanObj.getClassPath());
Object instance= classFile.newInstance();
SpringIoc.put(beanObj.getBeanId(), instance);
}
}
}
public void setBeanDefinedList(List<BeanDefined> beanDefinedList) {
this.beanDefinedList = beanDefinedList;
}
public Object getBean(String beanId) throws Exception{
Object instance = null;
for(BeanDefined beanObj:beanDefinedList){
if(beanId.equals(beanObj.getBeanId())){
String classPath = beanObj.getClassPath();
Class classFile= Class.forName(classPath);
String scope=beanObj.getScope();
String factoryBean = beanObj.getFactoryBean();
String factoryMehtod=beanObj.getFactoryMethod();
if("prototype".equals(scope)){//.getBean每次都要返回一个全新实例对象
if(factoryBean!=null && factoryMehtod!=null){//用户希望使用指定工厂创建实例对象
Object factoryObj= SpringIoc.get(factoryBean);
Class factoryClass=factoryObj.getClass();
Method methodObj= factoryClass.getDeclaredMethod(factoryMehtod, null);
methodObj.setAccessible(true);
instance= methodObj.invoke(factoryObj, null);
}else{
instance= classFile.newInstance();
}
}else{
instance=SpringIoc.get(beanId);
}
return instance;
}
}
return null;
}
}
4、测试
1)将factorybean 的id放入beandefine中
将FactoryMethod放入beandefine中
beanObj.setFactoryBean("factory1");
beanObj.setFactoryMethod("createTeacher");
2)将工厂方法bean放入beandefinelist中
3)运行时会查找factory1 的 factorybean
Object factoryObj= SpringIoc.get(factoryBean); //(获取TeacherFactory)
Method.invoke(factoryObj, null); //(调用createTeacher())
public class TestMain {
public static void main(String[] args) throws Exception {
//1.声明注册bean
BeanDefined beanObj = new BeanDefined();
beanObj.setBeanId("teacher");
beanObj.setClassPath("com.myspring.beans.Teacher");
beanObj.setFactoryBean("factory1");
beanObj.setFactoryMethod("createTeacher");
beanObj.setScope("prototype");
BeanDefined beanObj2 = new BeanDefined();
beanObj2.setBeanId("factory1");
beanObj2.setClassPath("com.myspring.beans.TeacherFactory");
List configuration = new ArrayList();
configuration.add(beanObj);//spring核心配置
configuration.add(beanObj2);
//2.声明一个Spring提供BeanFacotory
BeanFactory factory = new BeanFactory(configuration);
//3.开发人员向BeanFactory索要实例对象.
Teacher t= (Teacher) factory.getBean("teacher");
System.out.println("t="+t);
}
}