spring IOC

本节要点:

  • IOC容器概述
  • IOC容器的工作原理
  • BeanFactory接口及常用实现类XmlBeanFactory
  • ApplicationContext接口及常用实现类
  • BeanFactory和ApplicationContext的区别

1  IOC容器概述

Spring的IoC容器实现了控制反转,即在开发过程中,开发人员不需要关心容器是怎样的,也不需要调用容器的任何API。容器会自动进行被管理对象的初始化及对象之间依赖关系的维护。

在Spring中,最重要的是两个包,提供了IoC容器的基本功能

  • org.springframework.beans
  • org.springframework.context

2         IOC容器的工作原理

org.springframework.beans.factory.BeanFactory 是Spring 容器(也叫Spring

IoC 容器)的实际代表者,BeanFactory 是IoC 容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。整个IoC 容器就是一个大的工厂,为应用程序提供bean。

从上图可以看到,我们可以在Spring IoC 容器中配置应用程序中所需要的信息,如POJO 对象,这些对象(Bean)之间相互依赖关系,最终产出以备使用的对象。

3        
BeanFactory接口及常用实现类XmlBeanFactory

BeanFactory接口提供了多个实现类来供开发人员使用,最常使用的是org.springframework.beans.factory.xml.XmlBeanFactory类,是通过XML格式的文件来配置Bean对象以维护对象之间的关系。

使用XML格式的配置文件时,配置文件的最顶层是<beans>元素,其内部包含一个或多个<bean/>元素,其中每一个<bean/>元素定义了一个bean的实例化信息以及与其他bean之间的关系

BeanFactory接口中的几个基本方法:

  • Boolean
    containsBean(String name)

判断Spring容器是否包含id为name的Bean实例

  • Class getType(String name)

返回容器中指定Bean实例的类型

  • Object
    getBean(String name)

返回以给定名字注册的bean实例。根据bean的配置情况,如果为singleton模式将返回一个共享的实例,否则将返回一个新建的实例。如果没有找到指定的bean,该方法可能会抛出BeansException异常(实际上将抛出NoSuchBeanDefinitionException异常),在对bean进行实例化和预处理时也可能抛出异常

注:在实际的Web应用开发中,不需开发人员自己进行容器的初始化,生成BeanFactory对象,只需在web.xml文件中进行简单配置既可。

4        
ApplicationContext接口及常用实现类

大部分时候,我们都不会使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例作为容器,该容器被称为Spring上下文。ApplicationContext是BeanFactory子接口,它增强了BeanFactory的功能。

ApplicationContext
接口常用的实现类:

  • ClassPathXmlApplicationContext:从类路径中的XML文件载入上下文定义信息,把上下文定义文件当成类路径文件,例:

    ApplicationContext  context=new
    ClassPathXmlApplicationContext(“beans- config.xml”);

  • FileSystemXmlApplicationContext:从文件系统中的XML文件载入上下文信息,例:

    ApplicationContext  context=new             FileSystemXmlApplicationContext(“d:/sp/beans-config.xml”);

    区别: FileSystemXmlApplicationContext只能在指定的路径寻找文件beans-config.xml; ClassPathXmlApplicationContext可在整个类路径中寻找。

  • XmlWebApplicationContext:从web系统中的XML文件载入载入上下文定义信息

5        
BeanFactory和ApplicationContext的区别

ApplicationContext与BeanFactory都是Spring容器,职责都有实例化、定位、配置应用程序中的对象及建立这些对象间的依赖,但ApplicationContext提供更多功能:

  • ApplicationContext继承MessageResource接口,因此提供国际化支持。
  • 资源访问,比如URL和文件。
  • 事件机制,可向注册为监听器的Bean发送事件。
  • 载入多个配置文件。
  • 以声明式的方式启动、并创建Spring容器。

6        
 Ioc具体实现

UserDao.java

public interface UserDao {
    public void getUser();
}

UserDaoMySqlImpl

public class UserDaoMySqlImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("获取mysql数据");
    }
}

UserDaoOracleImpl

public class UserDaoOracleImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("获取oracle数据");
    }
}

UserService

public interface UserService {
 public void getUser();
}

UserServiceImpl

public class UserServiceImpl implements UserService{
    private UserDao userDao ;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    @Override
    public void getUser() {
        userDao.getUser();
    }
}

Beans.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.xsd">
    <!-- bean就是java对象,由spring容器创建和管理 -->
    <bean name="mysqlDao" class="com.inspur.dao.impl.UserDaoMySqlImpl"/>
    <bean name="oracleDao" class="com.inspur.dao.impl.UserDaoOracleImpl" />
    <bean id="userService" name="userService" class="com.inspur.service.impl.UserServiceImpl" >
        <!-- ref引用对象(对象由spring来创建) -->
        <property name="userDao" ref="mysqlDao"></property>
    </bean>
</beans>

test

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        UserService us = (UserService)context.getBean("userService");
        us.getUser();
    }
}

7  配置文件详解
alias[?eli?s] 设置别名

Bean的配置

<!-- id是bean的标识符 要唯一 如果没有配置id,name默认为标识符
        如果配置id,又配置了name 那么name是别名
        name可以设置多个别名 分隔符可以是空格 逗号 分号
        class是bean的全类名=包名+类名
     -->
    <bean id="userService" name="userService" class="com.inspur.service.impl.UserServiceImpl" >
        <!-- ref引用对象(对象由spring来创建) -->
        <property name="userDao" ref="mysqlDao"></property>
    </bean>

