/**
* 一个创建Bean对象的工厂
*
* Bean:在计算机英语中,有可重用组件的含义。
* JavaBean:用java语言编写的可重用组件。
* javabean > 实体类
*
* 它就是创建我们的service和dao对象的。
*
* 第一个:需要一个配置文件来配置我们的service和dao
* 配置的内容:唯一标识=全限定类名(key=value)
* 第二个:通过读取配置文件中配置的内容,反射创建对象
*
* 配置文件可以是xml也可以是properties
*/
public class BeanFactory{
//定义一个properties对象
private static Properties properties;
//定义一个Map,用于存放我们要创建的对象, 我们把它称之为容器, 创建一个存起来,这样创建的对象就成为了单实例对象
private static Map<String,Object> beans; /**
* 首先,static{}(静态代码块)在程序加载中static是先于构造方法加载的,并且只会加载一次。
* 两外static块中只能使用static修饰的属性。
* 程序中的static{}块只是为了加载properties文件信息,这个加载只会被加载一次。
*/
//使用静态代码块为properties赋值
static {
try {
//实例化对象
// properties = new Properties ();
// //获取properties文件的流对象
//InputStream inputStream=new FileInputStream ();//不能使用此方式,文件具体路径可能并不确定
InputStream inputStream=BeanFactory.class.getClassLoader ().getResourceAsStream ("bean.properties");
properties.load (inputStream);
//实例化容器
beans=new HashMap<String,Object> ();
//取出配置文件中所有的Key
//Enumeration keys=properties.keys ();
Set keys= properties.keySet ();
//遍历
for (Object obj: keys) {
//获取key
String key=(String)obj;
//根据key获取value
String beanPath=properties.getProperty (key);
try {
//反射创建对象
Object value=Class.forName (beanPath).newInstance ();
//把key和value存入容器之中
beans.put (key,value);
} catch (Exception e) {
e.printStackTrace ();
}
}
} catch (IOException e) {
throw new ExceptionInInitializerError ("初始化失败!");
} } /**
* 在getBean时实例化一个对象,每次调用getBean时都会实例化一个新的对象,多实例
* 多例对象被创建多次,执行效率不如单例对象
* @param beanName
* @return
*/
public static Object getBean(String beanName){
//Object bean=null;
//try {
// //beanPath : com.itheima.service.impl.AccountServiceImpl
// String beanPath=properties.getProperty (beanName);
// /**
// * Class.forName (beanPath).newInstance ();
// * newInstance () 每次都会调用默认构造函数创建对象
// */
// bean=Class.forName (beanPath).newInstance ();
//} catch (Exception e) {
// e.printStackTrace ();
//}
//return bean;
return beans.get (beanName);
}
}

编写BeanFactory的更多相关文章

  1. 模拟spring的IoC

    1.新建一个web项目,jdk版本为1.8.0_111,使用 Jsp + Servlet + Model 实现MVC模式,并使用BeanFactory工厂 + xml配置文件 + 反射 来解耦合 整个 ...

  2. 闭关修炼180天--手写IOC和AOP(xml篇)

    闭关修炼180天--手写IOC和AOP(xml篇) 帝莘 首先先分享一波思维导图,涵盖了一些Spring的知识点,当然这里并不全面,后期我会持续更新知识点. 在手写实现IOC和AOP之前(也就是打造一 ...

  3. [spring源码学习]六、IOC源码-BeanFactory和factory-bean

    一.代码实例 在我们分析spring的IOC源码的时候,发现除了配置标准的bean,并且通过getBean(beanName)的方法获取到一个bean的实例外,似乎还有这不少其他获取的方法,例如在第四 ...

  4. 如何编写Spring-Boot自动配置

    摘要 本文主要介绍如何把一个spring的项目(特别是一些公共工具类项目),基于spring boot的自动配置的思想封装起来,使其他Spring-Boot项目引入后能够进行快速配置. AutoCon ...

  5. Spring之BeanFactory和FactoryBean接口的区别

    目录 一.BeanFactory接口 二.FactoryBean接口 1.简单实现 2.增强实现 3.FactoryBean的实际使用案例 三.总结 @   Spring框架中的BeanFactory ...

  6. BaseServlet的编写

    在BaseServlet之前,需要提及工厂factory去管理dao以及service,以及页面转发或重定向的管理 1.创建一个工厂类,以及一个资源文件,资源文件中以键值对的形式去存储key,以及对应 ...

  7. BeanFactory中Bean的生命周期

    Bean的生命周期图解 集体过程如下: 当调用者通过getBean(beanName)向容器请求某一个Bean时,如果容器注册了org.springframework.beans.factory.co ...

  8. ApplicationContext(四)BeanFactory 功能扩展

    ApplicationContext(四)BeanFactory 功能扩展 上节我们提到容器刷新的第二步初始化 BeanFactory 工厂并解析配制文件,但此时 BeanFactory 的功能还很简 ...

  9. Spring源码分析(二十三)BeanFactory的后处理

    摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 目录 一.激活注册的 BeanFactoryPostProcessor ...

随机推荐

  1. JavaScript for循环实现表格隔行变色

    本代码主要演示的是for循环, <!doctype html> <html lang="en"> <head> <meta charset ...

  2. C++三种继承方式

    一.三种继承方式 继承方式不同,第一个不同是的是派生类继承基类后,各成员属性发生变化.第二个不同是派生类的对象能访问基类中哪些成员发生变化.表格中红色标注.

  3. JAVA Exception处理

    原文地址:http://blog.csdn.net/hguisu/article/details/6155636 1. 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用 ...

  4. Java for LeetCode 082 Remove Duplicates from Sorted List II

    Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...

  5. Compiling: main.cpp /bin/sh: g++: not found

    Kbuntu用codeblocks编写C程序的时候,编译报错如下: Compiling: main.cpp/bin/sh: g++: not found 解决方法: sudo apt-get inst ...

  6. oracle数据库用户创建删除以及数据导入

    dmp文件的导入:1.首先,先创建表空间与用户--创建表空间create tablespace CCFOCUS01datafile 'D:\app\Administrator\oradata\orcl ...

  7. jQuery选项卡tabulous

    jQuery选项卡tabulous,jQuery,选项卡,tab标签切换代码,扁平设计,jQuery选项卡tabulous是一款支持Scale.Slide.Scale Up.Flip等效果jquery ...

  8. 分享知识-快乐自己:Excel快速导入Oracle 数据库

    需求: oracle 数据库有一个student表,现有一个excel表:student.xlsx,需导入oracle数据库student表中. student表的拥有者是c##MLQ1  密码为:x ...

  9. Zabbix监控华为交换机

    一.    监控交换机首先要在交换机开通snmp协议. 有两种方式开通,web界面,及交换机的配置界面 Web界面开通: 交换机配置界面 有web界面的,使用web界面相对简单,本项目就是用web界面 ...

  10. Java_tool_01_Java生成Pdf

    一. 二.参考资料 1.电子凭证-Java生成Pdf 2.[Java]使用iText生成PDF文件