spring基础---->spring自定义初始化(一)
这里我们简单的实现一下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自定义初始化(一)的更多相关文章
- spring基础---->spring自定义标签(一)
Spring具有一个基于架构的扩展机制,可以使用xml文件定义和配置bean.本博客将介绍如何编写自定义XML bean的解析器,并用实例来加以说明.其实我一直相信 等你出现的时候我就知道是你. Sp ...
- spring基础---->spring自定义初始化(二)
这里新增了对ref属性的支持,并且过滤了已经解析的元素.人生有两个词很棒,一言不合和不提也罢. spring自定义对ref属性支持 项目的结构如下:新增一个ThirdBean类,修改了ParseXml ...
- spring基础学习01
spring基础 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用 IOC控制反转 把创建对象和维护对象之间的关系权利 ...
- Spring框架 - Spring和Spring框架组成
Spring框架 - Spring和Spring框架组成 Spring是什么?它是怎么诞生的?有哪些主要的组件和核心功能呢? 本文通过这几个问题帮助你构筑Spring和Spring Framework ...
- Spring基础知识
Spring基础知识 利用spring完成松耦合 接口 public interface IOutputGenerator { public void generateOutput(); } 实现类 ...
- Spring基础系列-容器启动流程(1)
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9870339.html 概述 我说的容器启动流程涉及两种情况,SSM开发模式和Spri ...
- 第65节:Java后端的学习之Spring基础
Java后端的学习之Spring基础 如果要学习spring,那么什么是框架,spring又是什么呢?学习spring中的ioc和bean,以及aop,IOC,Bean,AOP,(配置,注解,api) ...
- spring基础回顾
1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...
- Spring基础知识详解
Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring ...
随机推荐
- oracle for update和for update nowait的区别 - 转
1.for update 和 for update nowait 的区别: 首先一点,如果只是select 的话,Oracle是不会加任何锁的,也就是Oracle对 select 读到的数据不会有任何 ...
- sqlmap注入常见用法一条龙 【转】
sqlmap是一个灰常强大的sql注入检测与辅助工具,但是由于没有图形界面,基本上用起来比较麻烦,导致很多人可能宁愿用havij或者是pangonlin也不愿意麻烦去翻帮助界面,我自己也是把很多语句贴 ...
- Asp.Net MVC :路由器
特性路由 特性路由是对现有路由系统的扩展,提供了一种针对某个具体Controller类型或Action方法的路由注册方式.从而可以对路由规则进行细粒度的设计. 特性路由(Attribute Route ...
- Dynamics CRM 2015/2016 Web API:聚合查询
各位小伙伴们,今天是博主2016年发的第一篇文章.首先祝大家新年快乐.工资Double,哈哈.今天我们来看一个比較重要的Feature--使用Web API运行FetchXML查询! 对的,各位.你们 ...
- Hadoop分布式集群部署(单namenode节点)
Hadoop分布式集群部署 系统系统环境: OS: CentOS 6.8 内存:2G CPU:1核 Software:jdk-8u151-linux-x64.rpm hadoop-2.7.4.tar. ...
- 【CentOS】安装部署jenkins从git获取代码[转]
持续集成①安装部署jenkins从git获取代码 一:持续集成的概念: 1.1:总体的概括 持续集成Continuous Integration 持续交付Continuous Delivery 持续部 ...
- php 一维数组去重
$input = array("a" => "green", "red", "b" => "gre ...
- vue项目中使用md5.js及base64.js
一.在项目根目录下安装 npm install --save js-base64 npm install --save js-md5 二.在项目文件中引入 import md5 from 'js-md ...
- Linux下MySQL开放root的远程访问权限
mysql默认只能从本地连接,所以要使root可以远程访问登录,需做如下设置: 1.授权 请使用以下命令 mysql> Grant all privileges on *.* to 'root' ...
- Java常用数据结构之Set之TreeSet
前言 上篇文章我们分析了HashSet,它是基于HashMap实现的,那TreeSet会是怎么实现的呢?没错!和大家想的一样,它是基于TreeMap实现的.所以,TreeSet的源码也很简单,主要还是 ...