Java通过工厂、Map容器创建对象的方法

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

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

/**
 * @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创建对象内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java通过反射创建对象并调用方法

    这篇文章主要介绍了java通过反射创建对象并调用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.用户类 package com.lf.entity; import com.lf.annotation.SetProperty; import com.lf.annotation.SetTable; public class UserEntity { private String userName; private int userAge;

  • Java使用反射创建对象示例

    本文实例讲述了Java使用反射创建对象.分享给大家供大家参考,具体如下: 一 实战 1 代码 import java.util.*; import java.io.*; public class ObjectPoolFactory { // 定义一个对象池,前面是对象名,后面是实际对象 private Map<String ,Object> objectPool = new HashMap<>(); // 定义一个创建对象的方法, // 该方法只要传入一个字符串类名,程序可以根据该

  • Java为什么基本数据类型不需要进行创建对象?

    Java是一门面向对象的语言,即一切皆是对象!那么为何数据类型中还分为:基本类型和对象? Java中有8种基本数据类型boolean.byte.short.char.int.flaot.long.double,基本数据类型作为Java语言的一部分,但基本数据类型不是对象,基本数据类型放在堆栈中,对象放在堆中.堆的读写速度远不及栈,如果使用基本数据类型相当于在栈上进行操作,对变量的创建和销毁速度非常快.相反,如果用类进行定义变量,需要在堆中进行操作,创建和销毁速度都比较慢. 出于性能方面的考量,为

  • Java创建对象的几种方法

    有时候,也可能碰到这样面试题,如: Java创建对象有哪几种方法? 除了new之外,java创建对象还有哪几种方式? 本文结合例子,给出几种Java创建对象的方法,Here we go~~~~ 使用new创建 这是最常用的一种.如: Book book = new Book(); 示例如下: package test; import java.io.Serializable; import java.util.List; /** * @author wangmengjun * */ public

  • Java String创建对象实例解析

    本文研究的主要是Java String创建对象的问题,具体介绍如下. 首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,String只是一个引用变量. 所有的字符串都是String对象,由于字符串常量的大量使用,java中为了节省时间,在编译阶段,会把所有字符串常量放在字符串常量池中,字符串常量池的一个好处就是可以把相同的字符串合并,占用一个空间. 虽然在Java中无法直接获取变量的地址,但是可以用==判断一下两个引用变量是否指向了一个地址即一个对象. 栈内存 堆内存 基础类

  • Java中五种不同方法的创建对象

    前言 作为Java开发者,我们每天都会创建大量的对象,但是,我们总是使用管理依赖系统(如Spring框架)来创建这些对象.其实还有其他方法可以创建对象,在接下来的文章中我会进行详细介绍. 1.使用new关键字 这是最常见的创建对象的方法,并且也非常简单.通过使用这种方法我们可以调用任何我们需要调用的构造函数. Employee emp1 = new Employee(); 0: new #19 // class org/programming/mitra/exercises/Employee 3

  • Java中创建对象的5种方式总结

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码 使用new关键字 } → 调用了构造函数 使用Class类的newInstance方法 } → 调用了构造函数 使用Constructor类的newInstance方法 } → 调用了构造函数 使用clone方法 } → 没有调用构造函数 使用反序列化 } → 没有调用构造函数

  • Java通过工厂、Map容器创建对象的方法

    一.通过工厂+反射+配置文件创建对象 通过工厂+反射+配置文件获取对象 /** * @Author: Promsing * @Date: 2021/3/7 - 10:09 * @Description: 通过使用工厂+配置文件+反射实现创建对象 * @version: 1.0 */ public class AbsFactory { //声明一个变量(多例模式,每次通过工厂都会创建一个不同的实例) private static Object obj; public static Object c

  • 详解Java从工厂方法模式到 IOC/DI思想

    前言 简单工厂的本质是选择实现,说白了是由一个专门的类去负责生产我们所需要的对象,从而将对象的创建从代码中剥离出来,实现松耦合.我们来看一个例子: 我们要创建一个文件导出工具 public interface FileOper{ public Boolean exceptFile(String data); } public class XMLFileOp implment FileOper{ public Boolean exceptFile(String data){ System.out.

  • Java读取Map的两种方法与对比

    前言 在java中遍历Map有不少的方法.这篇文章我们就来看一下Java读取Map的两种方法以及这两种方法的对比. 一. 遍历Map方法A Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = en

  • java 遍历MAP的几种方法示例代码

    java中遍历MAP的几种方法 Map<String,String> map=new HashMap<String,String>(); map.put("username", "qq"); map.put("passWord", "123"); map.put("userID", "1"); map.put("email", "qq

  • Java中遍历Map的多种方法示例及优缺点总结

    前言 关于java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个map public class TestMap { public static Map<Integer, Integer> map = new HashMap<Integer, Integer>(); } keySet values 如果只需要map的key或者value,用map的keySe

  • Java 8 中 Map 骚操作之 merge() 的使用方法

    Java 8 最大的特性无异于更多地面向函数,比如引入了lambda等,可以更好地进行函数式编程.前段时间无意间发现了map.merge()方法,感觉还是很好用的,此文简单做一些相关介绍.首先我们先看一个例子. merge()怎么用? 假设我们有这么一段业务逻辑,我有一个学生成绩对象的列表,对象包含学生姓名.科目.科目分数三个属性,要求求得每个学生的总成绩.加入列表如下: private List<StudentScore> buildATestList() { List<Student

  • C++如何删除map容器中指定值的元素详解

    前言 大家都知道map容器是C++ STL中的重要一员,平时会遇到删除map容器中value为指定元素的问题,例如删除所有字符串为"123"或者能整除3的元素. 一.map容器下的方法说明 由于map容器下的方法较多,这里只列举代码中用到的几个方法: insert()方法: //插入val到pos的后面,然后返回一个指向这个元素的迭代器 iterator insert( iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &v

  • JavaScript实现Java中Map容器的方法

    本文实例讲述了JavaScript实现Java中Map容器的方法.分享给大家供大家参考,具体如下: 声明一下,JavaScript和Java的区别就像雷锋和雷峰塔的区别. 在Java中,Map是一种集合,用来存储Key-Value键值对的容器.根据键得到值,因此不允许键重复(重复了的覆盖),但允许值重复.JavaScript中的对象特性,就是不允许有相同的属性存在,和Java的Map非常的相似,所以可以利用这个特性在JavaScript中来实现Map容器,实现基本的增删查的操作. functio

  • 基于Java并发容器ConcurrentHashMap#put方法解析

    jdk1.7.0_79 HashMap可以说是每个Java程序员用的最多的数据结构之一了,无处不见它的身影.关于HashMap,通常也能说出它不是线程安全的.这篇文章要提到的是在多线程并发环境下的HashMap--ConcurrentHashMap,显然它必然是线程安全的,同样我们不可避免的要讨论散列表,以及它是如何实现线程安全的,它的效率又是怎样的,因为对于映射容器还有一个Hashtable也是线程安全的但它似乎只出现在笔试.面试题里,在现实编码中它已经基本被遗弃. 关于HashMap的线程不

  • Java如何设置过期时间的map的几种方法

    目录 一.技术背景 二.技术效果 三.ExpiringMap 3.1功能简介 3.2源码 3.3示例 四.LoadingCache 4.1功能简介 4.2示例 4.3移除机制 4.4其他 五.HashMap的封装 一.技术背景 在实际的项目开发中,我们经常会使用到缓存中间件(如redis.MemCache等)来帮助我们提高系统的可用性和健壮性. 但是很多时候如果项目比较简单,就没有必要为了使用缓存而专门引入Redis等等中间件来加重系统的复杂性.那么Java本身有没有好用的轻量级的缓存组件呢.

随机推荐