Import用来导入其他配置文件,实现团队协作

  <import resource="entity.xml"/>

8  Ioc两种创建对象的方式(了解)

8.1通过无参的构造方法

User.java

public class User {
    public User() {
        System.out.println("user的无参构造方法");;
    }
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    public void show(){
        System.out.println("name="+name);
    }
}

Beans.xml

    <bean id="user" class="com.inspur.pojo.User">
        <property name="name" value="zhangsan"></property>
    </bean>

8.2 通过有参构造方法来创建

User.java

public class User {
    public User(String name) {
        super();
        this.name = name;
        System.out.println("user的有参构造方法");
    }
    private String name;
    public void show(){
        System.out.println("name="+name);
    }
}

Beans.xml配置

第一种   根据参数的下标来设置

<bean id="user1" class="com.inspur.pojo.User">
    <!-- index指构造方法参数下标从0开始 -->
    <constructor-arg index="0" value="lisi"></constructor-arg>
</bean>

第二种   根据参数名称来设置

<bean id="user1" class="com.inspur.pojo.User">
        <!-- name指参数名 -->
        <constructor-arg name="name" value="lisi"></constructor-arg>
    </bean>

第三种   根据参数类型来设置

<bean id="user1" class="com.inspur.pojo.User">
    <!-- type指参数的类型 -->
    <constructor-arg type="java.lang.String" value="lisi"></constructor-arg>
</bean>
时间: 2024-12-29 04:36:58

spring IOC的相关文章

Spring IoC/DI

前言 假设项目层次划分包括logic层和dao层,logic层调用dao层完成业务逻辑,dao层一般与数据库交互.定义两个组件,TestLogic和TestDao,分别操作接口ILogic和IDao,这样程序开发时需要考虑怎样管理这两个组件. 传统方式 这种方式中,当TestLogic组件需要调用TestDao组件时,直接使用关键字new IDao testDao = new TestDao(); 这种方式简单直观,但造成了对外部组件的严重依赖,程序高度耦合,效率低下.当项目需要更换组件时需要修

手把手教你实现Spring ioc

手把手教你实现Spring ioc "Don't call us, we'll call you(不要联系我,我会主动联系你)" 这是好莱坞很经典的一句话,应用在ioc(控制反转)领域,发现理解起来相得益彰--你作为用户不需要控制业务实体的生成,交给我容器来控制,这就是控制反转.不过,这样理解起来也有点麻烦,套用面向对象大师Martin Fowler的说法更为贴切: "Dependency Inversion(依赖注入)" 当容器中所有的实体bean 都被管理起来的

Spring IOC的实现

来源:知乎 https://www.zhihu.com/question/21035417/answer/142858103 著作权归作者所有. Spring IOC的实现部分,主要分为三个部分: 第一步: Resouce:首先我们需要获取beanDefinition的资源,我们将通过Spring的resource接口获得bean的资源,这一步也叫做bean资源的定位,下面是Spring内置的一些典型实现,当然,你也可以根据自己的需要实现自己的resource: ClassPathResourc

Spring IOC理解

内容来自http://blog.csdn.net/qq_22654611/article/details/52606960 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/blog/1413846 1.1.IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技

谈谈对Spring IOC的理解(转)

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

Spring学习(二)spring ioc注入的三种方式

一.spring ioc注入有哪三种方式: a setter 原理 : 在目标对象中,定义需要注入的依赖对象对应的属性和setter方法:"让ioc容器调用该setter方法",将ioc容器实例化的依赖对象通过setter注入给目标对象,封装在目标对象的属性中. b 构造器 原理 : 为目标对象提供一个构造方法,在构造方法中添加一个依赖对象对应的参数.ioc容器解析时,实例化目标对象时会自动调用构造方法,ioc只需要为构造器中的参数进行赋值:将ioc实例化的依赖对象作为构造器的参数传入

我讨厌注解式的Spring IOC

spring的ioc,原本是在"实例"层面上的.同样的一个类,我可以通过多个<bean>标签,得到多个实例.并且,每个bean中的属性配置都可以不一样,从而使我得到多个不一样的实例. 举个例子.我写过这样一个类: class A implements AI{ private B b; private C c; private D d; @Override public void aService(){ b.bService(); c.cService(); d.dServi

Java面试--Spring技术要点--Spring IOC

7  Spring IOC(依赖注入)的方式 Setter方法注入 构造器方法注入 工厂方法注入(实例工厂/静态工厂) 自动装配(需要开启配置,不建议使用) http://blessht.iteye.com/blog/1162131 8  IOC方式建议(构造器注入还是 Setter方法注入) 两种依赖方式都可以使用,构造器注入和Setter方法注入.最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖. 9  什么是Spring beans Springbeans是那些形成S

Spring IoC的使用配置(一)

本文主要交代Spring相关的配置的快速了解与使用,所以对于不长常使用的配置项简单叙述或不讲解,需要深入了解Spring的原理,还需读者自行学习或补充. 本例使用的Spring版本为spring-4.0.0.M2,准备环境操作如下: 一.创建Java Project项目,导入需要的Spring的jar.本例使用的包括: /SpringLearn/lib/spring-aop-4.0.0.M2.jar /SpringLearn/lib/spring-beans-4.0.0.M2.jar /Spri