Spring IoC

转载 2015年11月18日 09:55:34

一、IoC的基本概念

1、IoC是随着近年来轻量级容器的兴起而逐渐被很多人提到的一个名词,他的全称是Inversion of Control,中文意思为“控制反转”,它还有一个别名叫依赖注入(Dependency Injection),依赖注入的核心理念是:你需要什么我就送给你什么,不需要自己去拿。

                                                                          

    

2、依赖注入的三种方式:

a、构造方法注入:被注入对象可以通过在其构造方法中声明依赖对象的参数列表,让外部(通常是IoC容器)知道它需要的依赖对象。这种方法的优点是,在对象构造完后,就可以马上使用。缺点在于在依赖对象比较多时,通过反射在构造对象时,对参数的处理比较困难,在维护上和使用上也比较麻烦。

public class UserService {  
    private UserDao userDao; //UserDao为一个接口  
    public UserService(UserDao userDao){//构造函数  
        this.userDao=userDao;  
    }  
}  

b、setter方法注入:为当前对象所依赖的对象所对应的属性加入setter方法,就可以通过setter方法将相应的依赖对象设置到被注入的对象中。这个方式在三种方式里面是最好的一种,是目前使用最多的一种方式。

public class UserService {  
    private UserDao userDao; //UserDao为一个接口  
    public UserDao getUserDao() {  
        return userDao;  
    }  
    public void setUserDao(UserDao userDao) {  
        this.userDao = userDao;  
    }  
}  

c、接口注入:这种方法想通过IoC   Service  Provider为其注入依赖对象,必须要实现某个接口。这个接口提供一个方法,用来为其注入依赖对象,IoC   Service  Provider通过这些接口来了解为被注入对象注入什么对象。接口注入是现在不甚提倡的一种方法,因为它强制被注入的对象实现不必要的接口。

二、掌管大局的IoC  SerVice Provider

1、IoC  SerVice Provider的作用:a、对业务对象的构建管理。被注入的对象,不需要知道依赖对象是如何实例化。这个实例化的过程都交给IoC  SerVice Provider来完成;b、业务对象间的依赖绑定:将被注入的对象与依赖对象进行绑定。

2、IoC  SerVice Provider如何管理对象间的依赖关系,在spring中,Spring   Ioc 就是一个IoC  SerVice Provider ,主要通过xml配置文件来配置相应的依赖关系。

<bean id="userService" class="....UserService">  
   <property name="userDao" ref="UserDaoImpl"></property>  
</bean>  
<bean id="UserDaoImpl" class="...impl.UserDaoImpl"></bean>

这里UserDaoImpl为一个UserDao接口的实现类。

三、Spring的IoC容器之BeanFactory

1、BeanFactory:基础类型的IoC 容器,如果没有特殊指定,默认采用延迟初始化策略(lazy-load)。只有当客户端对象需要访问容器中的某个受管对象时,才对该对象进行实例化以及依赖注入操作,这个容器启动的速度比较快。BeanFactory它是一个bean的工厂,可以完成对象的初始化、依赖注入。下面是一个Spring   IoC的基本实现过程:

a、首先定义一个 UserDao 接口:

import java.util.List;  
import com.spring.domain.User;  
public interface UserDao {  
    public void addUser(User user);  
}  

b、定义一个UserDao接口的实现类UserDaoImpl

import com.spring.dao.UserDao;  
public class UserDaoImpl   implements  UserDao {  
    @Override  
    public void addUser(User user) {  
        // TODO Auto-generated method stub  
        System.out.println("add user success" + user);  
    }  
}  
c、定义一个UserService接口

package com.spring.service;  
import java.util.List;  
import com.spring.domain.User;  
public interface UserService {  
    public void addUser(User user);  
}
d、定义一个UserService接口的实现类UserServiceImpl

package com.spring.service.impl;  
  
import java.util.List;  
import org.springframework.stereotype.Component;  
import com.spring.dao.UserDao;  
import com.spring.dao.impl.UserDaoImpl;  
import com.spring.domain.User;  
import com.spring.service.UserService;  
public class  UserServiceImpl    implements   UserService {  
    private UserDao userDao;  
    @Override  
    public void addUser(User user) {  
        userDao.addUser(user);  
    }  
              //set与get方法  
    public  UserDao  getUserDao () {  
        return  userDao;  
    }  
    public void setUserDao (UserDao userDao) {  
        this.userDao = userDao;  
    }  
}  
e、创建一个applicationContext.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xsi:schemaLocation="  
        http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-  beans-3.0.xsd        
