Spring(1)---IOC容器

来源:互联网 发布:大众汽车维修软件 编辑:程序博客网 时间:2024/06/05 07:30

原本毕设打算使用SSH(Spring + Strust2 + Hibernate)框架搭建,当时太懒,觉得Spring学起来太麻烦就弃之没用,仅仅使用了Strust2和Hibernate。现在公司项目要用到Spring,准备系统的学一下Spring,回想起毕设用到的两个框架,发现自己已经忘了十之八九,所以决定在学的时候把自己所学到的稍稍记录一番,不至于过个几年不用又得从头学起。
虽然有点遗憾没有在做毕设的时候学Spring,现在想来其实还是很幸运的,毕竟SSH都是已经封装好了的框架,学会了用起来的却很方便,但框架内部用到的大部分技术一知半解甚至一点不得知。所以还是很庆幸在学习Web开发的时候没有直接使用框架,现在学Spring体系结构的时候不会显得太吃力。


什么是Ioc

Ioc(Inverse of Control:控制反转),即某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定。这四个字第一次接触真的很难理解其中的含义,因为确实不够开门见山,最终Martin Fowler提出了DI(Dependency Injection: 依赖注入)的概念用以替代Ioc。
说的直白一点就是降低类于类之间的耦合度,类与类之间的调用都由第三方控制和管理javabean的整个生命周期,也就是说我们不必考虑bean的实例化、回收和其他一系列的问题,这些全部都由Ioc容器控制,我们在使用bean时只要向Ioc容器申请即可。

Ioc的注入方式

获取Car的信息

public class CarMessage{    private Car car = new benz();    public String getCarBrandName(){         return car.getBrandName;    }    public void carRun(){        System.out.println(car.getName + " is running");    }}

我们发现这个类只能获取benz的信息,那如果要获取其他车的信息呢?
这个时候我们再来讨论Ioc(控制反转),“控制”是指选择汽车品牌的控制权;“反转”是指这种控制权从CarMessage中移除,交到第三方手中。
其实Ioc也可以看做是一种设计模式。


Ioc的三种注入方式
1.构造函数注入
2.属性注入
3.接口注入

1.构造函数注入

通过调用类的构造函数,将接口实现类通过构造函数变量传入。

// 通过构造函数注入车辆public class CarMessage(){     private Car car;     public CarMessage(Car car){          this.car = car;     }     public String getCarBrandName(){         return car.getBrandName;     }}//得到车辆的品牌信息,我们只指定车的类型即可输出车的品牌信息public class getBrandName{    public static void main(String[] args) {        Car benz = new Benz();        CarMessage carMessage = new CarMessage(benz);        System.out.println(carMessage.getCarBrandName());    }}

2.属性注入

如下代码中如果只有在调用carRun方法时我们需要用到car实体,这个时候通过构造函数注入的方法并不妥当,我们通过调用类的Setter方法,将接口实现类通过构造函数变量传入。

// 通过属性注入车辆信息public class CarMessage(){     private Car car;     public setCar(Car car){          this.car = car;     }     public void carIntroduce(){         System.out.println("I am a Car");     }     public void carRun(){        System.out.println(car.getName + " is running");     }}// 需要得到车辆run的信息我们再注入车辆public class getCarRunning{    public static void main(String[] args) {        CarMessage carMessage = new CarMessage();        carMessage.carIntroduce();        //需要打印run信息        Car benz = new Benz();        carMessage.setCar(benz);        carMessage.carRun();    }}

3.接口注入

将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入方法。

public interface BuyCar{    void injectCar(Car car);}public class CarMessage implements BuyCar{    private Car car;    public void injectCar(Car car){        this.car = car;    }    public void carRun(){        System.out.println(car.getName + " is running");     }}

通过接口注入需要额外声明一个接口,增加了类的数目,而且效果和属性注入没有本质区别,因此一般情况下不建议这种方式。

Spring-Ioc容器

上述代码中carMessage已经不需要关注Car实例的过程,它只要获取对应的Car实例,也就是说它已经把Car品牌的控制权给了第三方了,上诉的第三方代码还是我们写,而Spring把这些功能封装好,也就是我们所说的第三方Spring的Ioc容器。
现在比较知名的Ioc容器有Pico Container、Avalon 、Spring、JBoss、HiveMind、EJB等。

相关的Java技术

注入依赖技术是通过反射(Reflect)机制实现的。

0 0
原创粉丝点击