Spring IOC(DI)

1 什么是IOC

IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

2 IOC和DI

DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

从注入方法上看,主要可以划分为三种类型:构造函数注入、属性注入和接口注入。

3 使用XML配置的方式实现IOC

假设项目中需要完成对图书的数据访问服务,我们定义好了IBookDao接口与BookDao实现类,IBookDao接口如下:

1 package com.cqvie.onemethod.xml;
2
3 public interface IBookDao {
4
5     public void storeBook(String bookName);    //到货情况
6     public void addBook(String bookName);    //添加图书
7 }

BookDao实现类如下:

 1 package com.cqvie.onemethod.xml;
 2
 3 public class BookDao implements IBookDao {
 4
 5     @Override
 6     public void storeBook(String bookName) {
 7         System.out.println("《" + bookName + "》" + "已到货。");
 8     }
 9
10     @Override
11     public void addBook(String bookName) {
12         System.out.println("添加图书 《" + bookName + "》 成功!");
13     }
14
15 }

业务类IBookService接口如下:

1 package com.cqvie.onemethod.xml;
2
3 public interface IBookService {
4
5     public void addBook(String bookName);
6 }

业务类实现BookService如下:

 1 package com.cqvie.onemethod.xml;
 2
 3 public class BookService implements IBookService {
 4
 5     private BookDao bookDao;
 6
 7     public void setBookDao(BookDao bookDao) {
 8         this.bookDao = bookDao;
 9     }
10
11     @Override
12     public void addBook(String bookName) {
13         bookDao.storeBook(bookName);
14         System.out.println("准备上架······");
15         bookDao.addBook(bookName);
16     }
17
18 }

容器的配置文件applicationContext01.xml如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4      xmlns:context="http://www.springframework.org/schema/context"
 5      xsi:schemaLocation="http://www.springframework.org/schema/beans
 6          http://www.springframework.org/schema/beans/spring-beans.xsd
 7          http://www.springframework.org/schema/context
 8          http://www.springframework.org/schema/context/spring-context.xsd">
 9
10     <!--
11         name="bookDao" 对应类 BookService 的 private BookDao bookDao;
12      -->
13     <bean id="bookDao" class="com.cqvie.onemethod.xml.BookDao"></bean>
14     <bean id="bookService" class="com.cqvie.onemethod.xml.BookService">
15         <property name="bookDao" ref="bookDao"></property>
16     </bean>
17
18 </beans>

测试类Test如下:

 1 package com.cqvie.onemethod.xml;
 2
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5
 6 public class Test {
 7
 8     public static void main(String[] args) {
 9         @SuppressWarnings("resource")
10         ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext01.xml");
11         BookService bookService = (BookService)cxt.getBean("bookService");
12         bookService.addBook("面向对象程序设计 第一版");
13     }
14
15 }

运行结果:

4 使用Spring注解的方式实现IOC

上一个示例是使用传统的xml配置完成IOC的,如果内容比较多则配置需花费很多时间,通过注解可以减轻工作量,但注解后修改要麻烦一些,偶合度会增加,应该根据需要选择合适的方法。

上诉接口类不变,BookDao类修改为:

 1 package com.cqvie.twomethod.annotation;
 2
 3 import org.springframework.stereotype.Component;
 4
 5 @Component("bookDao")
 6 public class BookDao implements IBookDao {
 7
 8     @Override
 9     public void storeBook(String bookName) {
10         System.out.println("《" + bookName + "》" + "已到货。");
11     }
12
13     @Override
14     public void addBook(String bookName) {
15         System.out.println("添加图书 《" + bookName + "》 成功!");
16     }
17
18 }

BookService类修改为:

 1 package com.cqvie.twomethod.annotation;
 2
 3 import javax.annotation.Resource;
 4
 5 import org.springframework.stereotype.Component;
 6
 7 @Component("bookService")
 8 public class BookService implements IBookService {
 9
10     private BookDao bookDao;
11
12     @Resource
13     public void setBookDao(BookDao bookDao) {
14         this.bookDao = bookDao;
15     }
16
17     @Override
18     public void addBook(String bookName) {
19         bookDao.storeBook(bookName);
20         System.out.println("准备上架······");
21         bookDao.addBook(bookName);
22     }
23
24 }

