2019.7.24 Spring两大特性之一:IoC

一.前言
面试必问的问题,一直都回答不清楚,记录下,以后慢慢补全。

二.概念

  1. IoC:Inversion of Control,意为控制反转。
  2. AOP:英文全称Aspect-Oriented Programming,意为面向切面编程。

Spring核心容器的主要组件是Bean工厂(BeanFactory),Bean工厂使用控制反转(IoC)模式来降低程序代码之间的耦合度,并提供了面向切面编程(AOP)的实现。
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面编程(AOP)的容器框架。

三.IoC
Q:为什么可以把Ioc这样定义:IoC=工厂模式+反射?
理解:可以把IOC看成是工厂模式的升华,把IOC看成一个大工厂,这个大工厂里面要生成的对象都是在XML文件中定义的,然后利用java的反射编程,根据xml给出的类名动态的生成相应的对象。

1.数据模型
如下图所示有三个类,Human(人类)是接口,Chinese(中国人)是一个子类,American(美国人)是另外一个子类。

public interface Human {   
	 void eat();   
	 void walk();   
}   
  
package cn.com.chengang.spring;   
public class Chinese implements Human {   
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#eat()
*/  
	 public void eat() {   
		System.out.println("中国人对吃很有一套");   
	 }   
  
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#walk()
*/  
	public void walk() {   
		System.out.println("中国人行如飞");   
  	}   
}   
  
package cn.com.chengang.spring;   
public class American implements Human {   
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#eat()
*/  
	 public void eat() {   
		System.out.println("美国人主要以面包为主");   
	 }   
  
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#walk()
*/  
	 public void walk() {   
		System.out.println("美国人以车代步,有四肢退化的趋势");   
	}   
}  

2、对以上对象采用工厂模式的用法如下

创建一个工厂类Factory,如下。这个工厂类里定义了两个字符串常量,所标识不同的人种。getHuman方法根据传入参数的字串,来判断要生成什么样的人种。
java 代码

package cn.com.chengang.spring;   
public class Factory {   
public final static String CHINESE = "Chinese";   
public final static String AMERICAN = "American";   
  
public Human getHuman(String ethnic) {   
if (ethnic.equals(CHINESE))   
return new Chinese();   
else if (ethnic.equals(AMERICAN))   
return new American();   
else  
throw new IllegalArgumentException("参数(人种)错误");   
}   
}  

下面是一个测试的程序,使用工厂方法来得到了不同的“人种对象”,并执行相应的方法。

java 代码
package cn.com.chengang.spring;   
public class ClientTest {   
public static void main(String[] args) {   
Human human = null;   
human = new Factory().getHuman(Factory.CHINESE);   
human.eat();   
human.walk();   
human = new Factory().getHuman(Factory.AMERICAN);   
human.eat();   
human.walk();   
}   
}  

3、采用Spring的IoC的用法如下:
在项目根目录下创建一个bean.xml文件
xml 代码

<?xml version="1.0" encoding="UTF-8"?>   
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">   
<beans>   
<bean id="Chinese" class="cn.com.chengang.spring.Chinese"/>   
<bean id="American" class="cn.com.chengang.spring.American"/>   
</beans>  

修改ClientTest程序如下:

package cn.com.chengang.spring;   
import org.springframework.context.ApplicationContext;   
import org.springframework.context.support.FileSystemXmlApplicationContext;   
public class ClientTest {   
public final static String CHINESE = "Chinese";   
public final static String AMERICAN = "American";   
  
public static void main(String[] args) {   
// Human human = null;   
// human = new Factory().getHuman(Factory.CHINESE);   
// human.eat();   
// human.walk();   
// human = new Factory().getHuman(Factory.AMERICAN);   
// human.eat();   
// human.walk();   
  
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");   
Human human = null;   
//因为getBean方法返回的是Object类型,所以前面要加一个类型转换。
human = (Human) ctx.getBean(CHINESE);   
human.eat();   
human.walk();   
human = (Human) ctx.getBean(AMERICAN);   
human.eat();   
human.walk();   
}   
}  

从这个程序可以看到,ctx就相当于原来的Factory工厂,原来的Factory就可以删除掉了。然后又把Factory里的两个常量移到了ClientTest类里,整个程序结构基本一样。

4.依赖注入(DI)
DI:Dependency Injection,意为依赖注入。
依赖注入:由IoC容器动态地将某个对象所需要的外部资源(包括对象、资源、常量数据)注入到组件(Controller, Service等)之中。简单点说,就是IoC容器会把当前对象所需要的外部资源动态的注入给我们。
Spring依赖注入的方式主要有四个,基于注解注入方式、set注入方式、构造器注入方式、静态工厂注入方式。推荐使用基于注解注入方式,配置较少,比较方便。
没咋看懂,以后再来补。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值