实现Bean容器

   使用ClassHelper可以获取所加载的类,但无法通过类来实例化对象,因此我们需要提供一个反射工具类,让它封装java反射相关的API,对外提供更好用的工具方法。将该类命名为ReflectionUtil,代码如下:
 package org.smart4j.framework.org.smart4j.framework.util;

 import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Field;
import java.lang.reflect.Method; /**
* Created by jack on 2017/5/23.
* 放射工具类
*/
public class ReflectionUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(ReflectionUtil.class); /**
* 创建实例
*/
public static Object newInstance(Class<?> cls) {
Object instance;
try {
instance = cls.newInstance();
} catch (Exception e) {
LOGGER.error("new instance failue", e);
throw new RuntimeException(e);
}
return instance;
} /**
* 调用方法
*/
public static Object invokeMethod(Object obj, Method method, Object... args) {
Object result;
method.setAccessible(true);
try {
result = method.invoke(obj,args);
} catch (Exception e) {
LOGGER.error("invoke method failure",e);
throw new RuntimeException(e);
}
return result;
} /**
* 设置成员变量的值
*/
public static void setField(Object obj, Field field,Object value){ try {
field.setAccessible(true);
field.set(obj,value);
} catch (IllegalAccessException e) {
LOGGER.error("set field failue",e);
throw new RuntimeException(e);
}
}
}

我们需要获取所有被smart框架管理的bean类,此时需要调用ClassHelper类的getBeanClassSet方法,随后需要循环调用ReflectionUtil的newInstance方法,根据类来实例化对象,最后将每次创建的对象保存在一个静态的Map<Class<?>,Object>中,我们需要随时获取该Map,还需要根据该Map的key(类名)去获取对应的value
(bean对象),BeanHelper类代码如下:

 package org.smart4j.framework.helper;

 import org.smart4j.framework.org.smart4j.framework.util.ReflectionUtil;

 import java.util.HashMap;
import java.util.Map;
import java.util.Set; /**
* Created by jack on 2017/5/23.
* bean 助手类
*/
public class BeanHelper {
/**
* 定义bean映射,(用于存放bean类与bean实例的映射关系)
*/
private static final Map<Class<?>,Object> BEAN_MAP = new HashMap<Class<?>, Object>(); /**
* 静态代码块
*/
static {
Set<Class<?>> beanClassSet = ClassHelper.getBeanClassSet();
for (Class<?> beanClass : beanClassSet) {
Object object = ReflectionUtil.newInstance(beanClass);
BEAN_MAP.put(beanClass,object);
}
} /**
* 获取Bean映射
*/
public static Map<Class<?>,Object> getBeanMap(){
return BEAN_MAP;
} /**
* 获取Bean实例
*/
public static <T> T getBean(Class<?> cls){
if (!BEAN_MAP.containsKey(cls)){
throw new RuntimeException("can not get bean by class:"+cls);
}
return (T) BEAN_MAP.get(cls);
}
}

现在,BeanHelper就相当于一个“Bean”容器了,因为在Bean map中存放了Bean类和Bean实例的对应关系,我们只需要调用getBean方法,传入一个Bean类,就能获取Bean实例。

