💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # IOC/DI Spring 是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目得是简化企业开发。 Spring是一个基于IOC和AOP的结构J2EE系统的框架 。 - IOC(Inversion Of Control):反转控制,是Spring的基础 。 简单说就是创建对象由以前的程序员自己new 构造方法来调用,变成了交由Spring创建对象。 - DI(Dependency Inject):依赖注入。 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可。 > 基于框架的程序要成功运行,对于JAR包的版本,配置文件的正确性有着苛刻的要求,任何一个地方出错了,都会导致框架程序运行失败。 > > 技巧: 学习框架,**务必严格按照教程的指导,完全模仿操作**,直到成功看到运行效果。 第一次成功之后,信心,思路都会有较好的铺垫,然后再根据自己的疑惑,在“成功”的代码上做原本想做的改动和调整,这样可以大大节约学习的时间,提高效率,**切勿一来就擅自改动**,给自己的学习制造障碍。 ## 步骤 1 : 先运行,看到效果,再学习 先将完整的 spring 项目(向老师要相关资料),配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。 ## 步骤 2 : 模仿和排错 在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。 模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较**正确答案** ( 可运行项目 ) 和自己的代码,来定位问题所在。 采用这种方式,**学习有效果,排错有效率**,可以较为明显地提升学习速度,跨过学习路上的各个槛。 ## 步骤 3 : 本知识点目的 本知识点通过运行TestSpring演示如何用Spring获取一个对象,并打印其name。 ## 步骤 4 : 新建项目 新建d:\project\spring目录,作为Eclipse的workspace,新建spring项目 (java project类型) ![](https://img.kancloud.cn/18/97/1897016342bac895bc6c7a936ca951ed_464x659.png) ## 步骤 5 : 将所需包添加到环境中 1. 在spring项目中,新建 folder,取名为lib; 2. 拿到lib.rar(向老师要相关资料),并解压拷贝jar放到lib文件夹中; ![](https://box.kancloud.cn/cd83e3f402853d7f0d99994717d38883_475x112.png) 3. 把jar包导入到项目中,选择所有jar包,右键 Build path->Add to Build path; ![](https://box.kancloud.cn/55a61ef101a8b6653e90688faacb835c_798x531.png) ## 步骤 6 : 准备 pojo > POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBean,即实体类。 准备pojo Category,用来演示IOC和DI ~~~ package com.dodoke.pojo; public class Category { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ~~~ ## 步骤 7 : applicationContext.xml 在src目录下新建applicationContext.xml文件 applicationContext.xml是Spring的核心配置文件,通过关键字c即可获取Category对象,该对象获取的时候,即被注入了字符串“category 1“到name属性中 ~~~ <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean name="c" class="com.dodoke.pojo.Category"> <property name="name" value="category 1" /> </bean> </beans> ~~~ ## 步骤 8 : 准备测试类 TestSpring ~~~ package com.dodoke.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.dodoke.pojo.Category; public class TestSpring { public static void main(String[] args) { // 读取applicationContext.xml配置文件 ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" }); // 在xml文件中,bean标签的name是c,获取到name为c的bean标签里面的内容强转为Category类型 Category c = (Category) context.getBean("c"); System.out.println(c.getName()); } } ~~~ 测试代码,演示通过spring获取Category对象,以及该对象被注入的name属性。 如图所示,可以打印出通过Spring拿到的Category对象的name属性 ![](https://box.kancloud.cn/11af58513e66dcff4d5830b0471805ba_473x180.png) ## 步骤 10 : 原理图 以获取对象的方式来进行比较 **传统的方式:** 通过new 关键字主动创建一个对象 **IOC方式:** 对象的生命周期由Spring来管理,直接从Spring那里去获取一个对象。 IOC是**反转控制** (Inversion Of Control)的缩写,就像控制权从本来在自己手里,交给了Spring。 打个比喻: 传统方式:相当于你自己去菜市场new 了一只鸡,不过是生鸡,要自己拔毛,去内脏,再上花椒,酱油,烤制,经过各种工序之后,才可以食用。 用 IOC:相当于去馆子(Spring)点了一只鸡,交到你手上的时候,已经五味俱全,你就只管吃就行了。 ![](https://box.kancloud.cn/e1de0ebe2ac3e4beae4f9a66f65b7690_503x233.png) ## 步骤 11 : 练习 如何使用IOC的方式,获取一个Product对象? > 提示:新建 Product 类,然后在applicationContext.xml配置 1. 新建 Product 类 ~~~ package com.dodoke.pojo; public class Product { private int id; private String name; private int number; private double price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } } ~~~ 2. 配置 applicationContext.xml ~~~ <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean name="c" class="com.dodoke.pojo.Category"> <property name="name" value="category 1" /> </bean> <bean name="product" class="com.dodoke.pojo.Product"> <property name="name" value="Apple Watch" /> <property name="number" value="2" /> <property name="price" value="8800" /> </bean> </beans> ~~~ 3. 修改TestSpring测试类 ~~~ package com.dodoke.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.dodoke.pojo.Category; import com.dodoke.pojo.Product; public class TestSpring { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" }); Category c = (Category) context.getBean("c"); System.out.println(c.getName()); Product product = (Product) context.getBean("product"); System.out.println(product.getName()); System.out.println(product.getNumber()); System.out.println(product.getPrice()); } } ~~~ 4. 运行结果 ![](https://box.kancloud.cn/bffad9cb64b38e6d1623410c3836fa19_417x193.png)