一个简单IOC与DI示例
1、通过bean工厂实现读取xml文件,并实例化对象,实现自动注入。
package com.pri.test; import com.pri.factory.BeanFactory;
import com.pri.service.UserService;
import org.junit.Test; public class BeanFactoryTest { @Test
public void test(){
BeanFactory beanFactory = BeanFactory.getBeanFactory();
UserService user = (UserService)beanFactory.getBean("user"); user.save();
}
}
2、xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans >
<bean id="user" class="com.pri.service.impl.UserServiceImpl01">
<property name="name" value="李四"/>
</bean>
</beans>
3、实例对象:
package com.pri.service.impl;
import com.pri.service.UserService;
public class UserServiceImpl01 implements UserService{
private String name;
public String getName() { return name;}
public void setName(String name) { this.name = name;}
@Override
public void save(){
System.out.println("UserService被调用........::"+name);
}
}
4、BeanFactory工厂:
package com.pri.factory; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; public class BeanFactory { /**
* 私有化构造,禁止以new的方式获取BeanFactory实例
*/
private BeanFactory(){} /**
* 静态内部类,保证只有一个BeanFactory
*/
static class SingleBeanFactory{
static BeanFactory BEANFACTORY = new BeanFactory();
}
/**
* 对外提供一个获取BeanFactory方法
* @return
*/
public static BeanFactory getBeanFactory(){
return SingleBeanFactory.BEANFACTORY;
} public Object getBean(String id) {
try {
Element element = getElement(id);
String classPath = element.attribute("class").getValue();
//根据类的全限定名创建Class对象
Class<?> clazz = Class.forName(classPath);
//创建实例
Object obj = clazz.newInstance();
//为bean对象赋值
setAttributeValue(clazz,element,obj);
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
} private Element getElement(String id) throws DocumentException {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/myconfig.xml");
//精确定位到id属性值为传入字符串的bean元素
return (Element) document.selectSingleNode("//bean[@id='" + id + "']");
} private void setAttributeValue(Class<?> clazz, Element element,Object obj) throws IntrospectionException, IllegalAccessException, InvocationTargetException { Element subElement = element.element("property");
//使用set方法赋值
if (subElement != null) {
String name = subElement.attributeValue("name");
String valueStr = subElement.attributeValue("value"); //创建属性描述器
PropertyDescriptor descriptor = new PropertyDescriptor(name, clazz);
//获取该属性的修饰符
String s = descriptor.getPropertyType().getName(); //获得写方法
Method writeMethod = descriptor.getWriteMethod();
//调用写方法
Object value = null;
if (s.equalsIgnoreCase("int")){
value = Integer.parseInt(valueStr);
}else if (s.equalsIgnoreCase("long")){
value = Long.parseLong(valueStr);
}else if (s.equalsIgnoreCase("short")){
value = Short.parseShort(valueStr);
}else if (s.equalsIgnoreCase("double")){
value = Double.parseDouble(valueStr);
}else if (s.equalsIgnoreCase("float")){
value = Float.parseFloat(valueStr);
}else if (s.equalsIgnoreCase("byte")) {
value = Byte.valueOf(valueStr);
}else{
value = valueStr;
}
writeMethod.invoke(obj, value);
}
}
}
一个简单IOC与DI示例的更多相关文章
- 使用JAVA实现的一个简单IOC注入实例
https://blog.csdn.net/echoshinian100/article/details/77977823 欲登高而望远,勿筑台于流沙 RSS订阅 原 使用JAVA实现的一个简单IOC ...
- 一个简单的JSP程序示例
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- 使用TensorFlow v2张量的一个简单的“hello world”示例
使用TensorFlow v2张量的一个简单的"hello world"示例 import tensorflow as tf # 创建一个张量 hello = tf.constan ...
- 一个简单的Java死锁示例(转)
在实际编程中,要尽量避免出现死锁的情况,但是让你故意写一个死锁的程序时似乎也不太简单(有公司会出这样的面试题),以下是一个简单的死锁例子,程序说明都写着类的注释里了,有点罗嗦,但是应该也还是表述清楚了 ...
- 一个简单的Javascript闭包示例
//=====用闭包实现函数的Curry化===== //数字求和函数的函数生成器 function addGenerator( num ){ //返回一个简单的匿名函数,求两个数的和,其中第一个数字 ...
- 一个简单的 ValueTask 的示例
Task 确实有潜在的缺点,特别是对于实例创建很多 并且高吞吐量和性能是关键问题的场景 : Task 是一个类.作为一个类,这意味着任何需要创建一个对象的操作都需要分配一个对象,分配的对象越多, ...
- [deviceone开发]-一个简单的表单示例
一.简介 这个例子我们用do_ScrollView+do_LinearLayout来实现,当没有输入相关的值而去保存的时候,则把隐藏的几个提示Label显示出来,然后调用do_LinearLayout ...
- 从一个简单的Java单例示例谈谈并发
一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 public class UnsafeLazyInitiallization { private static Un ...
- 从一个简单的Java单例示例谈谈并发 JMM JUC
原文: http://www.open-open.com/lib/view/open1462871898428.html 一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这 ...
随机推荐
- django入门-模型-part2
尊重作者的劳动,转载请注明作者及原文地址 http://www.cnblogs.com/txwsqk/p/6511177.html 完全翻译自官方文档 https://docs.djangoproje ...
- AngularJS入门讲解3:$http服务和路由讲解
上一课的例子中,我们的模型数据是硬编码的,也就是说,我们的数据不是从服务器请求回来的. 这里,我们先讲解,如何从服务器获取数据: function PhoneListCtrl($scope, $htt ...
- mxonline实战6 , 忘记用户密码时进行重置
对应github地址:密码重置 原理: 1. 一个需要输入用户邮箱和注册码的密码忘记页面 2. 点击提交后,用户邮箱收到一个邮件,包含重置密码的链接 3. 点击链接进入密码重置页面 ...
- Linux(Ubuntu)新建用户只有一个$问题
参考自: http://www.cnblogs.com/ylan2009/articles/2321177.html 1.用root登录操作 2.查看/etc/passwd文件中新建用户的权限 有没有 ...
- 一次完整的http请求全程
当我们在打开浏览器的时候,在地址栏输入诸如 http://www.baidu.com时,几秒后浏览器打开百度页面,几秒钟内到底发生了哪些事情. 一.解析URL: 浏览器首先会对输入的URL进行检查,如 ...
- 【转载】基于Redis实现分布式锁
背景在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等.大部分的解决方案是基于DB实现的,Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端 ...
- Machine learning 第7周编程作业 SVM
1.Gaussian Kernel function sim = gaussianKernel(x1, x2, sigma) %RBFKERNEL returns a radial basis fun ...
- (二)Audio子系统之new AudioRecord()
在上一篇文章<(一)Audio子系统之AudioRecord.getMinBufferSize>中已经介绍了AudioRecord如何获取最小缓冲区大小,接下来,继续分析AudioReco ...
- 04-树5 Root of AVL Tree (25 分)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
- pytest文档博客链接
关于pytest的博客: https://www.cnblogs.com/yoyoketang/tag/pytest/default.html?page=2