手写web框架之实现Bean容器
实现Bean容器
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容器的更多相关文章
- 手写web框架之加载Controller,初始化框架
1,加载Controller 我们需要创建 一个ControllerHelper类,让它来处理下面的逻辑: 通过ClassHelper我们可以获取所有定义了Controller注解的 ...
- 手写web框架之实现依赖注入功能
我们在Controller中定义了Service成员变量,然后在Controller的Action方法中调用Service成员变量的方法,那么如果实现Service的成员变量? 之前定义了@Injec ...
- 手写web框架之加载配置项目
一 定义框架配置项 在项目的src/main/resources目录下创建一个名为smart.propertiesd的文件,文件的内容如下: smart.framework.jdbc.driver= ...
- 手写web框架之开发一个类加载器
ackage io.renren.common; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUti ...
- HTTP网络协议与手写Web服务容器
Http协议 1.深入概念 Http:HyperText Transfer Protocol,即是超文本传输协议. 2.浅出概念(使用浏览器访问服务器端网页时需要遵循的一系列规则) Http:将各种不 ...
- (二)springMvc原理和手写springMvc框架
我们从两个方面了解springmvc执行原理,首先我们去熟悉springmvc执行的过程,然后知道原理后通过手写springmvc去深入了解代码中执行过程. (一)SpringMVC流程图 (二)Sp ...
- 手写SpringMVC 框架
手写SpringMVC框架 细嗅蔷薇 心有猛虎 背景:Spring 想必大家都听说过,可能现在更多流行的是Spring Boot 和Spring Cloud 框架:但是SpringMVC 作为一款实现 ...
- 手写SpringMVC框架(二)-------结构开发设计
续接前文, 手写SpringMVC框架(一)项目搭建 本节我们来开始手写SpringMVC框架的第二阶段:结构开发设计. 新建一个空的springmvc.properties, 里面写我们要扫描的包名 ...
- 手写DAO框架(三)-数据库连接
-------前篇:手写DAO框架(二)-开发前的最后准备--------- 前言 上一篇主要是温习了一下基础知识,然后将整个项目按照模块进行了划分.因为是个人项目,一个人开发,本人采用了自底向上的开 ...
随机推荐
- linux命令 - nohup
nohup command & nohup scrapy crawl eeo > /home/wangliang/eeo.log & nohou 需要后台的命令 打印的日志位置 ...
- dao层取值用List<map<String,Object>>接收有序map
发现一个好玩的Map, 当需要Map有序时用java.util.LinkedHashMap接收,是有序map resultType="java.util.LinkedHashMap" ...
- 求 无向图的割点和桥,Tarjan模板
/* 求 无向图的割点和桥 可以找出割点和桥,求删掉每个点后增加的连通块. 需要注意重边的处理,可以先用矩阵存,再转邻接表,或者进行判重 */ const int MAXN = 10010; cons ...
- marquee标签实现跑马灯效果--无缝滚动
今天在做微信端的大转盘抽奖时,想把所有用户的抽奖记录做成无缝滚动的效果,无奈我的js功底太差,一时想不出实现的方法,便百度各种相似效果.但无意中发现了一个html标签——<marquee> ...
- C# 时间戳转换为时间格式
// 时间戳转为格式 public DateTime StampToDateTime(string timeStamp) { DateTime dateTimeStart = TimeZone.Cur ...
- anguar @input绑定的属性变化
Intercept @Input property change in Angular Bharat TiwariFollow Mar 15, 2018 this post is good for A ...
- python_lambda表达式(匿名函数)
# lambda表达式,为了解决简单函数的情况,如: def func(a1,a2): return a1 + a2 func = lambda a1,a2:a1+a2 # 上面这两个是一样的 def ...
- 关于maven依赖死活都下载不了终极解决方案
项目想下载一个依赖,在idea中死都下不了,查看网上各种解决方案都没有效果,出绝招,我使用命令下载jar然后导入到项目引用的maven仓库 类似这种命令:mvn install:install-fil ...
- kettle 数据抽取时会出现 无法插入NULL
kettle 数据抽取时会出现 无法插入NULL,其实是空字符串,原因是kettle默认不区分空字符串和NULL. 解决办法: 修改kettle.properties 文件:
- [Spring] Spring Data JPA
Previouly we need to define a DAO interface and a DAO impl for 'Employee', it is not so reuseable, s ...