• 非spring 开发
  1. public class UserService {
  2.  
  3. private UserDao userDao=new UserDaoImpl();
  4.  
  5. public void addUser(User user){
  6. userDao.addUser(user);
  7. }
  8. }
  1. public interface UserDao {
  2.  
  3. public void addUser(User user);
  4. }
  1. public class UserDaoImpl implements UserDao {
  2.  
  3. @Override
  4. public void addUser(User user) {
  5. // TODO Auto-generated method stub
  6. //保存数据 这边省略连接数据库操作代码
  7. System.out.println("id:"+user.getId()+",name"+user.getName());
  8. System.out.println("user save !!!");
  9. }
  10. }

测试代码

  1. public class Test1 {
  2.  
  3. private UserService userService=new UserService();
  4. private User user;
  5.  
  6. @Before
  7. public void init(){
  8. user=new User();
  9. user.setId(1);
  10. user.setName("zhangsan");
  11. userService=new UserService();
  12. }
  13.  
  14. @Test
  15. public void test(){
  16. userService.addUser(user);
  17. }
  18. }

结果:

  1. id---1,name---zhangsan
  2. user save !!!
  • 模拟spring开发模式,将所有对象都放到容器中,用到的对象从容器中取
  • 所有的对象通过xml文件的形式进行配置,使用jdom读取xml文件内容

导包  读取beans.xml文件

  1. <beans>
  2. <!-- 配置文件形式 配置 userdao -->
  3. <bean id="userDao" class="com.qzzx.dao.impl.UserDaoImpl"></bean>
  4. <!-- 配置文件形式 配置userservice -->
  5. <bean id="userService" class="com.qzzx.service.UserServiceXml">
  6. <property name="userDao" bean="userDao"></property>
  7. </bean>
  8. </beans>

beans 配置文件

  1. public class ClassPathXmlApplicationContext implements BeanFactory{
  2.  
  3. //定义一个容器存放bean对象
  4. Map<String, Object> map=new HashMap<>();
  5. /**
  6. * 初始化容器
  7. */
  8. public ClassPathXmlApplicationContext() {
  9. //使用jdom解析 beans.xml文件
  10. SAXBuilder sb=new SAXBuilder();
  11. try {
  12. //获取文档对象
  13. Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));
  14. //获取根节点
  15. Element root = doc.getRootElement();
  16. //获取所有bean节点
  17. List childrenBean = root.getChildren("bean");
  18. for (int i = 0; i < childrenBean.size(); i++) {
  19. //遍历获取单个bean标签,并取得其中id和class属性的值
  20. Element bean = (Element) childrenBean.get(i);
  21. String id=bean.getAttributeValue("id");
  22. String clazz=bean.getAttributeValue("class");
  23. //打印查看
  24. // System.out.println("id:"+id+",class:"+clazz);
  25. //利用反射原理获得对象,并且实例化
  26. Object obj = Class.forName(clazz).newInstance();
  27. //将对象存到 容器中
  28. map.put(id, obj);
  29.  
  30. //模拟 依赖注入 遍历bean中的标签
  31. List properties = bean.getChildren("property");
  32. for (int j = 0; j < properties.size(); j++) {
  33. Element p = (Element) properties.get(j);
  34. String name = p.getAttributeValue("name");
  35. String beanName = p.getAttributeValue("bean");
  36. //获得注入对象
  37. Object setObject = map.get(beanName);
  38.  
  39. //采用 set方法将对象注入 clazz名》》set方法名》》method》》执行 method,注入
  40. String methodName="set"+name.substring(0, 1).toUpperCase()+name.substring(1, name.length());
  41. // System.out.println("methodName:"+methodName);
  42. // System.out.println("接口名字:"+setObject.getClass().getInterfaces()[0]);
  43. Method method = obj.getClass().getMethod(methodName, setObject.getClass().getInterfaces()[0]);
  44. method.invoke(obj, setObject);
  45. String GetMethodName="get"+name.substring(0, 1).toUpperCase()+name.substring(1, name.length());
  46.  
  47. // Method method2= obj.getClass().getMethod(GetMethodName);
  48. // Object invoke = method2.invoke(obj);
  49. // System.out.println(invoke==setObject);
  50. }
  51. }
  52.  
  53. System.out.println("对象容器:"+map);
  54. } catch (Exception e) {
  55. e.printStackTrace();
  56. }
  57. }
  58.  
  59. @Override
  60. public Object getBean(String name) {
  61. // TODO Auto-generated method stub
  62. return map.get(name);
  63. }
  64.  
  65. }

bean 容器

  1. public interface BeanFactory {
  2.  
  3. public Object getBean(String name);
  4.  
  5. }

beanFactory

  1. public class UserServiceXml {
  2.  
  3. private UserDao userDao;
  4.  
  5. public void addUser(User user){
  6. userDao.addUser(user);
  7. }
  8. public UserDao getUserDao() {
  9. return userDao;
  10. }
  11.  
  12. public void setUserDao(UserDao userDao) {
  13. this.userDao = userDao;
  14. }
  15.  
  16. }

userServiceXml

  1. public class UserDaoImpl implements UserDao {
  2.  
  3. @Override
  4. public void addUser(User user) {
  5. // TODO Auto-generated method stub
  6. //保存数据 这边省略连接数据库操作代码
  7. System.out.println("id---"+user.getId()+",name---"+user.getName());
  8. System.out.println("user save !!!");
  9. }
  10. }

