编写BeanFactory
/**
* 一个创建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的更多相关文章
- 模拟spring的IoC
1.新建一个web项目,jdk版本为1.8.0_111,使用 Jsp + Servlet + Model 实现MVC模式,并使用BeanFactory工厂 + xml配置文件 + 反射 来解耦合 整个 ...
- 闭关修炼180天--手写IOC和AOP(xml篇)
闭关修炼180天--手写IOC和AOP(xml篇) 帝莘 首先先分享一波思维导图,涵盖了一些Spring的知识点,当然这里并不全面,后期我会持续更新知识点. 在手写实现IOC和AOP之前(也就是打造一 ...
- [spring源码学习]六、IOC源码-BeanFactory和factory-bean
一.代码实例 在我们分析spring的IOC源码的时候,发现除了配置标准的bean,并且通过getBean(beanName)的方法获取到一个bean的实例外,似乎还有这不少其他获取的方法,例如在第四 ...
- 如何编写Spring-Boot自动配置
摘要 本文主要介绍如何把一个spring的项目(特别是一些公共工具类项目),基于spring boot的自动配置的思想封装起来,使其他Spring-Boot项目引入后能够进行快速配置. AutoCon ...
- Spring之BeanFactory和FactoryBean接口的区别
目录 一.BeanFactory接口 二.FactoryBean接口 1.简单实现 2.增强实现 3.FactoryBean的实际使用案例 三.总结 @ Spring框架中的BeanFactory ...
- BaseServlet的编写
在BaseServlet之前,需要提及工厂factory去管理dao以及service,以及页面转发或重定向的管理 1.创建一个工厂类,以及一个资源文件,资源文件中以键值对的形式去存储key,以及对应 ...
- BeanFactory中Bean的生命周期
Bean的生命周期图解 集体过程如下: 当调用者通过getBean(beanName)向容器请求某一个Bean时,如果容器注册了org.springframework.beans.factory.co ...
- ApplicationContext(四)BeanFactory 功能扩展
ApplicationContext(四)BeanFactory 功能扩展 上节我们提到容器刷新的第二步初始化 BeanFactory 工厂并解析配制文件,但此时 BeanFactory 的功能还很简 ...
- Spring源码分析(二十三)BeanFactory的后处理
摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 目录 一.激活注册的 BeanFactoryPostProcessor ...
随机推荐
- Cannot run program “git.exe”: createprocess error=2,系统找不到指定的文件
Android Studio提供VCS(Version Control System)版本控制系统,默认情况使用Git.GitHub工具需要配置git.exe路径,否则提示“cannot run pr ...
- 【Android】Android中AlertDialog对话框的使用实例
package com.ceac.deng; import android.R.string; import android.support.v7.app.ActionBarActivity; imp ...
- WordPress用户角色及其权限管理编辑插件:User Role Editor汉化版
如果Wordpress默认的用户角色及权限不能满足您的需求,又觉得修改代码编辑用户权限太麻烦.那不妨试试User Role Editor,Wordpress用户角色及其权限管理编辑插件. User R ...
- ubuntu把文件移动到指定的文件夹
有个文件a.txt在/etc下,想把它移动到/etc/fuck文件夹中 cd /etc/fuck sudo mv a.txt 要移动到的文件夹 没报错就成功了
- YxdJSON - Delphi 高性能 JSON 库(支持RTTI和序列化操作)
源:YxdJSON - Delphi 高性能 JSON 库(支持RTTI和序列化操作) Delphi 高性能 JSON 库(支持RTTI和序列化操作) 支持平台: Windows, Android, ...
- 20145239杜文超 《Java程序设计》第1周学习总结
20145239<Java程序设计>第1周学习总结 教材学习内容总结 第一周. 通过教材简单的了解了java的历史.因为之前看过视频,所以有一个大致明了的认识. 识记了Java三大平台:J ...
- C++ 结构体多元素sort排序调用时的写法
//总结一下,结构体数据排序的快速写法 //以后在遇到需要写的时候,不要迟疑快速写完 struct node { int u, v, w; }a[10000]; //假设该结构体有3个元素 //现在仅 ...
- Kafka kafka.common.OffsetOutOfRangeException 问题处理
最近公司的zk的down掉了, storm job 重启的时候报出 kafka.common.OffsetOutOfRangeException 异常 网上查询了一些朋友的做法, 自己也看了一下代码 ...
- 2017SN多校D1T2 note:dp
题意: 给你一个长度为n的字符串s,并且告诉你有m对字母不能相邻,问你最少在s中取出多少个字符能够使这个字符串合法. 题解: 表示状态: dp[i] = max num of letters 考虑到第 ...
- Css公共文件结构
一般一个网站会有这么三个样式: global.css | reset.css(格式化样式) common.css(公共组件样式) layout.css(当前页面样式) 清除全站所有页面的浏览器默认样式 ...