容器的配置文件applicationContext02.xml如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4      xmlns:context="http://www.springframework.org/schema/context"
 5      xsi:schemaLocation="http://www.springframework.org/schema/beans
 6          http://www.springframework.org/schema/beans/spring-beans.xsd
 7          http://www.springframework.org/schema/context
 8          http://www.springframework.org/schema/context/spring-context.xsd">
 9
10     <context:component-scan base-package="com.cqvie.twomethod"></context:component-scan>
11
12 </beans>

测试类Test如下:

 1 package com.cqvie.twomethod.annotation;
 2
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5
 6 public class Test {
 7
 8     public static void main(String[] args) {
 9         @SuppressWarnings("resource")
10         ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext02.xml");
11         BookService bookService = (BookService)cxt.getBean("bookService");
12         bookService.addBook("面向对象程序设计 第二版");
13     }
14
15 }

运行结果:

欢迎各位大神补充纠错。

时间: 2024-10-11 17:02:11

Spring IOC(DI)的相关文章

spring IOC(转)

原文 http://stamen.iteye.com/blog/1489223 引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能不说是一大遗憾.不过IoC确实包括很多内涵,它涉及代码解耦.设计模式.代码优化等问题的考量,我们打算通过一个小例子来说明这个概念. 通过实例理解IoC的概念 贺岁大片在中国已经形成了一个传统,每到年底总有多部贺岁大片纷至沓

JAVA-Spring框架之IOC(DI)(1)

spring框架概述 spring是一个service层的框架,可以整合许多其 他框架,进行工作 spring的主要技术是IOC(DI)和AOP IOC(DI)-控制反转(依赖注入)AOP - 面向切面编程 1. IOC(DI) 所谓的IOC称之为控制反转,简单来说,就是将创 建对象的权力和对象的生命周期都由spring框架 来管理,从此开放过程中便不再关心对象的创建 和生命周期的管理,从而在需要创建对象的时候 ,由spring框架提供,这个由spring框架管理对 象的创建和生命周期的机制就是

Spring IOC(二)beanName 别名管理

Spring IOC(二)beanName 别名管理 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 一.AliasRegistry public interface AliasRegistry { void registerAlias(String name, String alias); void removeAlias(String alias); boolean isAlias(String name); St

Spring IOC(3)----bean实例化

前面一节说到invokeBeanFactoryPostProcessors方法的调用来注册bean定义,这次来看看finishBeanFactoryInitialization这个方法实例化非懒加载的单例bean. 1.从getBean到doGetBean先尝试从单例缓存池里面获取:DefaultSingletonBeanRegistry#getSingleton: 2.如果获取到了就返回了,如果获取不到则通过bean定义:AbstractBeanFactory#getMergedLocalBe

Spring IOC(转载)

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinniansh

Spring IOC(1)

转自:http://www.cnblogs.com/xdp-gacl/p/4249939.html 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框

【初探Spring】------Spring IOC(三):初始化过程---Resource定位

我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然后根据这些信息绑定整个系统的对象,最终组装成一个可用的基于轻量级容器的应用系统. Spring IoC容器整体可以划分为两个阶段,容器启动阶段,Bean实例化阶段.其中容器启动阶段蛀牙包括加载配置信息.解析配置信息,装备到BeanDefinition中以及其他后置处理,而Bean实例化阶段主要包括实

Spring——IOC(三)

六.集合注入 (1)假设UserDAOImpl中有sets,lists,maps三个集合属性 package com.zgy.impl; import java.util.List; import java.util.Map; import java.util.Set; import com.zgy.dao.UserDAO; import com.zgy.model.User; public class UserDAOImpl implements UserDAO{ private Set<St

spring IoC (七)Bean的依赖检查

在使用Spring的时候,如果应用设计比较复杂,那么在这个应用中,IoC管理的Bean的个数可能非常多, 这些Bean之间的相互依赖关系也会非常复杂.在一般情况下,Bean的依赖注入是在应用第一次向容器索取Bean 的时候发生,这个时候,不能保证注入一定能够成功,如果需要重新检查这些依赖关系的有效性,会是意见很 繁琐的事情.为了解决这样的问题,在Spring IoC容器中,设计了一个依赖检查特性,需要在Bean定义中设置 dependency-check属性来指定依赖检查模式即可,可以设置为no