反射的作用之spring的简单模拟

我们都知道spring框架主要起管理作用,它的核心配置文件时bean.xml,那么他是如何通过配置文件来管理这么多实体类的呢。下面看简单的模拟。代码是跟着马老师敲的。

先建立如图所示框架结构,当然这样写主要是巩固对层次结构的建立,单纯模拟spring的核心主要是ClassPathXmlApplicationContext那个类。


步骤1.

首先建立User实体类,里面有name和age属性,并且生成set,get方法

package com.lin.model;

public class User {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

步骤2

建立简单的DAO层, 当然具体的jdbc代码就不写了,用一个简单的输出语句来代替。

package com.lin.dao;

import com.lin.model.User;

public interface UserDAO {
	public void save(User u);
}

package com.lin.dao;
import com.lin.model.User;


public class UserDAOImpl implements UserDAO{

	@Override
	public void save(User u) {
		System.out.println(u.getName()+"-"+u.getAge()+"被添加!");
	}

}

步骤3,

建立service层用来调用DAO层的方法

package com.lin.service;

import com.lin.dao.UserDAO;
import com.lin.model.User;

public class UserService {
	private UserDAO userDAO ;
	public UserDAO getUserDAO() {
		return userDAO;
	}
	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}
	public void save(User u){
		userDAO.save(u);
	}
}


步骤4

建立配置文件beans.xml

<beans>
	<bean id="u" class="com.lin.dao.UserDAOImpl"></bean>
</beans>

写beansspring包里面的一个接口和类来对xml文件进行解析,并且用反射机制来生成和配置文件相对于的实体类并且return

package com.lin.beanspring;

public interface BeanFactory {
	public Object getBean(String name);
}


package com.lin.beanspring;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class ClassPathXmlApplicationContext implements BeanFactory {
	Map<String,Object> beans = new HashMap<String,Object>();
	public ClassPathXmlApplicationContext() throws JDOMException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {
		SAXBuilder builder = new SAXBuilder();
		Document doc = builder.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));
		Element root = doc.getRootElement();
		List list = root.getChildren("bean");
		for(int i = 0;i < list.size();i++){
			Element element = (Element)list.get(i);
			String id = element.getAttributeValue("id");//实例化对象名
			String classname = element.getAttributeValue("class");
			System.out.println(classname);
			Object o = Class.forName(classname).newInstance();
			beans.put(id, o);
		}
	}
	@Override
	public Object getBean(String name) {
		return beans.get(name);
	}

}


步骤5

建立测试类用junit4进行单元测试

package com.lin.service;

import java.io.IOException;

import org.jdom.JDOMException;
import org.junit.Test;

import com.lin.beanspring.BeanFactory;
import com.lin.beanspring.ClassPathXmlApplicationContext;
import com.lin.dao.UserDAO;
import com.lin.model.User;

public class UserServiceTest {
	UserService userservice = new UserService();
	@Test
	public void testSave() throws JDOMException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {
//		User u = new User();
//		u.setName("linjian");
//		u.setAge(22);
//		userservice.save(u);
		BeanFactory beanFactory = new ClassPathXmlApplicationContext();
		UserDAO userDAO= (UserDAO)beanFactory.getBean("u");
		userservice.setUserDAO(userDAO);
		User user = new User();
		user.setName("hheheheh");
		user.setAge(22);
		userservice.save(user);
	}

}



其中对XML进行解析用到的是jdom.jar,junit测试的建立右击项目新建,不会的就用main方法来测试也是一样。

jdom.jar我上传的资源里有,去百度一搜也可以搜到。

点击打开链接


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC使用反射机制来实现请求的处理和方法的调用。在Spring MVC中,使用注解来标记控制器类和处理请求的方法。通过利用反射Spring MVC能够在运行时动态地获取控制器类和方法的相关信息,并根据请求的URL来确定要调用的方法。 当一个请求到达Spring MVC应用程序时,Spring MVC会解析请求的URL,并根据URL中的路径信息找到对应的控制器类和方法。通过反射Spring MVC可以获取到这个控制器类的实例,并调用对应的方法来处理请求。在调用方法之前,Spring MVC还可以根据方法上的注解来进行一些预处理工作,比如参数绑定和验证等。 反射机制使得Spring MVC能够灵活地处理各种不同的请求,并动态地调用对应的方法。这种方式使得开发者能够更加方便地编写和维护控制器类,同时也提高了应用程序的灵活性和可扩展性。 引用内容: Spring Web MVC: Spring中的MVC封装包提供了Web应用的Model-View-Controller(MVC)实现。 引用:注:本文纯手写实现MVC的实现原理,没有使用设计模式等,代码直接复制即可debug调试查看运行流程,相关解释放在文末。 引用:1,Spring Core: Core封装包是框架的最基础部分,提供IOC和依赖注入特性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [反射机制,Spring AOP 底层实现原理,springmvc的工作原理,Spring七大模块](https://blog.csdn.net/tzydzj/article/details/113742970)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Spring MVC实现原理(手撕代码模拟呈现MVC反射原理)](https://blog.csdn.net/qq_45251343/article/details/119699273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值