手写web框架之实现Bean容器的更多相关文章

  1. 手写web框架之加载Controller,初始化框架

    1,加载Controller     我们需要创建 一个ControllerHelper类,让它来处理下面的逻辑:      通过ClassHelper我们可以获取所有定义了Controller注解的 ...

  2. 手写web框架之实现依赖注入功能

    我们在Controller中定义了Service成员变量,然后在Controller的Action方法中调用Service成员变量的方法,那么如果实现Service的成员变量? 之前定义了@Injec ...

  3. 手写web框架之加载配置项目

    一  定义框架配置项 在项目的src/main/resources目录下创建一个名为smart.propertiesd的文件,文件的内容如下: smart.framework.jdbc.driver= ...

  4. 手写web框架之开发一个类加载器

    ackage io.renren.common; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUti ...

  5. HTTP网络协议与手写Web服务容器

    Http协议 1.深入概念 Http:HyperText Transfer Protocol,即是超文本传输协议. 2.浅出概念(使用浏览器访问服务器端网页时需要遵循的一系列规则) Http:将各种不 ...

  6. (二)springMvc原理和手写springMvc框架

    我们从两个方面了解springmvc执行原理,首先我们去熟悉springmvc执行的过程,然后知道原理后通过手写springmvc去深入了解代码中执行过程. (一)SpringMVC流程图 (二)Sp ...

  7. 手写SpringMVC 框架

    手写SpringMVC框架 细嗅蔷薇 心有猛虎 背景:Spring 想必大家都听说过,可能现在更多流行的是Spring Boot 和Spring Cloud 框架:但是SpringMVC 作为一款实现 ...

  8. 手写SpringMVC框架(二)-------结构开发设计

    续接前文, 手写SpringMVC框架(一)项目搭建 本节我们来开始手写SpringMVC框架的第二阶段:结构开发设计. 新建一个空的springmvc.properties, 里面写我们要扫描的包名 ...

  9. 手写DAO框架(三)-数据库连接

    -------前篇:手写DAO框架(二)-开发前的最后准备--------- 前言 上一篇主要是温习了一下基础知识,然后将整个项目按照模块进行了划分.因为是个人项目,一个人开发,本人采用了自底向上的开 ...

随机推荐

  1. JAI丢包掉帧处理

    问题 时间戳停止变化/图像停止更新 描述 本小白刚刚接触JAI,有很多不懂的地方.这次遇到问题是请教了YZ大哥(不知道年龄,暂时这么称呼),很感谢YZ大哥的耐心指导.因为我不仅不知道怎么调,连在哪里调 ...

  2. 零基础免费搭建个人博客-hexo+github

    使用hexo生成静态博客并架设在免费的github page平台 准备 系统: Window 7 64位 使用软件: Git v1.9.5[下载地址] 百度云 360云盘 访问密码 d269 Git官 ...

  3. Web上传大文件的解决方案

    需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...

  4. 2018CCPC桂林站G Greatest Common Divisor

    题目描述 There is an array of length n, containing only positive numbers.Now you can add all numbers by ...

  5. 「BZOJ 5161」最长上升子序列「状压DP」

    题意 求一个\(1\sim n\)的排列LIS的期望长度,\(n\leq 28\) 题解 考虑朴素的LIS:\(f[i] = min(f[j]) + 1\) 记\(mx[i]\)为\(f\)的前缀最大 ...

  6. 深度学习笔记(十三)YOLO V3 (Tensorflow)

    [代码剖析]   推荐阅读! SSD 学习笔记 之前看了一遍 YOLO V3 的论文,写的挺有意思的,尴尬的是,我这鱼的记忆,看完就忘了  于是只能借助于代码,再看一遍细节了. 源码目录总览 tens ...

  7. .net core Redis库 CSRedis

    由于servicestack.redis收费,基于有人说StackExchange.Redis 使用会出现一些问题比如会超时, 找到了CSRedis这个库,很强大很实用.另外有兴趣的朋友还可以试试另一 ...

  8. codeforces#1157D. Ehab and the Expected XOR Problem(构造)

    题目链接: http://codeforces.com/contest/1174/problem/D 题意: 构造一个序列,满足以下条件 他的所有子段的异或值不等于$x$ $1 \le a_i< ...

  9. 前端工程师需要掌握的 Babel 知识

    在前端圈子里,对于 Babel,大家肯定都比较熟悉了.如果哪天少了它,对于前端工程师来说肯定是个噩梦.Babel 的工作原理是怎样的可能了解的人就不太多了.本文将主要介绍 Babel 的工作原理以及怎 ...

  10. AGC032E modulo pairing

    题意 原题 给出\(2n\)个\(\leq m\)的数,求最优的两两配对方案 使\(n\)组\((x,y)\)的\((x+y)mod \space m\)最大值最小 \(n\leq 10^5,m \l ...