本次要求:已知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. Cisco Packet Tracer 7.2

    Cisco Packet Tracer 7.2.1已于2018年12月28日发布,版本号为7.2.1.0218,现在可在Cisco Netacad网站上下载. What's new in Cisco ...

  2. 802.1X高级配置

    部署VLAN和ACLCisco Catalyst交换机(认证方)和Cisco ACS(认证服务器)具备动态分配VLAN或者ACL的能力.Cisco ACS可以将某个用户分配给指定的VLAN,或应用AC ...

  3. 【译】索引进阶(十七): SQL SERVER索引最佳实践

    [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 在本章我们给出一些建议:贯穿本系列我们提取出了十四条基本指南,这些基本的指南将会帮助你为你的数据库创建最佳的索引 ...

  4. Centos610安装Firefox

    yum -y install firefox yum install fonts-chinese yum install fonts-ISO8859-2-75dpi 修改 /etc/sysconfig ...

  5. 8.1.2hadoop Streaming 作业原理和参数设置

    1.1.1         Stream 作业 (1)hadoop streaming Hadoop streaming是hadoop的一个工具,用于运行费java的maper或reducer作业,例 ...

  6. 爬虫(十四):Scrapy框架(一) 初识Scrapy、第一个案例

    1. Scrapy框架 Scrapy功能非常强大,爬取效率高,相关扩展组件多,可配置和可扩展程度非常高,它几乎可以应对所有反爬网站,是目前Python中使用最广泛的爬虫框架. 1.1 Scrapy介绍 ...

  7. sqllab less-1

    1.访问sqllab 的less-1 按提示加入http://10.9.2.81/Less-1/?id=1 2. 后面加入单引号,发生报错http://10.9.2.81/Less-1/?id=1‘ ...

  8. LoadRunner的参数化

    好久不用loadrunner,以前的东西又都还给百度了,今天心血来潮,把参数化搞了一下 Action() { web_url("WebTours", "URL=http: ...

  9. 4 CSS导航栏&下拉菜单&属性选择器&属性和值选择器

    CSS导航栏 熟练使用导航栏,对于任何网站都非常重要 使用CSS你可以转换成好看的导航栏而不是枯燥的HTML菜单 垂直导航栏: <!DOCTYPE html> <html> & ...

  10. oracle SQL 练习

    COURSE 表 DROP TABLE "SCOTT"."course"; CREATE TABLE "SCOTT"."cours ...