手写web框架之实现Bean容器

实现Bean容器

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

 1 package org.smart4j.framework.org.smart4j.framework.util;
 2
 3 import org.slf4j.Logger;
 4 import org.slf4j.LoggerFactory;
 5 import java.lang.reflect.Field;
 6 import java.lang.reflect.Method;
 7
 8 /**
 9  * Created by jack on 2017/5/23.
10  * 放射工具类
11  */
12 public class ReflectionUtil {
13     private static final Logger LOGGER = LoggerFactory.getLogger(ReflectionUtil.class);
14
15     /**
16      * 创建实例
17      */
18     public static Object newInstance(Class<?> cls) {
19         Object instance;
20         try {
21             instance = cls.newInstance();
22         } catch (Exception e) {
23             LOGGER.error("new instance failue", e);
24             throw new RuntimeException(e);
25         }
26         return instance;
27     }
28
29     /**
30      * 调用方法
31      */
32     public static Object invokeMethod(Object obj, Method method, Object... args) {
33         Object result;
34         method.setAccessible(true);
35         try {
36             result = method.invoke(obj,args);
37         } catch (Exception e) {
38             LOGGER.error("invoke method failure",e);
39             throw new RuntimeException(e);
40         }
41         return result;
42     }
43
44     /**
45      * 设置成员变量的值
46      */
47     public static void setField(Object obj, Field field,Object value){
48
49         try {
50             field.setAccessible(true);
51             field.set(obj,value);
52         } catch (IllegalAccessException e) {
53             LOGGER.error("set field failue",e);
54             throw new RuntimeException(e);
55         }
56     }
57 }

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

 1 package org.smart4j.framework.helper;
 2
 3 import org.smart4j.framework.org.smart4j.framework.util.ReflectionUtil;
 4
 5 import java.util.HashMap;
 6 import java.util.Map;
 7 import java.util.Set;
 8
 9 /**
10  * Created by jack on 2017/5/23.
11  * bean 助手类
12  */
13 public class BeanHelper {
14     /**
15      * 定义bean映射,(用于存放bean类与bean实例的映射关系)
16      */
17     private static final Map<Class<?>,Object> BEAN_MAP = new HashMap<Class<?>, Object>();
18
19     /**
20      * 静态代码块
21      */
22     static {
23         Set<Class<?>> beanClassSet = ClassHelper.getBeanClassSet();
24         for (Class<?> beanClass : beanClassSet) {
25             Object object = ReflectionUtil.newInstance(beanClass);
26             BEAN_MAP.put(beanClass,object);
27         }
28     }
29
30     /**
31      * 获取Bean映射
32      */
33     public static Map<Class<?>,Object> getBeanMap(){
34         return BEAN_MAP;
35     }
36
37     /**
38      * 获取Bean实例
39      */
40     public static <T> T getBean(Class<?> cls){
41         if (!BEAN_MAP.containsKey(cls)){
42             throw new RuntimeException("can not get bean by class:"+cls);
43         }
44         return (T) BEAN_MAP.get(cls);
45     }
46 }

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

原文地址:https://www.cnblogs.com/duan2/p/11749125.html

时间: 2024-11-07 20:20:38

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

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

一  定义框架配置项 在项目的src/main/resources目录下创建一个名为smart.propertiesd的文件,文件的内容如下: 1 smart.framework.jdbc.driver=com.mysql.jdbc.Driver 2 smart.framework.jdbc.url=jdbc:mysql://localhost:3306/jack 3 smart.framework.jdbc.username=root 4 smart.framework.jdbc.passwo

自己手写WEB程序框架并运行

1.新建文件夹,起名MyWeb 2.文件夹下,新建两个文件夹 WEB-INF, META-INF,,还可以新建一些jsp,html文件 ,如 index.html 3在WEB-INF中必须存在一个文件WEB.xml, 还包含两个文件夹 lib, classes 4 在WEB.xml中写入最简单的<web-app> ....  </web-app>,,,,,编辑一下index.html 下面是要运行了 1,cmd 2,切换到MyWeb的文件夹,jar 命令查看一下各个参数的含义 3,

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

我们从两个方面了解springmvc执行原理,首先我们去熟悉springmvc执行的过程,然后知道原理后通过手写springmvc去深入了解代码中执行过程. (一)SpringMVC流程图 (二)SpringMVC流程 1.  用户发送请求至前端控制器DispatcherServlet. 2.  DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.  处理器映射器找到具体的处理器(可以根据xml配置.注解进行查找),生成处理器对象及处理器拦截器(如果有则

手写SpringMVC 框架

手写SpringMVC框架 细嗅蔷薇 心有猛虎 背景:Spring 想必大家都听说过,可能现在更多流行的是Spring Boot 和Spring Cloud 框架:但是SpringMVC 作为一款实现了MVC 设计模式的web (表现层) 层框架,其高开发效率和高性能也是现在很多公司仍在采用的框架:除此之外,Spring 源码大师级的代码规范和设计思想都十分值得学习:退一步说,Spring Boot 框架底层也有很多Spring 的东西,而且面试的时候还会经常被问到SpringMVC 原理,一般

手写Spring框架,加深对Spring工作机制的理解!

在我们的日常工作中,经常会用到Spring.Spring Boot.Spring Cloud.Struts.Mybatis.Hibernate等开源框架,有了这些框架的诞生,平时的开发工作量也是变得越来越轻松,我们用 Spring Boot 分分钟可以新建一个Web项目. 记得自己刚开始工作的时候还是在用Servlet写Web项目,自己写数据库连接池,用原生JDBC操作数据库,好了不发散了.回到这篇文章的主题,今天通过手写Spring框架,帮大家深入了解一下Spring的工作机制,文中涉及的代码

Python Django前奏手撸web框架 基于wsgiref的web框架

基于socke手撸web框架 # 请求首行 b'GET / HTTP/1.1\r\n #GET /index HTTP/1.1\r\n (index)为浏览器请求地址) # 请求头 Host: 127.0.0.1:8080\r\n Connection: keep-alive\r\n Cache-Control: max-age=0\r\n Upgrade-Insecure-Requests: 1\r\n # User-Agent用来标识是不是浏览器 User-Agent: Mozilla/5.

纯手撸web框架

纯手撸web框架 一.Web应用的组成 接下来我们学习的目的是为了开发一个Web应用程序,而Web应用程序是基于B/S架构的,其中B指的是浏览器,负责向S端发送请求信息,而S端会根据接收到的请求信息返回相应的数据给浏览器,需要强调的一点是:S端由server和application两大部分构成,如图所示: 上图:Web应用组成 二.手鲁web应用 2.1 基本版 import socket """ @author RansySun @create 2019-10-18-11:

手撸WEB框架

手撸web框架 软件开发的架构 C/S架构: 客户端 / 服务端 B/S架构: 浏览器 / 服务端 bs的本质也是cs HTTP协议 http是一种超文本传输协议 1.四大特性 基于TCP/I P之上作用于应用层 基于请求响应 无状态 (cookie session token..) 无连接 (长连接 websocket ( http 协议的大补丁)) 2.数据格式 请求格式 请求首行(请求方式, 协议版本.) 请求头(是一大堆k: v键值对) 注意请求头和请求体之间的空格\r\n 请求体(真正

手写springIoc框架

springIoc的底层实现原理 1.读取bean的XML配置文件 2.使用beanId查找bean配置,并获取配置文件中class地址. 3.使用Java反射技术实例化对象 4.获取属性配置,使用反射技术进行赋值 使用人家spring框架读取对象 创建实体 package com.itmayiedu.service; public class UserEntity { private String userId; private String userName; public UserEnti