一、通过工厂+反射+配置文件创建对象

通过工厂+反射+配置文件获取对象

/**
 * @author: promsing
 * @date: 2021/3/7 - 10:09
 * @description: 通过使用工厂+配置文件+反射实现创建对象
 * @version: 1.0
 */
public class absfactory {
 
 //声明一个变量(多例模式,每次通过工厂都会创建一个不同的实例)
 private static object obj;
 
 public static object createtype(string createname){
  //自动释放资源--使用绝对路径
  try( inputstream is =new fileinputstream("src\\factory.properties")) {
   //配置文件类
   properties pro=new properties();
   pro.load(is);
   // system.out.println(pro.size());
   //获取参数
   string property = pro.getproperty(createname);
   obj = class.forname(property).newinstance();
   
  } catch (instantiationexception e) {
   e.printstacktrace();
  } catch (illegalaccessexception e) {
   e.printstacktrace();
  } catch (classnotfoundexception e) {
   e.printstacktrace();
  } catch (filenotfoundexception e) {
   e.printstacktrace();
  } catch (ioexception e) {
   e.printstacktrace();
  }finally {
   return obj;
  }
 }
 
}

配置文件如下

//以key,value的形式,主要value要写全类名,不要加分号
accountservice=com.dynamic.service.impl.accountserviceimpl
accountdao=com.dynamic.dao.impl.accountdaoimpl

二、通过map容器间接获取对象

通过map容器间接获取对象,与spring中的ioc容器类似,采用立即加载策略

/**
 * @author: promsing
 * @date: 2021/3/19 - 11:50
 * @description: 模仿ioc容器,将创建的对象放在map集合中,加载该类时会读取配置文件中,将类放入map中
 * @version: 1.0
 */
public class beanfactory {
 //定义一个properties对象
 private static properties props;
 //定义一个map,用于存放我们创建的对象(单例,当类加载之后就有了对象,之后从map中获取)
 private static map<string,object> beans;
 
 //容器
 static {
  try {
   props=new properties();
   //将bean.properties放在了resources路径下
   inputstream is=beanfactory.class.getclassloader().getresourceasstream("bean.properties");
   props.load(is);
   //实例化容器
   beans=new hashmap<string,object>();
   //从配置文件中获取所有key值
   enumeration<object> keys = props.keys();
   while (keys.hasmoreelements()){
    //取出每一个key
    string key = keys.nextelement().tostring();
    //根据key获取value
    string path = props.getproperty(key);
    object value=class.forname(path).newinstance();
    //放入容器中
    beans.put(key,value);
   }
  }catch (exception e){
   e.printstacktrace();
  }
 
 }
 
 //提供一个访问map容器的入口
 public static object getinstance(string name){
  return beans.get(name);
 }
 
}

配置文件内容如下

accountservice=com.dynamic.service.impl.accountserviceimpl
accountdao=com.dynamic.dao.impl.accountdaoimpl

以上两部分归到根上都是通过反射创建对象,jdk8在反射创建对象时,做了很大的增强,提高了性能。其实spring ioc与以上实现创建对象的原理是一致的,spring ioc做的就是这件事情,只是它封装的更好而已(当然还有其他的增强,o(∩_∩)o哈哈~)。

到此这篇关于java通过工厂、map容器创建对象的方法的文章就介绍到这了,更多相关java创建对象内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!