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。相关文章推荐
- Spring学习(1):控制反转(IoC)和依赖注入(DI)的详解以及注解(annotation)开发入门案例
- spring、IoC控制反转和DI依赖注入入门、基于XML的Bean装配、基于注解的Bean装配
- Spring学习3—控制反转(IOC)基于Annotation(注解)的依赖注入实现
- Spring学习3—控制反转(IOC)基于Annotation(注解)的依赖注入实现
- 【JavaWeb-23】spring、IoC控制反转和DI依赖注入入门、基于XML的Bean装配、基于注解的Bean装配
- Spring学习(三)IOC控制反转与DI依赖注入
- spring IOC(控制反转)和DI(依赖注入)以及三种依赖注入方式的比较
- Spring.net 控制反转(IOC)依赖注入(DI)的使用 以及Config文件的配置
- Spring入门--控制反转(IOC)与依赖注入(DI)
- Spring 4 学习笔记2:控制反转(IoC)和依赖注入(DI)
- Spring学习,依赖注入(DI)、控制反转(IoC)和面向切面(AOP)
- Spring学习之——控制反转(IoC)与依赖注入(DI)
- Spring的控制反转(IOC)和依赖注入(DI)详解
- Spring入门--控制反转(IOC)与依赖注入(DI)
- Spring.Net-DI依赖注入和Ioc控制反转
- Spring控制反转与依赖注入(IOC、DI)
- 重温Spring之旅1——控制反转IOC与依赖注入DI
- 码农小汪-spring框架学习之2-spring IoC and Beans 控制反转 依赖注入 ApplicationContext BeanFactory
- Spring原理机制资源汇总(控制反转(IoC)与依赖注入(DI)主题)
- Spring IoC 控制反转 DI依赖注入 以及常用注解