What are we going to build?

Use singletons of CarManager and BrandManager instead of creating multiple instances.

What is dependency injection ?

Dependency injection (also called inversion of control) is basically giving an object what it needs instead of letting this object get it by itself.

CarManager singleton for CarListController

For the moment, CarListController gets its instance of CarManager by itself:

CarManager carManager = new CarManager();

Let's change that by making it an attribute:

package springmvc.web;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;import springmvc.service.CarManager;public class CarListController implements Controller {private CarManager carManager;public ModelAndView handleRequest(HttpServletRequest arg0,HttpServletResponse arg1) throws Exception {ModelAndView modelAndView = new ModelAndView("carList");modelAndView.addObject("carList", this.carManager.getCarList());return modelAndView;}public CarManager getCarManager() {return carManager;}public void setCarManager(CarManager carManager) {this.carManager = carManager;}
}

We now need to instantiate a CarManager somewhere else and pass it to this controller. It's done in '/WEB-INF/springmvc-servlet.xml':

<bean id="carManager" class="springmvc.service.CarManager"/><bean name="/list_cars.html" class="springmvc.web.CarListController"><property name="carManager" ref="carManager"/>
</bean>
  • a bean 'carManager' is created
  • it's used to initialize 'carManager' of CarListController.

We build (ant), relaunch Tomcat:http://localhost:8180/springmvc/list_cars.html

CarManager singleton for CarNewController

Do it by yourself, it's exactly the same. In the configuration file, use the CarManager instance you've already declared for '/new_car.html'.

CarManager

Since we now use a single instance of CarManager for our whole application, we don't need its carList attribute to be static anymore:

package springmvc.service;import java.math.BigDecimal;
import java.util.LinkedList;
import java.util.List;import springmvc.model.Brand;
import springmvc.model.Car;public class CarManager {private List<Car> carList;public CarManager() {Brand brand1 = new Brand();brand1.setId((long)1);brand1.setName("Mercedes");brand1.setCountry("Germany");     Brand brand2 = new Brand();brand2.setId((long)2);brand2.setName("Peugeot");brand2.setCountry("France");        Car car1 = new Car();car1.setId((long)1);car1.setBrand(brand1);car1.setModel("SL 500");car1.setPrice(new BigDecimal(40000));Car car2 = new Car();car2.setId((long)2);car2.setBrand(brand2);car2.setModel("607");car2.setPrice(new BigDecimal(35000));carList = new LinkedList<Car>();carList.add(car1);carList.add(car2);  }public List<Car> getCarList() {return carList;}  public Car createCar(Car c) {Car car = new Car();car.setId((long)carList.size() + 1);car.setBrand(c.getBrand());car.setModel(c.getModel());car.setPrice(c.getPrice());carList.add(car);return car;}
}

BrandManager

Let's do the same for BrandManager:

  • define an instance of BrandManager in the configuration file
  • use it for CarNewController (add a private attribute, remove instantiations)
  • make its brandList attribute not static

Externalize initialization code

We can go even further: initialize carList (CarManager) and brandList (BrandManager) in Spring configuration file:

    <bean id="carManager" class="springmvc.service.CarManager"><property name="carList"><list><ref bean="car1"/><ref bean="car2"/></list></property></bean>    <bean id="brandManager" class="springmvc.service.BrandManager"><property name="brandList"><list><ref bean="brand1"/><ref bean="brand2"/></list></property></bean><bean id="brand1" class="springmvc.model.Brand"><property name="id" value="1"/><property name="name" value="Mercedes"/><property name="country" value="Germany"/></bean><bean id="brand2" class="springmvc.model.Brand"><property name="id" value="2"/><property name="name" value="Peugeot"/><property name="country" value="France"/></bean><bean id="car1" class="springmvc.model.Car"><property name="id" value="1"/><property name="brand" ref="brand1"/><property name="model" value="SL 500"/><property name="price" value="40000"/></bean><bean id="car2" class="springmvc.model.Car"><property name="id" value="2"/><property name="brand" ref="brand2"/><property name="model" value="607"/><property name="price" value="35000"/></bean>
  • we define brands
  • we define cars using the brands
  • we initialize CarManager and BrandManager lists
  • notice the difference between the 'value' attribute, where you put a primary type and 'ref', where you give a bean name.

To make it work, we just need to add a setter method for CarManager and BrandManager's lists and remove the now useless initialization code. In 'WEB-INF/src/springmvc/service/BrandManager.java':

package springmvc.service;import java.util.List;import springmvc.model.Brand;public class BrandManager {private List<Brand> brandList;public List<Brand> getBrandList() {return brandList;}  public void setBrandList(List<Brand> brandList) {this.brandList = brandList;}public Brand getBrandById(Long id) {for (Brand brand : brandList) {if (brand.getId().equals(id))return brand;}return null;}
}

In 'WEB-INF/src/springmvc/service/CarManager.java':

