一个简单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 一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这 ...
随机推荐
- [JS] 气球放气效果
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- 定期删除Azure存储账号下N天之前的数据文件-ASM
######RemoveStorageBlob*DaysOld##### <# .SYNOPSIS Remove all blob contents from one storage accou ...
- C#-MVC-强数据类型、TempData、多表单、ajax
一.强数据类型 将某一个或一组数据在控制器传递到视图上去 一个视图里只能有一个强类型数据 强类型数据 - 将某一个或一组数据在控制器传递到视图上去,同ViewBag,数据更稳定,防止多数据传递中出现错 ...
- ownCloud问题处理server replied 423 Locked to
打开owncloud 数据库备份:oc_file_locks表(备份免错哦)然后清空该表,客户端同步一次,故障解决 owncloud大的数据无法同步..
- github访问慢加速访问
实测从1kb到了1m多 方法: 登录 https://www.ipaddress.com/ 输入github.com得到一个或两个IP地址 输入github.global.ssl.fastly.net ...
- 洛谷 P4774 / loj 2721 [NOI2018] 屠龙勇士 题解【同余】【exgcd】【CRT】
推导过程存在漏洞+exCRT板子没打熟于是期望得分÷实际得分=∞? 题目描述 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号 \(1\sim n\) 顺序杀掉 \(n\ ...
- 【性能测试】脚本开发,最普通的http协议脚本
放上来做个备份: Action() { double transTime; // 事务消耗时间 lr_start_transaction("营销_01_MSMH0011_查询拥有码列表&qu ...
- Monkey and Banana
Monkey and BananaTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- python-Lock进程同步解决互斥
#!/usr/bin/python from multiprocessing import Process,Lock import time,sys def A(lock): with lock: f ...
- JavaScript设计模式-20.责任链模式
<html> <head> <title>javascript高级语法20-责任链模式</title> </head> <body&g ...