Spring学习(1):控制反转(IoC)和依赖注入(DI)的详解以及注解(annotation)开发入门案例

前言

以往的java学习中,我们要想得到一个对象,就把它new出来。如:Apple apple = new Apple();

在一些复杂的系统中,一个对象A可能依赖于对象B,C等(代码表现为A类持有B,C类的对象作为A类的属性)。以往来说,我们想要使用B,C中的方法时,就要先new出BC的对象,再去调用方法。回头想想,我们真的有必要去主动获取依赖对象吗?我们的最终目的,其实就是直接调用依赖对象所提供的方法而已。只要用到这个依赖对象时,它能及时就绪,我们完全不用管这个对象是从哪里来的。

我们并不想在A类中new出B,C的对象,这样会增加类之间的耦合性。于是,就有了控制反转(IoC)和依赖注入(DI)的概念。控制反转就是将对象的实例化过程交给spring框架来做,依赖注入就是将A对象所依赖的BC对象以配置文件或注解的形式传递给A对象。

正文

spring实现控制反转和依赖注入的方式有2种,一种使用xml配置文件,另一种使用注解。

一,使用xml文件配置

基于xml的开发以经典的web三层结构为例。我们知道,action动作类中持有service类的对象,service类中又持有dao类的对象,传统方式如下:
这里写图片描述
如上图所示,我们理所当然的new出所依赖的对象实例,这样各个类之间的耦合性太强,不利于维护。spring提供了2种思想(IoC和DI),将“new出对象的动作”和“产生依赖关系”的操作配置到配置文件中。如下图:
这里写图片描述
上图所示,源码中并不再出现“new”关键字来创建实例,而是在配置文件(这里是xml文件)中用bean标签来创建,对象之间的依赖关系则用“bean”标签下的“property”标签来引用。这样一来,各个类之间的耦合性就解除了,各个类都和配置文件打交道。

二,使用注解开发

使用注解前,我们要在spring的核心配置文件中添加命名空间,让spring扫描指定包路径下含有注解的类。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 下面context命名空间的作用是扫描类路径下的类,通过相应的注解创建bean并注入依赖 -->
    <context:component-scan base-package="com.jimmy.zhujie"></context:component-scan>
</beans>

然后,我们就不要在xml文件中配置bean啦,而是在具体类和依赖属性前面加注解。

其中,spring框架针对web3层结构分别为我们提供了3个注解:@Repository,@Service,@Controller。分别用于注解dao实现类,service实现类,controller实现类。@Autowired用于注解依赖对象,这样spring就为我们寻找并自动注入依赖类。而当dao或service接口的实现类有多个的话,就要用名字来区别,@Autowired就要结合@Qualifier(“名字”)来使用。下面是一个注解开发的例子。

1,编写dao接口和实现类

package com.jimmy.zhujie;

import org.springframework.stereotype.Repository;

@Repository("daoImpl")
public class UserDaoImpl implements UserDao{

    public void save() {
        System.out.println("添加一个用户");
    }
}

2,编写service接口和实现类

package com.jimmy.zhujie;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service("serviceImpl")
public class UserServiceImpl implements UserService{

    @Autowired
    @Qualifier("daoImpl")
    private UserDao uu;

    public void addUser() {
        this.uu.save();
    }
}

3,编写web层的controller类

package com.jimmy.zhujie;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

@Controller("myController")
public class MyController {

    @Autowired
    @Qualifier("serviceImpl")
    private UserService userService;

    public void addUser(){
        userService.addUser();
    }
}

4,编写测试类

package com.jimmy.zhujie;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class testIoC {
    @Test
    public void test1(){
        String xmlPath = "com/jimmy/zhujie/applicationContext.xml"; //默认从src路径下读文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);

        MyController uuu= (MyController) applicationContext.getBean("myController");
        uuu.addUser();
    }
}

由上述代码,我们可以看出:

  1. @Controller(“名称”)用来取代”bean”标签及其属性,“名称”取代“id”,”写在类头上”取代“calss”。
  2. @Autowired用来取代property标签及属性value,@Qualifier(“名称”)用来取代属性ref。

总结

xml和@,这两种方式在实际开发中都会用到,各有各的方便之处。一般地,3层接口之间的注入关系,和springMVC中的url映射用@。而spring在事务管理,以及集成mybatis时的数据库连接池配置,SqlSessionFactory等的配置时用xml。

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值