手写SpringIOC框架
2020-04-20 15:06
302 查看
什么是SpringIOC?
就是把每一个bean(实体类)与bean(实体类)之间的关系交给第三方容器进行管理。
Xml配置:
<beans> <bean id="user1" class="com.itmayiedu.entity.UserEntity"> <property name="userId" value="0001"></property> <property name="userName" value="李四"></property> </bean> <bean id="user2" class="com.itmayiedu.entity.UserEntity"> <property name="userId" value="0002"></property> <property name="userName" value="张三"></property> </bean> </beans>
Java代码:
//1.读取springxml配置 ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.获取bean对象 TestService testService = (TestService) classPathXmlApplicationContext.getBean("testService"); System.out.println(testService.test());
什么是SpringIOC底层实现原理
1.读取bean的XML配置文件
2.使用beanId查找bean配置,并获取配置文件中class地址。
3.使用Java反射技术实例化对象
4.获取属性配置,使用反射技术进行赋值。
详细步骤
1.利用传入的参数获取xml文件的流,并且利用dom4j解析成Document对象
2.对于Document对象获取根元素对象后对下面的标签进行遍历,判断是否有符合的id.
3.如果找到对应的id,相当于找到了一个Element元素,开始创建对象,先获取class属性,根据属性值利用反射建立对象.
4.遍历标签下的property标签,并对属性赋值.注意,需要单独处理int,float类型的属性.因为在xml配置中这些属性都是以字符串的形式来配置的,因此需要额外处理.
5.如果属性property标签有ref属性,说明某个属性的值是一个对象,那么根据id(ref属性的值)去获取ref对应的对象,再给属性赋值.
6.返回建立的对象,如果没有对应的id,或者下没有子标签都会返回null
建立实体类
public class User { private String userId; private String userName; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
使用反射技术完成Java代码
import java.lang.reflect.Field; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import com.itmayiedu.entity.User; public class ClassPathXmlApplicationContext { private String xmlPath; /** * * @param xmlPath * spring xml 配置路径 */ public ClassPathXmlApplicationContext(String xmlPath) { this.xmlPath = xmlPath; } public Object getBean(String beanId) throws Exception { // 解析xml器 SAXReader saxReader = new SAXReader(); Document read = null; try { // 从项目根目录路径下 读取 read = saxReader.read(this.getClass().getClassLoader().getResourceAsStream(xmlPath)); } catch (Exception e) { e.printStackTrace(); } if (read == null) { return null; } // 获取根节点资源 Element root = read.getRootElement(); List<Element> elements = root.elements(); if (elements.size() <= 0) { return null; } Object oj = null; for (Element element : elements) { String id = element.attributeValue("id"); if (StringUtils.isEmpty(id)) { return null; } if (!id.equals(beanId)) { continue; // throw new Exception("使用beanId:" + beanId + ",未找到该bean"); } // 获取实体bean class地址 String beanClass = element.attributeValue("class"); // 使用反射实例化bean Class<?> forNameClass = Class.forName(beanClass); oj = forNameClass.newInstance(); // 获取子类对象 List<Element> attributes = element.elements(); if (attributes.size() <= 0) { return null; } for (Element et : attributes) { // 使用反射技术为方法赋值 String name = et.attributeValue("name"); String value = et.attributeValue("value"); Field field = forNameClass.getDeclaredField(name); field.setAccessible(true); field.set(oj, value); } } return oj; // 1.使用beanId查找配置文件中的bean。 // 2.获取对应bean中的classpath配置 // 3.使用java反射机制实体化对象 } public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); User bean = (User) applicationContext.getBean("user2"); System.out.println("使用反射获取bean" + bean.getUserId() + "---" + bean.getUserName()); } }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- Spring学习之手写SpringIOC框架
- 实现一个简易的IoC框架(上)(此篇与Spring.NET无关,为自己手写IoC框架)
- 手写springIoc框架
- 利用反射手写有一个简单的SpringIOC框架
- 手写SpringIOC框架
- 手写spring ioc框架
- 实现一个简易的IoC框架(上)(此篇与Spring.NET无关,为自己手写IoC框架)
- 手写精简版spring 框架后对ioc的体会
- 打造简易的依赖注入框架(下)(此篇与Spring.NET无关,为自己手写IoC框架)
- (A5,二)利用java反射机制----手写SpringIOC框架
- 手写SpringIOC框架
- 手写SpringIOC容器框架
- AS3 IOC框架Spring Actionscript 的使用总结
- Spring 框架学习(三):IoC 容器
- 框架-Spring学习第三天(IOC)
- 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.1) 登录功能的实现,开始接触Spring IOC、DI
- 8、SSM框架-Spring之IOC的自动装配(8)
- 带你手写基于 Spring 的可插拔式 RPC 框架(三)通信协议模块
- SSH框架之Spring的IOC容器的创建对象、对象依赖关系(1)
- SSM框架(Spring + SpringMVC + MyBatis)学习笔记,第一课:Spring IoC