[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://box.kancloud.cn/64cb239167c0be3a2079dcd118436d63_630x887.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)
- 数据库
- 数据库介绍
- MySQL的安装
- SQL
- 表基本操作
- 修改数据语句
- 数据检索操作
- 多表数据操作
- 练习题
- JAVA
- JAVA 介绍
- JAVA 运行原理
- JDK 配置
- 类和对象
- 数据类型
- 变量
- 直接量
- 运算符
- 流程控制
- 数组结构
- 面向对象
- 隐藏和封装
- 深入构造器
- 类的继承
- 多态
- 包装类
- final 修饰符
- 抽象类
- 接口
- 集合框架
- 常用类学习
- 设计模式-单例模式
- 异常处理
- JDBC
- JSP&Servlet
- Web应用
- Tomcat
- JSP
- Scriptlet
- Page 指令
- 包含指令
- 跳转指令
- 用户注册实例
- JSP练习
- 内置对象
- Servlet
- 过滤器
- Web分层思想
- EL表达式
- JSTL
- 分页实现
- AJAX&JSON
- 开发步骤
- 路径问题
- Log4j
- Mybatis框架
- 框架介绍
- Mybatis简单实现
- 表基本操作
- 优化配置文件
- 表字段名与实体类属性名不同的解决方案
- 一对一关联
- 一对多关联
- Spring框架
- IOC/DI
- 注入对象
- 注解方式 IOC/DI
- AOP
- 注解方式AOP
- 注解方式测试
- Spring MVC框架
- Hello SpringMVC
- 视图定位
- 注解方式
- 接受表单数据
- 客户端跳转
- Session
- 中文问题
- 上传文件
- SSM整合
- 整合步骤
- 分页
- PageHelper
- 连接池
- CRUD
- 事务管理
- JSON
- Maven
- 介绍
- 下载与配置MAVEN
- MAVEN仓库
- ECLIPSE中的MAVEN设置
- ECLIPSE下创建MAVEN风格的JAVA项目
- 添加JAR包
- 创建MAVEN风格的JAVA WEB项目
- 创建SSM项目
- 使用ECLIPSE导入一个MAVEN风格的SSM项目
- 教学管理
- 学员名录
- 周测统计
- 20180608
- 20180706
- 20180721
- 课堂作业
- 练习