`
gupeng_ie
  • 浏览: 26178 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

IoC控制反转&DI依赖注入

阅读更多

*IoC--Inverse of Control 控制反转

 

IoC的概念,就是将原本在程序中手动创建一个对象的控制权,交由Spring框架管理,

简单说,就是创建一个对象控制权被反转到了Spring框架。

 

*依赖注入DI--Dependency Injection

 

在IoC过程中,对创建的对象,进行依赖注入--DI 

在Spring框架负责创建Bean对象时,动态的将 依赖对象 注入到Bean组件。

 

 

---------------------------------------------------------------------------------------------------

*Spring核心配置文件--applicationContext.xml

 

*寻找schema位置:

spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\xsd-config.html:

找到 The beans schema,引入。

<?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">

 

*myeclipse如何配置spring schema提示 

引入schema

http://www.springframework.org/schema/beans/spring-beans.xsd 

   *  早期spring开发中,引用路径 http://www.springframework.org/schema/beans/spring-beans-版本.xsd

   *  http://www.springframework.org/schema/beans/spring-beans.xsd 联网后,默认会去加载最新Spring版本 schema 

 

不需要联网:

myeclipse 通过 schema location ,进行本地schema文件配置 :

Window --> Preferences --> XML Catalog

Add: spring-framework-3.2.0.RELEASE\schema\beans\最新版的

Key Type: Schema Location

Key: http://www.springframework.org/schema/beans/spring-beans.xsd

 

这样就将http://www.springframework.org/schema/beans/spring-beans.xsd 网址,

与本地 spring-framework-3.2.0.RELEASE\schema\beans\最新版的 关联。

 

----------------------------------------------------------------------------------------------------

------- *ApplicationContext 对象* --------

 

ApplicationContext对象,是Spring 应用上下文,是用来加载Spring配置文件,初始化Spring框架 

 

加载classpath:

     new ClassPathXmlApplicationContext("applicationContext.xml");

加载磁盘路径:

     new FileSystemXmlApplicationContext("applicationContext.xml");

 

*ApplicationContext 和 BeanFactory 区别 ? 

BeanFactory 是Spring提供 Bean管理工厂对象, ApplicationContext 是BeanFactory 子接口 

 

BeanFactory beanFactory  = new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); 

 

BeanFactory 采取延迟加载,第一次getBean时才会初始化Bean

ApplicationContext 采取立即加载,加载配置文件时,就会对Bean进行初始化 

 

ApplicationContext是对BeanFactory扩展,提供了更多功能

国际化处理

事件传递

Bean自动装配

各种不同应用层的Context实现

 

结论:开发中,直接使用ApplicationContext,不使用 BeanFactory。

 

-------------------------------------------------------------------------------------------------------------------------

 

------- *IoC容器装配Bean* --------

 

*IoC容器装配bean,包括:

*实例化bean

*注入依赖对象--DI

 

---------------------------------实例化-------------------------------------

 

*实例化bean:有两种方式-- xml方式 和 注解方式

 

 *xml方式 实例化bean(三种方式):

 

第一种 :构造器(使用类的默认构造)

 

<bean id="bean1" class="cn.gp.spring.beaninstance.Bean1"></bean>

------------------

 

第二种: 静态工厂方法 (由工厂提供一个静态方法 进行Bean实例化)

public class Bean2Factory {

// 提供静态方法 用于实例化 Bean2

public static Bean2 getBean2(){

return new Bean2();

}

}

 

<bean id="bean2" class="cn.gp.spring.beaninstance.Bean2Factory" factory-method="getBean2"></bean>

-----------------

 

第三种 :实例工厂方法 (由工厂 提供一个实例方法 进行Bean 实例化 )

public class Bean3Factory {

// 实例工厂方法,该工厂提供方法 非static 方法

public Bean3 getBean3(){

return new Bean3();

}

}

 

<bean id="bean3Factory" class="cn.gp.spring.beaninstance.Bean3Factory"></bean>

<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>

-----------------

 

---- *bean的  id属性 和 name属性* -----

 

<bean id="helloService" class="xxxx" />  ----- 程序中 applicationContext.getBean("helloService") 获得bean实例 

方式一:HelloService helloService =  (HelloService)applicationContext.getBean("helloService");

方式二:HelloService helloService =  applicationContext.getBean("helloService", HelloService.class) 

 

id属性,是唯一约束,整个Spring配置文件中,id不允许重复,采用Schema中ID约束 

* ID约束,在整个文档中是 唯一 的, 不允许“数字”开头、“/”开头。

 

如果Bean的名称中含有特殊字符,就需要使用name属性

   <bean name="/hello" class="xxxx" />  /hello 是id不允许命名格式

applicationContext.getBean("/hello"); 

如果文档中,存在多个Bean 使用相同name,后来定义的Bean,就会覆盖之前Bean。

 

---- *Spring Bean的作用域* ----

 

取值: singleton、prototype、request、session、globalsession   

在实际开发中,通常只使用 singleton 和 prototype 

 

request 用于web开发中,将Bean 实例 保存request范围, request.setAttribute 

session 用于web开发, 将Bean实例 保存session范围 , session.setAttribute 

globalsession : 全局session,用于分布式系统,系统由多个子系统组成,globalsession 代表全局Session 

 

singleton : 单例 (在整个Spring 上下文中 bean对象实例只有一个)-- 默认

prototype : 原型 (每次使用Bean,都会创建一个新的实例,即多例) -- 需要在xml中配置

<bean id="car2" class="cn.itcast.spring.di.Car2" scope="prototype">

*注解方式:@Scope(value="prototype")

//一般在struts中,Action使用。因为struts与spring整合,而struts要求Action对象是多实例,

所以必须添加prototype,表示spring创建Action时为多实例,否则值栈会出现问题

 

*问题:如何将一个prototype bean注入给singleton Bean -----  解决 lookup 方法注入 

* 原理 每次操作单例对象时, 关联对象 通过相关一个方法 进行获取 ,在方法中 获得多例对象

 

 

 *注解方式 实例化bean

 

Spring 2.5 开始提供了注解,通过注解,实例化Bean   (*重点,注解使用方便,一般使用这种方式)

@Component  描述Spring框架中Bean   ------ 代替 <bean id="" class=""/>  xml配置 

 

第一步 :编写Bean 应用注解

@Component("helloService")  // 写映射bean的id 

public class HelloService {

// 业务方法

public void sayHello(){

System.out.println("hello !");

}

}

 

第二步 : 通知Spring 注解Bean 所在位置 

在applicationContext.xml 引入 context 的名称空间 

*寻找位置:spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\xsd-config.html:

The context schema

<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存放位置 

<!-- 通知Spring 应用注解Bean 所在位置 配置自动扫描 -->

<context:component-scan base-package="cn.gp.beans(写包名,即包含action service dao 的包)"></context:component-scan>

 

Spring 2.5 同时提供 @Component 的 三个衍生注解  

@Repository 用于对DAO实现类进行标注  ---- 持久层

@Service 用于对Service实现类进行标注   ---- 业务层

@Controller 用于对Controller实现类进行标注  ---- web层

* @Repository  @Service  @Controller  和 @Component功能完全相同 

这三个注解是为了让标注类本身的用途清晰,Spring在后续版本会对其增强

* 开发中 不要使用 @Component ,而应该使用三个衍生注解 

 

 

---------------------------------注入-------------------------------------

 

*DI,向bean组件,注入依赖的对象,有两种方式-- xml方式 和 注解方式

 

 *xml方式(有三种)

 

为一个对象注入一个属性的值,存在三种方式 

第一种 : 构造器注入

第二种 : set方法进行注入

第三种 : 接口特定方法完成属性注入 

 

*Spring 只支持 构造器注入 和 setter方法 注入 

 

1) 编写类Car1 提供构造器注入 name和price 属性

public Car1(String name, double price) {

super();

this.name = name;

this.price = price;

}

 

<!-- 构造器注入 -->

<bean id="car1" class="cn.itcast.spring.di.Car1">

<!-- 注入构造器参数 -->

<!-- index 参数索引,从0开始,type 参数类型 -->

<constructor-arg index="0" type="java.lang.String" value="宝马"></constructor-arg>

<constructor-arg index="1" type="double" value="800000"></constructor-arg>

</bean>

 

2) 编写类Car2 提供 setter方法注入 name和price 属性

<!-- setter方法注入 -->

<bean id="car2" class="cn.itcast.spring.di.Car2">

<!-- 通过setter方法为其注入属性 ,需要编写property 元素 -->

<property name="name" value="保时捷"></property>

<property name="price" value="1000000"></property>

</bean>

 

复杂对象注入列子,在Employee注入Car2的对象

<bean id="employee" class="cn.itcast.spring.di.Employee">

<property name="ename" value="张三"></property>

<!-- car2是一个复杂对象 ,对于复杂对象,不能使用value,使用ref,引用其他Bean对象 -->

<!-- name 是set方法对应属性名称,ref 引用另一个bean的id  -->

<property name="car2" ref="car2"></property>

</bean>

 

 

 *注解方式,DI:(两种方式)

 

@Autowired 进行自动注入   

*在属性定义上方使用 (不需要set方法) 或者 在属性set方法上使用 

* @Autowired 默认按照类型进行注入

*设置 @Autowired的required属性,必须注入成功,默认 required=true 一定注入成功 

 

使用 @Qualifier指定注入Bean的名称 ,当指定注入bean名称时, 则按照名称完成自动注入 

 

JSR-250 提供 @Resource 功能和 @Autowired 相似 

 

@Repository("uDAO")

public class UserDAO {

}

 

对Service完成自动注入 

 

@Service("userService")

public class UserService {

@Autowired 

@Qualifier("uDAO")

private UserDAO xxxx; // 随意命名

}

 

@Service("userService")

public class UserService {

@Resource(name="uDAO")

private UserDAO xxxx; // 随意命名

}

 

*通常使用 @Resource

 

分享到:
评论

相关推荐

    IOC控制反转&DI依赖注入

    在本项目中,"IOC技术思想和DI依赖注入"的实现可能包括以下几个方面: 1. 创建一个Spring配置文件,定义bean及其依赖关系。 2. 使用注解(如@Service、@Autowired)来标注bean和它们的依赖。 3. 编写业务逻辑类,...

    c# 依赖注入 控制反转

    ### C# 依赖注入 控制反转 #### 一、IoC(控制反转)简介 IoC,即"Inversion of Control"(控制反转),是软件工程领域的一个重要概念,特别是面向对象编程中的一个关键设计原则。从字面上理解,IoC指的是程序运行...

    springIOC控制反转 依赖注入实例

    依赖注入(Dependency Injection,DI)是实现IOC的一种方式,它通过容器在运行时将依赖关系注入到对象中,使得对象之间解耦,提高了代码的可测试性和可维护性。 Spring中的依赖注入主要通过以下三种方式实现: 1. ...

    Spring框架控制反转IOC和依赖注入DI详解

    本文介绍了Spring框架中的控制反转IOC和依赖注入DI,欢迎阅读,共同学习,一起进步。 Spring框架基础参考:深入学习Spring基础 文章目录一.入门程序和IOC简介二.IOC-控制反转三.DI-依赖注入四. IOC和DI五.Spring...

    Spring IOC 控制反转

    它通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect Oriented Programming, AOP)等特性实现了对应用程序的解耦,并通过IOC(Inversion of Control)控制反转来简化配置和管理。 #### 二、Spring ...

    Spring——IOC(控制反转)与DI(依赖注入).docx

    Spring框架中的IOC(控制反转)和DI(依赖注入)是两种关键的设计模式,它们极大地提升了软件的可维护性和可扩展性。控制反转是一种设计思想,它改变了传统的对象创建方式,将对象的创建和管理权从应用程序自身转移...

    spring 控制反转和依赖注入.docx

    Spring 框架的核心是控制反转(IOC)和依赖注入(DI),它可以将对象的创建和依赖关系管理,实现高内聚、低耦合的开发模式。 下面是 Spring 框架的核心知识点: 1. 控制反转(IOC):控制反转是 Spring 框架的...

    Spring 控制反转 依赖注入

    **Spring 框架中的控制反转 (IoC) 和依赖注入 (DI)** 在软件开发中,控制反转(Inversion of Control,简称IoC)是一种设计原则,它将对象的创建和管理权从代码中剥离出来,转交给一个外部容器(如Spring框架)。...

    IOC控制反转

    本文文档中有 控制反转 DI依赖注入,希望可以给大家在技术上有一点的帮助

    “IOC容器与DI依赖注入示例”文章提及

    在Java世界中,Spring框架是应用最广泛的轻量级企业级开发框架,它的一大核心特性就是Inversion of Control(控制反转,简称IOC)和Dependency Injection(依赖注入,简称DI)。这两者是紧密相关的概念,有助于简化...

    控制反转(IoC)与依赖注入(DI)1

    【控制反转(IoC)与依赖注入(DI)详解】 控制反转(Inversion of Control,简称IoC)是面向对象编程领域的一种设计原则,旨在降低软件组件间的耦合度。在传统的程序设计中,对象A如果依赖于对象B,那么对象A在...

    基于框架的Web开发-IoC(控制反转)和DI(依赖注入)入门.doc

    【控制反转(IoC)与依赖注入(DI)】是现代Web开发中,尤其是Spring框架中的核心概念。IoC和DI的主要目标是降低组件之间的耦合性,提高代码的灵活性和可维护性。 传统Java开发中,对象通常自行管理它们的依赖关系...

    Ioc(控制反转)的例子

    C#中实现IoC通常使用依赖注入(Dependency Injection,DI)这一技术。依赖注入有三种主要形式:构造函数注入、属性注入和方法注入。这里我们主要关注构造函数注入,因为它是最常用且最推荐的方式。 1. **构造函数...

    Spring Ioc 注解 依赖注入

    其中,IoC和依赖注入(Dependency Injection, DI)是Spring框架最核心的部分之一。 #### 二、IoC容器概述 在传统的Java应用程序中,对象的创建和管理通常由程序员来完成。这种方式会导致代码之间存在高度耦合,难以...

    php中Ioc(控制反转)和Di(依赖注入)

    PHP中的控制反转(IoC)与依赖注入(DI)是面向对象编程中非常重要的设计模式,它们是为了解决传统编程中类与类之间过于紧密耦合的问题而设计的。在PHP中实现这些设计模式可以帮助开发者提高代码的可维护性和可扩展...

    IOC控制反转机制的讲解

    2. DI(依赖注入):是IOC的一种实现,通过容器将依赖对象注入到需要它的对象中,对象只需声明依赖,无需关心依赖的具体实现和获取方式。 理解并掌握这些概念,有助于我们构建松散耦合、易于维护和扩展的系统,特别...

    笔记28-JAVAEE之Spring IoC&DI

    DI(Dependency Injection,即依赖注入)是Spring IoC的一种实现方式。它使得对象之间的依赖关系变得松散耦合,使得对象之间的耦合度降低。 在上面的代码中,我们使用了DI来实例化对象。例如,在Car类中,我们使用...

    helloIoc.zip spring ioc控制反转简单测试代码

    Spring框架的核心特性之一就是依赖注入(Dependency Injection,简称DI),它通过控制反转(Inversion of Control,简称IOC)实现。这个"helloIoc.zip"压缩包包含的是一组用于演示Spring IOC基本概念和使用的测试...

    我的Pro Spring 学习笔记 之二 控制反转(IoC)和依赖注入(DI), Spring初步

    在本文中,我们将深入探讨Spring框架的核心概念——控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)。这些概念是Spring框架的基础,对于理解和掌握Spring的使用至关重要。 首先,让...

    Martin Fowler 控制反转与依赖注入

    ### Martin Fowler 控制反转与依赖注入 #### 重要概念与背景 Martin Fowler的文章探讨了Java社区近期关注的一个热点话题:轻量级容器及其背后的模式。这些容器的主要目标是帮助开发者将来自不同项目的组件组装成一...

Global site tag (gtag.js) - Google Analytics