spring基础---->spring自定义初始化(二)
这里新增了对ref属性的支持,并且过滤了已经解析的元素。人生有两个词很棒,一言不合和不提也罢。
spring自定义对ref属性支持
项目的结构如下:新增一个ThirdBean类,修改了ParseXmlBean和MainTest两个类。
一、ThirdBean是一个测试的Bean类
- package com.spring1.bean;
- public class ThirdBean {
- private SecondBean secondBean;
- private String username;
- public SecondBean getSecondBean() {
- return secondBean;
- }
- public void setSecondBean(SecondBean secondBean) {
- this.secondBean = secondBean;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public void printUserInfo() {
- System.out.println(secondBean.getUserInfo() + ", " + username);
- }
- }
二、修改的xml解析类ParseXmlBean
- package com.spring1.parse;
- import com.spring1.SpringUtil;
- import com.spring1.factory.BeanFactory;
- import org.dom4j.Document;
- import org.dom4j.Element;
- import org.dom4j.io.SAXReader;
- import java.io.InputStream;
- import java.lang.reflect.Method;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- public class ParseXmlBean {
- static BeanFactory beanFactory = new BeanFactory();
- static Map<String, Element> elementMap = new HashMap<>();
- public static BeanFactory parseXmlBean(String filepath) {
- SAXReader reader = new SAXReader();
- try {
- InputStream stream = ParseXmlBean.class.getClassLoader().getResourceAsStream(filepath);
- Document document = reader.read(stream);
- Element rootElement = document.getRootElement();
- List<Element> entries = rootElement.elements("bean");
- // 这个map记录id和元素,由于ref的原因
- for (Element entry : entries) {
- String beanId = entry.attributeValue("id");
- elementMap.put(beanId, entry);
- }
- for (Element entry : entries) {
- parseObjectElement(entry);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return beanFactory;
- }
- private static String getMethodName(String name) {
- return "set" + SpringUtil.firstLetterUpper(name);
- }
- /**
- * 对Bean的元素进行解析
- */
- public static Object parseObjectElement(Element entry) {
- String beanId = entry.attributeValue("id");
- // 如果已经解析了,那么就不需要再解析
- if (beanFactory.getBean(beanId) != null) {
- return beanFactory.getBean(beanId);
- }
- String beanClass = entry.attributeValue("class");
- Class<?> bean = null;
- try {
- bean = Class.forName(beanClass);
- Object beanObject = bean.newInstance();
- for (Object subEntry : entry.elements("property")) {
- String name = ((Element) subEntry).attributeValue("name");
- String value = ((Element) subEntry).attributeValue("value");
- String dataType = ((Element) subEntry).attributeValue("dataType");
- String ref = ((Element) subEntry).attributeValue("ref");
- if (ref != null) {
- Object object = beanFactory.getBean(ref); // 从工厂得到object
- // 如果object没有(有可能定义在后面),那么解析这个bean
- if (object == null) {
- Element element = elementMap.get(ref);
- Object refObject = parseObjectElement(element);
- Method method = bean.getMethod(getMethodName(refObject.getClass().getSimpleName()), new Class[]{refObject.getClass()});
- method.invoke(beanObject, new Object[]{refObject});
- } else {
- Method method = bean.getMethod(getMethodName(name), new Class[]{object.getClass()});
- method.invoke(beanObject, new Object[]{object});
- }
- beanFactory.setBean(beanId, beanObject);
- } else {
- Method method;
- if (dataType == null) {
- method = bean.getMethod(getMethodName(name), new Class[]{String.class});
- method.invoke(beanObject, new Object[]{value});
- } else if (dataType.equals("int")) {
- method = bean.getMethod(getMethodName(name), new Class[]{int.class});
- method.invoke(beanObject, new Object[]{Integer.valueOf(value)});
- }
- }
- }
- beanFactory.setBean(beanId, beanObject);
- return beanObject;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
三、测试的主体类
- package com.spring1.main;
- import com.spring1.bean.FirstBean;
- import com.spring1.bean.SecondBean;
- import com.spring1.bean.ThirdBean;
- import com.spring1.factory.BeanFactory;
- import com.spring1.parse.ParseXmlBean;
- import org.junit.Test;
- public class MainTest {
- @Test
- public void test_1() {
- BeanFactory beanFactory = ParseXmlBean.parseXmlBean("config/bean.xml");
- FirstBean firstBean = beanFactory.getBean("firstBean", FirstBean.class);
- String userInfo = firstBean.getUserInfo();
- System.out.println(userInfo);
- SecondBean secondBean = (SecondBean) beanFactory.getBean("secondBean");
- String userInfo1 = secondBean.getUserInfo();
- System.out.println(userInfo1);
- ThirdBean thirdBean = (ThirdBean) beanFactory.getBean("thirdBean");
- thirdBean.printUserInfo();
- }
- }
四、运行的结果如下
- huhx,
- liuling,
- liuling, , linux
五、定义的xml文件如下:
- <beans>
- <bean id="firstBean" class="com.spring1.bean.FirstBean">
- <property name="username" value="huhx"/>
- <property name="password" value="1234"/>
- </bean>
- <bean id="thirdBean" class="com.spring1.bean.ThirdBean">
- <property name="secondBean" ref="secondBean"/>
- <property name="username" value="linux"/>
- </bean>
- <bean id="secondBean" class="com.spring1.bean.SecondBean">
- <property name="age" value="21" dataType="int"/>
- <property name="name" value="liuling"/>
- </bean>
- </beans>
友情链接
spring基础---->spring自定义初始化(二)的更多相关文章
- spring基础---->spring自定义初始化(一)
这里我们简单的实现一下spring中的初始化bean,以大概了解他的流程.受委屈几乎是一个人成长最快的途径,吃下去的是委屈,消化掉后得到的是格局. spring的自定义初始化 测试的项目结构如下: 一 ...
- spring基础---->spring自定义标签(一)
Spring具有一个基于架构的扩展机制,可以使用xml文件定义和配置bean.本博客将介绍如何编写自定义XML bean的解析器,并用实例来加以说明.其实我一直相信 等你出现的时候我就知道是你. Sp ...
- spring基础学习01
spring基础 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用 IOC控制反转 把创建对象和维护对象之间的关系权利 ...
- Spring框架 - Spring和Spring框架组成
Spring框架 - Spring和Spring框架组成 Spring是什么?它是怎么诞生的?有哪些主要的组件和核心功能呢? 本文通过这几个问题帮助你构筑Spring和Spring Framework ...
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
- spring扩展点之二:spring中关于bean初始化、销毁等使用汇总,ApplicationContextAware将ApplicationContext注入
<spring扩展点之二:spring中关于bean初始化.销毁等使用汇总,ApplicationContextAware将ApplicationContext注入> <spring ...
- 十二、Spring之IOC容器初始化
Spring之IOC容器初始化 前言 在前面我们分析了最底层的IOC容器BeanFactory,接着简单分析了高级形态的容器ApplicationContext,在ApplicationContext ...
- Spring基础知识
Spring基础知识 利用spring完成松耦合 接口 public interface IOutputGenerator { public void generateOutput(); } 实现类 ...
- Spring基础知识汇总 Java开发必看
Spring简介 Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版.Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅 ...
随机推荐
- Lua------------------unity与lua的热更新
[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读 标签: 游戏开发游戏解决方案用户体验unity3d 2014-10-18 23:23 7680人阅读 ...
- Eclipse文件首部自动加 作者时间
Window -> Preferences -> Java -> Code Style -> Code templates -> (in right-hand pane) ...
- linux环境下获取真实的ip地址
package inas.test; import java.net.Inet6Address; import java.net.InetAddress; import java.net.Networ ...
- iOS: UIScrollView pauses NSTimer while scrolling
StackOverflow http://stackoverflow.com/a/7059499 Question:I have a UIScrollView that has a series of ...
- 利用neon技术对矩阵旋转进行加速(2)
上次介绍的是顺时针旋转90度,最近用到了180度和270度,在这里记录一下. 1.利用neon技术将矩阵顺时针旋转180度: 顺时针旋转180度比顺时针旋转90度容易很多,如下图 A1 A2 A3 A ...
- 【玩转Golang】 自定义json序列化对象时,非法字符错误原因
由于前台web页面传来的日期对象是这样的格式“2010-11-03 15:23:22”,所以我安装网上查来的办法,自定义包装了time.Time对象,实现自己的Marshal和UnMarshal方法 ...
- RMAN:简单的duplicate创建新数据库 for 12c+
构建参数文件 *.db_name='test2' ##### 需要注意的地方,和rman的duplicate目标库一致 *.compatible='18.0.0' ##### 关键的地方,每个版本的模 ...
- 用Python写简单的爬虫
准备: 1.扒网页,根据URL来获取网页信息 import urllib.parse import urllib.request response = urllib.request.urlopen(& ...
- MysqlHelper使用反射机制智能推算数据类型以及属性名称
public class MySqlHelper { private string ConnString; public MySqlHelper(string connectionString) { ...
- phpcms v9不限模型全站搜索
简单修改一下v9默认的搜索功能,可以不按模型搜索全站内容 下面是被修改后的search模块中的index.php文件 <?php defined('IN_PHPCMS') or exit('No ...