">  
<bean id=”userDaoImpl” class=”com.spring.dao.impl.UserDaoImpl” scope=”prototype”></bean>  
<bean id=”userServiceImpl”   class=”com.spring.service.impl.UserServiceImpl”>  
  <property name=”userDao” ref=”userDaoImpl”></property>  
</bean>  
</beans>  


f、测试是否注入成功 

public class UserServiceTest {  
  public static void main(String[] args) {  
      ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");  
      UserService UserService=context.getBean("userServiceImpl",UserService.class);  
        User user=new User();  
        UserService.addUser(user);  
    }  
}  
这是一种xml配置文件实现方式,在spring2.5以后提供了一中更加方便的注解实现方式。关于注解方式此处不做详解。

2、在BeanFactory中bean 的scope属性

a、singleton:表示一个容器中只存在一个共享实例,所有对该类型bean的依赖都引用这一单一的实例。从容器启动,到它第一次被请求而实例化开始,只要容器不销毁或者退出,该类型bean的单一实例就一直会存活。

b、prototype:声明为prototype的bean,容器在接到该类型对象的请求时候,会每次重新生成一个新的对象实例给对方。每个对象被实例化以后都是自生自灭的。

原文地址

Spring IOC的简单实现(附demo)

简单的说,Spring就是通过工厂+反射将我们的bean放到它的容器中的,当我们想用某个bean的时候,只需要调用getBean("beanID")方法即可。   原理简单说明:   Spring容器...
  • hejingyuan6
  • hejingyuan6
  • 2015年03月10日 12:27
  • 4036

[spring入门学习笔记][spring的IoC原理]

什么叫IoC控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency ...
  • zy691357966
  • zy691357966
  • 2016年04月13日 23:51
  • 2253

spring ioc原理(看完后大家可以自己写一个spring) .

最近,买了本Spring入门书:spring In Action 。大致浏览了下感觉还不错。就是入门了点。Manning的书还是不错的,我虽然不像哪些只看Manning书的人那样专注于Manning,...
  • lulongzhou_llz
  • lulongzhou_llz
  • 2015年03月18日 16:21
  • 1161

Spring IOC源码详解之总体结构

Spring ICO详解之总体结构 IOC介绍 IOC, spring的核心,贯穿Spring始终。直观的来说,就是由spring来负责控制对象的生命周期和对象间的关系,将对象之...
  • yujin753
  • yujin753
  • 2015年07月24日 16:32
  • 3451

Spring之IOC的注入方式总结

在定义了 JavaBean 装载信息之后需要对其赋值。一个 JavaBean 的赋值可以通过构造方法完成初始化,或者通过 set()方法初始化和改变属性值。下面分别介绍如何在 XML 中配置 Java...
  • Evankaka
  • Evankaka
  • 2015年04月02日 18:10
  • 7696

简明扼要谈Spring IOC的好处

简明扼要谈Spring IOC的好处   IOC:控制反转,它是不是什么技术,它是一种设计模式。所谓控制反转就是由容器控制程序间的关系,而不是传统实现中,由编程代码直接操控。说白了就是由容...
  • u014802309
  • u014802309
  • 2015年01月06日 10:07
  • 1941

Spring深入浅出(二)IOC详解

IOC即inverse of control 控制反转 以前对象之间的引用是通过new来调用实现,有了Spring IOC,我们可以把对象之间的引用交给他来管理,这样就把控制权交给了Spring,所...
  • jwdstef
  • jwdstef
  • 2014年01月25日 15:40
  • 5098

Spring中IoC的基本概念(一)

什么是Ioc,spring中Ioc的基本概念
  • Veggiel
  • Veggiel
  • 2016年09月02日 11:24
  • 1226

Spring ioc容器启动流程

从AbstractApplicationContext的refresh()方法谈起 启动流程概览
  • Architect0719
  • Architect0719
  • 2016年11月07日 17:46
  • 940

Spring中IOC配置xml实现和IOC注解实现

1.什么是spring spring 是分层的JavaSE/EE轻量级应用开源框架,已控制反转IOC和面向切面编程AOP为核心,提供了展现层SpringMVC, 和持久层Srping JDBC以及事务...
  • u014292162
  • u014292162
  • 2016年08月22日 16:10
  • 3526
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring IoC
举报原因:
原因补充:

(最多只允许输入30个字)