这里我们简单的实现一下spring中的初始化bean,以大概了解他的流程。受委屈几乎是一个人成长最快的途径,吃下去的是委屈,消化掉后得到的是格局。

spring的自定义初始化

测试的项目结构如下:

一、定义两个简单的Bean对象

  • FirstBean.java,变量需要set方法:
package com.spring1.bean;

public class FirstBean {
private String username;
private String password; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getUserInfo() {
return username + ", " + password;
}
}

FirstBean.java

  • SecondBean.java,变量需要set方法:
package com.spring1.bean;

public class SecondBean {
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;
} public String getUserInfo() {
return name + ", " + age;
}
}

SecondBean.java

二、定义一个管理Bean的工厂类BeanFactory

package com.spring1.factory;

import java.util.HashMap;
import java.util.Map; public class BeanFactory {
Map<String, Object> map = new HashMap<>(); public Object getBean(String key) {
return map.get(key);
} public <T> T getBean(String key, Class<T> tClass) {
return (T) map.get(key);
} public void setBean(String name, Object object) {
map.put(name, object);
}
}

三、定义一个解析xml文件,并把初始化的bean存放到beanFactory的类

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.List; public class ParseXmlBean {
public static BeanFactory parseXmlBean(String filepath) {
BeanFactory beanFactory = new BeanFactory();
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");
for (Element entry : entries) {
String beanId = entry.attributeValue("id");
String beanClass = entry.attributeValue("class");
Class<?> 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");
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);
}
} catch (Exception e) {
e.printStackTrace();
}
return beanFactory;
} private static String getMethodName(String name) {
return "set" + SpringUtil.firstLetterUpper(name);
}
}

四、一个简单的工具类

package com.spring1;

public class SpringUtil {
public static String firstLetterUpper(String name) {
return name.substring(0, 1).toUpperCase() + name.substring(1);
}
}

五、测试的主体类如下

package com.spring1.main;

import com.spring1.bean.FirstBean;
import com.spring1.bean.SecondBean;
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);
}
}

运行的结果如下:

huhx,
liuling,

六、测试的xml文件如下

<beans>
<bean id="firstBean" class="com.spring1.bean.FirstBean">
<property name="username" value="huhx"/>
<property name="password" value="1234"/>
</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自定义初始化(一)的更多相关文章

  1. spring基础---->spring自定义标签(一)

    Spring具有一个基于架构的扩展机制,可以使用xml文件定义和配置bean.本博客将介绍如何编写自定义XML bean的解析器,并用实例来加以说明.其实我一直相信 等你出现的时候我就知道是你. Sp ...

  2. spring基础---->spring自定义初始化(二)

    这里新增了对ref属性的支持,并且过滤了已经解析的元素.人生有两个词很棒,一言不合和不提也罢. spring自定义对ref属性支持 项目的结构如下:新增一个ThirdBean类,修改了ParseXml ...

  3. spring基础学习01

    spring基础 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用 IOC控制反转 把创建对象和维护对象之间的关系权利 ...

  4. Spring框架 - Spring和Spring框架组成

    Spring框架 - Spring和Spring框架组成 Spring是什么?它是怎么诞生的?有哪些主要的组件和核心功能呢? 本文通过这几个问题帮助你构筑Spring和Spring Framework ...

  5. Spring基础知识

    Spring基础知识 利用spring完成松耦合 接口 public interface IOutputGenerator { public void generateOutput(); } 实现类 ...

  6. Spring基础系列-容器启动流程(1)

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9870339.html 概述 ​ 我说的容器启动流程涉及两种情况,SSM开发模式和Spri ...

  7. 第65节:Java后端的学习之Spring基础

    Java后端的学习之Spring基础 如果要学习spring,那么什么是框架,spring又是什么呢?学习spring中的ioc和bean,以及aop,IOC,Bean,AOP,(配置,注解,api) ...

  8. spring基础回顾

    1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...

  9. Spring基础知识详解

    Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring ...

随机推荐

  1. Type cvc-complex-type.2.4.c: The matching wildcard is strict...

    这个问题困扰了我两次,分别说一下原因:1. 如网上一些网友所言,是在配置Spring的标签库的时候有拼写错误或者遗漏.下面贴一个标准3.0的吧: <?xml version="1.0& ...

  2. C# Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005

    环境说明: Win2008 R2(中文版) x64 .IIS 7.0 功能说明:上传Excel到服务器,并在服务器端读取Excel中的数据: 异常信息:Retrieving the COM class ...

  3. Linux入门教程:如何检查Linux系统的最后重启时间

    问题: 是否有一个命令可以快速地检查系统已经运行了多久? 也就是我怎么知道Linux系统最后的重启时间? 有许多方法来查询系统最后的重启时间. 方法一 第一种方法是使用last命令. $ last r ...

  4. vue的安装

    第一步:环境的搭建 : vue推荐开发环境: Node.js: javascript运行环境(runtime),不同系统直接运行各种编程语言(https://nodejs.org/zh-cn/down ...

  5. python实现原地刷新方式输出-可用于百分比进度显示输出

    方式1: import sys sys.stdout.write('\r' + '你的输出详情') sys.stdout.flush() 方式2: print('\r' + '你的输出详情', end ...

  6. Spring定时器的两种实现方式

    有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz. 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 imp ...

  7. Express框架Fetch通信

    最近自己弄个博客站点,前台用的React,服务器用的是node实现的,node是第一次接触,所以还在摸索,这篇mark下通信时遇到的坑. fetch配置: window.fetchUtility = ...

  8. Mac OS X 下安装MySQL 5.7

    下载安装包 官网下载安装包 选择相应的版本和格式,有 .dmg 和压缩包两种. 这里选择简单直接的 .dmg安装包,下载的时候可以将下载地址直接贴到迅雷,速度比较快. 安装 安装很简单,直接双击下好的 ...

  9. 图解HTTP学习笔记——简单的HTTP协议

    简单的HTTP协议 前言 最近在学习Web开发的相关知识,发现<图解HTTP>这本书通俗易懂.所以花时间学习这本书,并记录下学习笔记. 如上图,我们每天都在浏览网页,一般我们都是在浏览器地 ...

  10. Canvas控件之CanvasGroup

    Canvas Group可以用来控制一组不需要个别控制的UI元素的某些方面,CanvasGroup的属性会影响他所有children的GameObject 其中有四个选项: -Alpha:这个选项很多 ...