Java Spring学习笔记(1)---控制反转和依赖注入

控制反转和依赖注入

控制反转(Inversion of Control)IoC,是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。当看到这个概念的时候不禁会思考,是什么和什么反转了?查阅了资料后明白了,先给结论,通俗的说,对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

其实生活中也有类似的事情,举个例子:

有一家旅行预约网站,它的宗旨是提供最低价格的品质服务,如果消费者预约之后发现了比它更低价格的存在,不仅可以以这个更低的价格得到服务,还会得到一些补偿。反转在哪里呢?之前需要员工每天对竞争对手的产品进行价格查询,浪费太多时间和精力也做不到百分之百最低,干脆把控制权交给用户,这样可以节省很多成本。

在软件系统中呢,我们看下这张图,这几个齿轮可以说是非常耦合了,整个系统要正常的运转起来必须每个齿轮都各就位,一个崩溃了整个系统就崩溃了。随着应用的复杂性越来越高,耦合会越来越紧密,整个系统很容易出现牵一发而动全身。


Java Spring学习笔记(1)---控制反转和依赖注入_第1张图片
image

那么,为了解决对象间耦合度过高的问题,软件专家Michael Mattson提出了IOC理论,用来实现对象之间的“解耦”。其基本思想是:借助于“第三方”实现具有依赖关系的对象之间的解耦。这里的第三方即是IoC容器。

Java Spring学习笔记(1)---控制反转和依赖注入_第2张图片
image

因为第三方容器的存在,系统中的齿轮不在耦合,虽然还是要一起工作,但是对象的控制权都交给了第三方容器来处理了。在IoC之前,齿轮A转动起来会主动的去创建对象B、C等,现在A只用告诉容器自己需要什么,并且容器里恰好有你需要的,就会给你使用了。

依赖注入就是将实例变量传入到一个对象中去。

比如:a依赖b,但a不控制b的创建和销毁,仅使用b,那么b的控制权交给a之外处理,这叫控制反转(IOC),而a要依赖b,必然要使用b的instance,那么,

1.通过a的接口,把b传入
2.通过a的构造,把b传入
3.通过设置a的属性,把b传入

这个过程叫依赖注入(DI)。

依赖注入主要有三种方式:
1.使用属性的setter方法注入

private OrderServiceImp orderService;
    
public void setOrderService(OrderServiceImp orderService) {
       this.orderService = orderService;
}

Spring配置XML文件:其中配置声明OrderAction类存在属性orderService。程式运行时候,会将已经实例化的orderService对象调用setOrderService方式注入。


        


2.使用构造器注入

class Employee {  
   Address address;  
   Employee(Address address) {  
       this.address=address;  
   }  
} 

xml配置文件:


      


3.通过注解注入
注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired、Resource、Qualifier、Service、Controller、Repository、Component。

  • Autowired是自动注入,自动从spring的上下文找到合适的bean来注入
  • Resource用来指定名称注入
  • Qualifier和Autowired配合使用,指定bean的名称
  • Service,Controller,Repository分别标记类是Service层类,Controller层类,数据存储层的类,spring扫描注解配置时,会标记这些类要生成bean。
  • Component是一种泛指,标记类是组件,spring扫描注解配置时,会标记这些类要生成bean。

Autowired和Resource是用来修饰字段,构造函数,或者设置方法,并做注入的。而Service,Controller,Repository,Component则是用来修饰类,标记这些类要生成bean

控制层代码:

@Autowired 
private OrderServiceImp orderService;

服务层代码:

@Service("orderService")
public class OrderServiceImp implements IOrderService {

    @Autowired
    private JavaOrderMDaoImp javaOrderMDao;

    @Autowired
    private JavaOrderDDaoImp javaOrderDDao;

    @Override
    public List findOrderM(OrderSearch search) {
        return javaOrderMDao.findJavaOrderM(search);
    }

    @Override
    public List findOrderD(OrderSearch search) {
        return javaOrderDDao.findJavaOrderD(search);
    }

}

DAO层代码:

@Repository("javaOrderMDao")
public class JavaOrderMDaoImp extends BaseHibernateDAO implements IJavaOrderMDao {...}

你可能感兴趣的:(Java Spring学习笔记(1)---控制反转和依赖注入)