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是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅 ...
随机推荐
- [原创]Allegro 导入DXF文件,保留布好的线路信息
最近智能钥匙产品开发过程中,由于结构装配尺寸的偏差,需要对电路PCB外框OUTLINE进行缩小调整,并且USB插座定位孔改变. Allegro软件在线性绘制方面是有严重缺陷的,想绘制一个异形的板框比较 ...
- autofac 实例生命周期
转自逆心博客园 autofac 实例生命周期 实例生命周期决定在同一个服务的每个请求的实例是如何共享的. 当请求一个服务的时候,Autofac会返回一个单例 (single instance作用域), ...
- Jenkins的安装配置[转]
Jenkins的安装配置 一.Jenkins简介 Jenkins 是一个可扩展的持续集成引擎.Jenkins可以帮我们将代码进行统一的编译打包.还可以放到tomcat容器中进行发布.简单来说就是我们通 ...
- pycharm环境下:同文件夹下文件(.py)之间的调用,出现红线问题
只要将pycharm下打开项目后: 将你运行文件(.py)的项目设置为根目录,就不会出现红色线:
- ASP.NET获取文件名,后缀名
using System.IO; //引入命名空间 string path = "text.aspx"; string pathName = Path.GetFileName(pa ...
- 如何设置Jquery UI Menu 菜单为横向展示
Jquery UI Menu 默认是纵向展示的.Jquey UI Menu 设置API,http://api.jqueryui.com/menu/#option-position 修改对应的CSS可 ...
- UNIX环境编程学习笔记(10)——文件I/O之硬链接和符号链接
lienhua342014-09-15 1 文件系统数据结构 UNIX 文件系统通过 i 节点来存储文件的信息.如图 1 所示为一个磁盘柱面上的 i 节点和数据块示意图.其中 i 节点是一个固定长度的 ...
- VIM技巧:选择文本块
在正常模式下(按ESC进入)按键v进入可视化模式,然后按键盘左右键或h,l键即可实现文本的选择.其它相关命令:v:按字符选择.经常使用的模式,所以亲自尝试一下它. V:按行选择.这在你想拷贝或者移动很 ...
- BarTender个别条码的前缀知识讲解
BarTender条码前缀可以强制其根据您选择的行业标准(如 GS1 或 AIM)向条形码的开头添加一个或多个字符.支持的符号体系仅包括2D-Pharmacode.Data Matri.GS1 Dat ...
- AWS系列-创建 IAM 用户
创建 IAM 用户(控制台) 官方文档 https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/introduction.html 通过 AWS ...