userdao

  1. public class Test2 {
  2.  
  3. @Test
  4. public void test2(){
  5. ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext();
  6. UserServiceXml userServiceXml = (UserServiceXml) ac.getBean("userService");
  7. User user=new User();
  8. user.setId(2);
  9. user.setName("李四");
  10. userServiceXml.addUser(user);
  11. }
  12.  
  13. }

testSpring

  1. 对象容器:{userService=com.qzzx.service.UserServiceXml@11c836e8, userDao=com.qzzx.dao.impl.UserDaoImpl@6f8cc276}
  2. id---2,name---李四
  3. user save !!!

spring模拟ioc的更多相关文章

  1. [原]容器学习(一):动手模拟spring的IoC

    介绍 学习经典框架的实现原理以及设计模式在其实际中的运用,是非常有必要的,可以让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能,明白原理后,可以更好的使用它,进而为进行面向对象提供一 ...

  2. 容器学习(一):动手模拟spring的IoC

    介绍 学习经典框架的实现原理以及设计模式在事实上际中的运用,是很有必要的,能够让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能.明确原理后,能够更好的使用它,进而为进行面向对象提供一 ...

  3. Spring——原理解析-利用反射和注解模拟IoC的自动装配

    解析Spring的IoC容器基于注解实现的自动装配(自动注入依赖)的原理 1.本文案例 使用注解和反射机制来模拟Spring中IoC的自动装配功能 定义两个注解:@Component,用来标注组件:@ ...

  4. JAVA模拟Spring实现IoC过程(附源码)

    前言:本人大四学生,第一次写博客,如果有写得不好的地方,请大家多多指正 一.IoC(Inversion of Control)反转控制 传统开发都是需要对象就new,但这样做有几个问题: 效率低下,创 ...

  5. 自己动手模拟spring的IOC

    我们这里是模拟spring,主要模拟spring中的IOC功能,所以在此我们一样要在service层中定义dao的实例,当然不用new出来,我们就通过spring的IOC把这里的dao层注入进来.不要 ...

  6. Spring的Ioc模拟实现

      关于IOC:我们讲个故事吧! 有一个厨师,他在做一道菜的时候需要某种调味料(bean),可是他正好没有那瓶调味料(bean),这个时候他就必须去制作一瓶调味料(bean)出来.(这就像我们平时需要 ...

  7. spring容器IOC创建对象<三>

    问题?Spring的DI讲解.DI有几种注入方式.一.spring的DI:依赖注入给属性赋值DI定义:一个对象类的属性可以使用springDI(依赖注入)来进行赋值,但是并不是所有的类属性都适合spr ...

  8. Spring中IOC和AOP的详细解释

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC就是典型的工厂模式,通过s ...

  9. Spring 实践 -IoC

    Spring 实践 标签: Java与设计模式 Spring简介 Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转) ...

随机推荐

  1. Win10系列:JavaScript 数据绑定

    使用数据绑定可以使页面中元素的属性值与数据源中的数据同步,其中数据源可以来自数据库.文件以及自定义的数据等.在常用的数据绑定方法中,简单对象绑定是将HTML元素与一个仅包含数据的简单对象相绑定,模板绑 ...

  2. 尚学堂java 答案解析 第四章

    本答案为本人个人编辑,仅供参考,如果读者发现,请私信本人或在下方评论,提醒本人修改 一.选择题 1.BD 解析:B:类必须有构造方法,若程序未写,这系统自动调用系统构造方法. D:super()会调用 ...

  3. 深入理解 Java 虚拟机——走近 Java

    1.1 - 概述 Java 总述:Java 不仅是一门编程语言,还是一个由一系列 计算机软件 和 规范 形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于 嵌入式 ...

  4. global 全局变量 nonlocal 局部变量

    # x= # def func(): # x= # # func() # print(x) # x=[] # def func(): # x.append() # x.append() # x.app ...

  5. sqlalchemy 模型中添加根据身份证号计算性别和年龄

    class Users(Base, BaseMixin): username = Column(String(24)) id_Num = Column(String(18) ) # 身份证号码 @pr ...

  6. vue-router-7-重定向及别名

    const router = new VueRouter({ mode: 'history', base: __dirname, routes: [ { path: '/', component: H ...

  7. 在JS文件中,不需要<script>标签

    在JS文件中,不需要<script>标签\

  8. Capjoint

    前期知识储备: 现如今的全球台站分布情况:在全球大陆的分布并不均衡.在美国加利福尼亚.日本.中国台湾等地区,台站分布密集,数字化程度高.然而在世界很多地区发生的地震,往往在300km范围内仅有2到3个 ...

  9. 一个灵活的AssetBundle打包工具

      尼尔:机械纪元 上周介绍了Unity项目中的资源配置,今天和大家分享一个AssetBundle打包工具.相信从事Unity开发或多或少都了解过AssetBundle,但简单的接口以及众多的细碎问题 ...

  10. C点滴成海----函数声明、函数定义、函数原型

    一.函数声明 1.格式 函数体去掉函数定义中的内容再加上分号,如下所示: 返回值类型 函数名( 类型 形参, 类型 形参… ); 返回值类型 函数名( 类型, 类型…); 2.特点 函数声明只是对编译 ...