您的位置:首页 > 编程语言 > Java开发

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

2017-04-18 14:37 1156 查看

前言

以往的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();
}
}


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

@Controller(“名称”)用来取代”bean”标签及其属性,“名称”取代“id”,”写在类头上”取代“calss”。

@Autowired用来取代property标签及属性value,@Qualifier(“名称”)用来取代属性ref。

总结

xml和@,这两种方式在实际开发中都会用到,各有各的方便之处。一般地,3层接口之间的注入关系,和springMVC中的url映射用@。而spring在事务管理,以及集成mybatis时的数据库连接池配置,SqlSessionFactory等的配置时用xml。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