package springmvc.service;import java.util.List;import springmvc.model.Car;public class CarManager {private List<Car> carList;public List<Car> getCarList() {return carList;}    public void setCarList(List<Car> carList) {this.carList = carList;}public Car createCar(Car c) {Car car = new Car();car.setId((long)carList.size() + 1);car.setBrand(c.getBrand());car.setModel(c.getModel());car.setPrice(c.getPrice());carList.add(car);return car;}
}

Much cleaner, isn't it? 

We rebuild (ant), relaunch Tomcat:http://localhost:8180/springmvc/list_cars.html

Everything should still work.. You can download the project here.

from: http://jeromejaglale.com/doc/java/spring/dependency_injection

Spring MVC快速教程:依赖注入 Spring MVC Fast Tutorial: Dependency Injection相关推荐

  1. ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)...

    在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...

  2. 一步一步手绘Spring DI运行时序图(Spring 自动装配之依赖注入)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  3. 关于mysql注入说法正确的是_1. 在 Spring中,下列关于 依赖注入 的 说法 , 正确的是( ) 。_学小易找答案...

    [简答题]1基本流程练习 2时间轴嵌套 3简单应用 [简答题]请解释什么是MVC? [多选题]在 Hibernate 中,下 列 说法正确的有 [多选题]1. 关于 Spring,下列说法不正确的是( ...

  4. Spring 的控制反转/依赖注入

    第一章 Spring 的控制反转/依赖注入 回顾 增删改查. 课前测: 本章内容 spring:春天 IOC:将创建对象的权力交给 spring 核心容器去控制.工厂模式 BeanFactory: 懒 ...

  5. Spring Bean 装配和依赖注入

    Spring IOC 容器的依赖注入工作可以分为两个阶段.第一个阶段可以认为是构建和收集 Bean 定义的阶段,在这个阶段中,我们可以通过 xml 或者 Java 代码的方式定义一些 Bean,然后通 ...

  6. 零配置 之 Spring 注解实现Bean依赖注入

    转载自  [第十二章]零配置 之 12.2 注解实现Bean依赖注入 --跟我学spring3 12.2  注解实现Bean依赖注入 12.2.1  概述 注解实现Bean配置主要用来进行如依赖注入. ...

  7. C# MVC IOC、依赖注入

    在MVC5中依赖注入,本文介绍通过扫描类型RegisterAssemblyTypes来进行注册 另外还有扫描模块RegisterAssemblyModules来注册 使用Autofac框架进行组件的依 ...

  8. Spring IOC容器的依赖注入流程(收集和注册、分析和组装)

    Spring IOC容器的依赖注入流程 Spring IOC容器的依赖注入工作可以分为两个阶段: 阶段一:收集和注册 第一个阶段可以认为是构建和收集bean定义的阶段,在这个阶段中,我们可以通过XML ...

  9. 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)...

    前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...

最新文章

  1. 04 Java面试题之数组
  2. STM32F103+UCOS-II 实现临界区不关闭重要中断
  3. 工作单元php,php – 无法从工作单元测试用例构建最简单的套件
  4. pl/sql编程基础
  5. 论文浅尝 - WSDM20 | 基于弱监督及逐步推理的多关系知识图谱问答
  6. 06CRecordView类
  7. centos 5.8 mysql_linux centos5.8装yum安装mysql
  8. JavaScript 语言精粹 高清PDF中文版
  9. Day 11 - 视频转换成图片
  10. [转载]使用 Apache Geronimo 和 JMS 构建事件驱动的框架
  11. mysql能够跨平台使用吗_Mysql跨平台(Windows,Linux,Mac)使用与安装
  12. unity游戏,隐私协议最简单解决方案!仅3行代码就搞定!
  13. Android注入要点记录
  14. 人生理解---3、不想学习的时候怎么办
  15. P1:选 7-15 群发邮件
  16. 解决Mac系统下需要每次配置环境的问题
  17. 利用 Amazon IoT Greengrass 在边缘 DIY 自动浇花系统
  18. 二手电商的盛与衰:闲鱼持续扩张,爱回收稳扎稳打,转转战略失焦
  19. 专访万岁游戏 CEO 姚堃:探索 VR 游戏开发演进之路
  20. 【直击DTCC】安全行业的搜索引擎?白帽汇引爆新鲜感

热门文章

  1. C4.5决策树 此博文包含图片 (2011-10-20 23:22:19)转载▼ 标签: 分类树
  2. 使用Pandas进行变量衍生
  3. jvm性能调优 - 18白话G1垃圾回收器的工作原理
  4. Algorithms_基础数据结构(02)_线性表之链表_单向链表
  5. Spring-data-jpa和mybatis的比较及两者的优缺点?
  6. linux 病毒脚本,解析常见的Linux病毒
  7. 高德地图区域线显示_护航国庆假期,助力重点区域精细化管理——扬州交警与高德地图联合推出“全境智能”系统...
  8. oracle 27140,ORA-27140 ORA-27300 ORA-27301
  9. native字体尺寸自适应 react_react-native中 屏幕以及字体 大小适配
  10. java 全局变量_Javascript中的局部变量、全局变量的详解与var、let的使用区别