package com.javasm.factory;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.HashMap;
/**
* 自定义bean工厂
*/
public class SimpleBeanFactory {
private static final HashMap<Class,Object> factory = new HashMap<>();
public static Object createBean(String className){
return createBean(className, true);
}
public static Object createBean(String className,boolean single){
Object instance = null;
try {
Class<?> aClass = Class.forName(className);
if(single){ //单例模式
Object instanceByInterface = getInstanceByInterface(aClass);
if(instanceByInterface != null){ //查找到的实例
return instanceByInterface;
}
}
//获取无参构造
Constructor<?> constructor = aClass.getConstructor();
//设置对象属性值
instance = constructor.newInstance(); //实例
//设置属性的值
setField(aClass,instance);
Class<?>[] interfaces = aClass.getInterfaces();
for (Class interfac : interfaces){
factory.put(interfac, instance);
}
} catch (Exception e) {
e.printStackTrace();
}
return instance;
}
private static Object getInstanceByInterface(Class aClass){
Object o = null;
Class<?>[] interfaces = aClass.getInterfaces(); //获取当前类的接口列表
for(Class cla : interfaces){ //循环接口列表
o = factory.get(cla); //根据接口类型去工厂查找
if(o != null){ //查找到接口的实例直接返回
return o;
}
}
Class<Object> objectClass = Object.class;
return o;
}
private static void setField(Class clazz,Object instance){
//获取当前类的成员属性
try {
Field[] declaredFields = clazz.getDeclaredFields();
for(Field field : declaredFields){ //遍历成员属性
Class<?> type = field.getType(); //获取当前成员属性的类型
Object o = factory.get(type); //根据当前成员属性的类型(接口对象类型)去工厂查找
if(o != null){
field.setAccessible(true); //设置当前属性暴力访问[private]
field.set(instance, o);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
自定义bean工厂(模拟IOC)
最新推荐文章于 2024-05-24 11:35:27 发布