本次要求:已知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容器:返回对象并能抛出异常的更多相关文章

  1. 简单模拟IOC容器:为添加了@Autowired的属性赋值(初始值)

    创建@Autowired注解 package com.zzj.test; import java.lang.annotation.ElementType; import java.lang.annot ...

  2. IoC原理-使用反射/Emit来实现一个最简单的IoC容器

    从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...

  3. 【最简单IOC容器实现】实现一个最简单的IOC容器

    前面DebugLZQ的两篇博文: 浅谈IOC--说清楚IOC是什么 IoC Container Benchmark - Performance comparison 在浅谈IOC--说清楚IOC是什么 ...

  4. 几句代码简单实现IoC容器

    前言 最近在调试EasyNetQ代码的时候发现里面有一段代码,就是IoC容器的简单实现,跟着他的代码敲了一遍,发现了奇妙之处.当然也是因为我才疏学浅导致孤陋寡闻了.他的思路就是通过动态调用构造函数生成 ...

  5. 手写一个最简单的IOC容器,从而了解spring的核心原理

    从事开发工作多年,spring源码没有特意去看过.但是相关技术原理倒是背了不少,毕竟面试的那关还是得过啊! 正所谓面试造火箭,工作拧螺丝.下面实现一个最简单的ioc容器,供大家参考. 1.最终结果 2 ...

  6. 比Spring简单的IoC容器

    比Spring简单的IoC容器 Spring 虽然比起EJB轻量了许多,但是因为它需要兼容许多不同的类库,导致现在Spring还是相当的庞大的,动不动就上40MB的jar包, 而且想要理解Spring ...

  7. 【Spring】Spring之向 IOC 容器注入对象的三种方式

    关于Spring的搭建可参见:浅析Spring框架的搭建.在测试之前还是应该先将环境配置好,将相关Jar包导进来.Spring创建的对象,默认情况下都是单例模式,除非通过scope指定. 向IOC容器 ...

  8. IL实现简单的IOC容器

    既然了解了IL的接口和动态类之间的知识,何不使用进来项目实验一下呢?而第一反应就是想到了平时经常说的IOC容器,在园子里搜索了一下也有这类型的文章http://www.cnblogs.com/kkll ...

  9. 【sping揭秘】4、某些无法注册到IOC容器的对象如何交给spring托管

    可以实现spring的factoryBean 接口,这样可以加入spring的IOC容器 比如现在有一个类叫MyObject,我们没有这个对象的源码,无法对这个对象进行操作,那么我们如何加入sprin ...

随机推荐

  1. MySQL数据库--基础简述

    MySQL数据库--基础简述 1.15.1 MySQL简介 Mysql是最流行的RDBMS(Relational Database Management System:关系数据库管理系统),特别是在W ...

  2. jQuery结合CSS实现手风琴组件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 结对编程任意Android App Demo

    一.产品说明 1.编写目的:用于获取百度图标. 2.情景设计:本产品用于展示图标.随着21世纪各类元素的普及,大部分的人群想下载各类网站的图标,也为了方便用户更便捷的下载而开发的. 3.Demo主要实 ...

  4. 全排列next_permutation()用法和构造函数赋值

    全排列next_permutation()用法 在头文件aglorithm里 就是1~n数组的现在的字典序到最大的字典序的依次增加.(最多可以是n!种情况) int a[n]; do{ }while( ...

  5. [理解] C++ 中的 源文件 和 头文件

    我是学 C井 的, 现在在工作中主要使用的编程语言是 Java, 还记得当初在第一次接触到 Cpp 的时候, 听到的第一个概念就是 Cpp 的头文件和源文件, 当初理解了好久, 死活都弄不明白, 现在 ...

  6. VS release模式下进行调试设置

    工程项目上右键 打开 属性界面 1.c++ ---  常规 ---- 调试信息格式 选  程序数据库(/Zi)或(/ZI), 注意:如果是库的话,只能(Zi) 2.c/c++ ---- 优化 ---- ...

  7. matlab练习程序(传染病模型)

    最近新型冠状病毒疫情越来越严重了,待在家中没法出去,学习一下经典传染病模型. 这里总结了五个模型,分别是SI模型,SIS模型,SIR模型,SIRS模型,SEIR模型. 这几种模型的特点先介绍一下. 首 ...

  8. 第七届蓝桥杯javaB组真题解析-四平方和(第八题)

    题目 /* 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1 ...

  9. 记一次RocketMQ源码导入IDEA过程

    首先,下载源码,可以官网下载source包,也可以从GitHub上直接拉下来导入IDEA.如果是官网下载的source zip包,直接作为当前project的module导入,这里不赘述太多,只强调一 ...

  10. NGINX生命周期-转