简单模拟IOC容器:返回对象并能抛出异常
本次要求:已知com.zzj.vo包下分别有Tiger、lion、Elephant三个Java源文件,请据此实现以下功能:
①、自定义一个名为Component的注解,要求该注解只能用于类且代码运行时该注解依然有效;
②、为Tiger和Lion类添加component注解
③、在Application类中定义静态代码块,该代码块可自动将有Component注解修饰的类创建对象并放在Map集合中;然后定义一个名为getBean的static方法,要求传入Class类实例时返回该Class类对应类的对象,如果没有Class类对应的对象,则引发NoSuchBeanDefinitionException异常并提示“No qualifying bean of type 'com.lq.vo.类名'available”;
Component注解
package com.zzj.annotation; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; //范围只限定类,存在周期运行后
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Component { }
定义三个java类并添加注解
package com.zzj.vo;
public class Elephant { } package com.zzj.vo;
import com.zzj.annotation.Component;
@Component
public class Lion { } package com.zzj.vo;
import com.zzj.annotation.Component;
@Component
public class Tiger { }
application类
package com.zzj; import java.io.File;
import java.util.HashMap;
import java.util.Map; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import com.zzj.annotation.Component; public class Application { //定义map集合存放对应类和对应的class对象
private static Map<Class,Object> map = new HashMap<Class,Object>(); static{ String packageName = "com.zzj.vo";
//获取包的绝对路径
String path = ClassLoader.getSystemResource("").getPath() + packageName.replace(".",File.separator);
//路径中文转码,由于是静态方法不能使用
//path = java.net.URLDecoder.decode(path,"utf-8");
//采用字符替换
path = path.replace("%e7%a8%8b%e5%ba%8f%e7%8c%bf","程序猿"); //获取包里的所有类
File[] files = new File(path).listFiles(); //获取所有类的相对路径(包名+类名,无扩展名)
for (File file : files){
String fileName = file.getName();
String className = packageName + "." + fileName.substring(0,fileName.indexOf(".")); //将获取的类放入Map集合,key为类型,value为映射对象(默认为对象地址)
try {
Class clazz = Class.forName(className);
if(clazz.getAnnotation(Component.class) != null){
map.put(clazz,clazz.newInstance());
}
} catch (Exception e) {
e.printStackTrace();
} } } //抛出异常
public static Object getBean(Class clazz){
Object object = map.get(clazz);
if(object == null){
throw new NoSuchBeanDefinitionException("No qualifying bean of type '"+clazz.getName()+"'available");
} return object;
} }
异常类
package com.zzj.exception;
public class NoSuchBeanDefinitionException extends RuntimeException{
private static final long serialVersionUID = 8124869159299733396L;
public NoSuchBeanDefinitionException(String msg) {
super(msg);
}
}
测试类
package com.zzj.test; import com.zzj.vo.Lion; import com.zzj.Application; /*
已知com.zzj.vo包下分别有Tiger、lion、Elephant三个Java源文件,请据此实现以下功能:
①、自定义一个名为Component的注解,要求该注解只能用于类且代码运行时该注解依然有效;
②、为Tiger和Lion类添加component注解
③、在Application类中定义静态代码块,该代码块可自动将有Component注解修饰的类创建对象并放在Map集合中;然后定义一个名为getBean的static方法,
要求传入Class类实例时返回该Class类对应类的对象,如果没有Class类对应的对象,则引发NoSuchBeanDefinitionException异常并
提示“No qualifying bean of type 'com.lq.vo.类名'available”;
*/
public class Test { public static void main(String[] args){ Object object = Application.getBean(Lion.class);
System.out.println(object); } }
运行结果
有对应对象的:输出对象地址
没有对应对象的:抛出异常
简单模拟IOC容器:返回对象并能抛出异常的更多相关文章
- 简单模拟IOC容器:为添加了@Autowired的属性赋值(初始值)
创建@Autowired注解 package com.zzj.test; import java.lang.annotation.ElementType; import java.lang.annot ...
- IoC原理-使用反射/Emit来实现一个最简单的IoC容器
从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...
- 【最简单IOC容器实现】实现一个最简单的IOC容器
前面DebugLZQ的两篇博文: 浅谈IOC--说清楚IOC是什么 IoC Container Benchmark - Performance comparison 在浅谈IOC--说清楚IOC是什么 ...
- 几句代码简单实现IoC容器
前言 最近在调试EasyNetQ代码的时候发现里面有一段代码,就是IoC容器的简单实现,跟着他的代码敲了一遍,发现了奇妙之处.当然也是因为我才疏学浅导致孤陋寡闻了.他的思路就是通过动态调用构造函数生成 ...
- 手写一个最简单的IOC容器,从而了解spring的核心原理
从事开发工作多年,spring源码没有特意去看过.但是相关技术原理倒是背了不少,毕竟面试的那关还是得过啊! 正所谓面试造火箭,工作拧螺丝.下面实现一个最简单的ioc容器,供大家参考. 1.最终结果 2 ...
- 比Spring简单的IoC容器
比Spring简单的IoC容器 Spring 虽然比起EJB轻量了许多,但是因为它需要兼容许多不同的类库,导致现在Spring还是相当的庞大的,动不动就上40MB的jar包, 而且想要理解Spring ...
- 【Spring】Spring之向 IOC 容器注入对象的三种方式
关于Spring的搭建可参见:浅析Spring框架的搭建.在测试之前还是应该先将环境配置好,将相关Jar包导进来.Spring创建的对象,默认情况下都是单例模式,除非通过scope指定. 向IOC容器 ...
- IL实现简单的IOC容器
既然了解了IL的接口和动态类之间的知识,何不使用进来项目实验一下呢?而第一反应就是想到了平时经常说的IOC容器,在园子里搜索了一下也有这类型的文章http://www.cnblogs.com/kkll ...
- 【sping揭秘】4、某些无法注册到IOC容器的对象如何交给spring托管
可以实现spring的factoryBean 接口,这样可以加入spring的IOC容器 比如现在有一个类叫MyObject,我们没有这个对象的源码,无法对这个对象进行操作,那么我们如何加入sprin ...
随机推荐
- SSD算法
SSD算法 2016 出的目标检测算法 SSD效果主要有三点: 1.多尺度 2.设置了多种宽高比的(anchor box)default box 3.数据增强 1.1 设置 default box ...
- 01背包第k最优解
附题目链接:Bone Collector II Input The first line contain a integer T , the number of cases.Followed by T ...
- 3.java发展简史
1991年,James Gosling在SUN(Stanford University Network)公司的工程师小组想要设计这样一种小型计算机语言.该语言主要用于像电视盒这样的消费类电子产品.另外 ...
- 单链表 C++ 实现 - 含虚拟头节点
本文例程下载链接:ListDemo 链表 vs 数组 链表和数组的最大区别在于链表不支持随机访问,不能像数组那样对任意一个(索引)位置的元素进行访问,而需要从头节点开始,一个一个往后访问直到查找到目标 ...
- Write-Up-wakanda-1
关于 下载地址:点我 哔哩哔哩:哔哩哔哩 祖传开头 信息收集 这里用vm虚拟机可能有一点问题,因为官方的是用vbox虚拟机导出的镜像文件.所以这次使用vbox虚拟机. ➜ ~ ip a show de ...
- 2 JavaScript输出&字面量&变量&操作符&语句&标识符和关键字&字符集&语句&数据类型与类型转换
JS输出: JavaScript没有任何打印或者输出的函数,但是可以用不同的方式输出数据 window.alert():弹出警告框 document.write():写入文档 innerHTML:写入 ...
- mysql 连接数据库时时区报错
1.url: jdbc:mysql://192.168.0.101:3306/testdb?serverTimezone=UTC,在连接字符后面添加时区设置 2.使用navicat或者直接使用mysq ...
- .NET精彩博文
vs2019安装和使用教程(详细) 为什么选择.NETCore? C#中Socket的简单使用
- Python学习笔记002
字符编码:把二进制字符翻译成字符 ASCII码表 256 一个字节,8个比特 支持中文: GB2312 GBK1.0 GB18030 BIG5(台湾) unicode UTF-8 开头定义 ...
- keil Bulid Ouput窗口中PROGRAM SIZE项的具体含义
在Keil中编译工程成功后,在下面的Bulid Ouput窗口中会输出下面这样一段信息: Program Size: Code=6320 RO-data=4864 RW-data=44 ZI ...