自己动手写SpringMVC(五)

已经分析过DispatcherServlet主要的任务,分为五个任务,任务1:把项目中所有的bean扫描,进行维护,我们已经完成,现在第二个任务:根据全类名创建bean实例,并进行维护;

其实写到这里就要恶补一下反射的相关知识了:

1.如何通过类的信息,获得这个类的类类型

Class<?>   c1 = Class.forName("com.tx.Foo");

2.知道一个类的类类型,可以做什么?

可以创建该类的对象:   demo = c1.newInstance();

可以获得该类的所有属性:Field[] fs = c1.getFields()

可以获得该类的所有方法:Method[] methods = c1.getMethods();

可以获得该类的所有构造方法: Constructor[] cs = c1.getConstructors();

3.获得了以上信息可以做什么?

获得了方法就可以通过这个方法对象,通过   method.invoke(对象,参数列表)  调用方法

4.可以通过对象获得类类型吗?答案,当然可以

Foo f1 = new Foo();

c2 = f1.getClass();

5.当然也可以直接通过如下的写法获得类类型:

c3 = Foo.class;

之所以写这么多的反射知识点,是因为,之后的任务中都要大量用到,所以提前预习一下!

任务二,根据全类名创建bean实例,并进行维护;代码如下

//根据扫描的List类名,进行实例化
	private void  doInstance(){
		if(classNames.size()<=0){
			System.out.println("包扫描失败");
			return;
		}
		for(String className:classNames){
			String cn = className.replace(".class", "");
			try {
				Class<?> clas = Class.forName(cn);
				if(clas.isAnnotationPresent(MyController.class)){
					Object instace = clas.newInstance();
					MyRequestMapping requestMapping = clas.getAnnotation(MyRequestMapping.class);
					String rmvalue = requestMapping.value();
					beans.put(rmvalue,instace);
				}else if(clas.isAnnotationPresent(MyService.class)){
					MyService service = clas.getAnnotation(MyService.class);
					Object instance = clas.newInstance();
					beans.put(service.value(), instance);
				}else{
					continue;
				}
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
	}

其中维护bean实例,定义了成员变量:

Map<String,Object> beans = new HashMap<String,Object>();

到此任务二完成,如果此段代码中有什么问题,可以在评论中提出!

猜你喜欢

转载自blog.csdn.net/tangtang1226/article/details/81276542