一个简单IOC与DI示例
2018-06-18 03:17:24来源:未知 阅读 ()
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); } } }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring IOC 2020-06-10
- Linux简单命令的学习 2020-06-10
- 因为命名被diss无数次。简单聊聊编程最头疼的事情之一:命名 2020-06-10
- 作为一个面试官,我想问问你Redis分布式锁怎么搞? 2020-06-10
- 「starter推荐」简单高效Excel 导出工具 2020-06-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash