`
gupeng_ie
  • 浏览: 25068 次
  • 性别: 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依赖注入

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

    控制反转IOC(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种方法 。在没有IOC的程序中,我们使用面向对象编程,对象的创建于对象间的依赖完全硬编码在程序中,对象的创建有程序自己控制;...

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

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

    IOC控制反转

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

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

    1.2 IoC(控制反转)和DI(依赖注入)入门 1 传统的Java类 在工程下创建包ioc,在ioc包中创建类Test。(为了看起来清楚,将三个类写在了同一个Java文件中,其中唯一的public类为Test)。类的含义和关系如下: Car类...

    PHP控制反转(IOC)和依赖注入(DI)

    本文主要介绍了PHP控制反转(IOC)和依赖注入(DI)的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧

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

    最近在使用ThinkPHP5框架,看了下他的源码,发现有很多地方也用到了依赖注入(控制反转),觉得有必要和大家简单聊一聊什么是依赖注入以及怎么使用它。

    生鲜配送平台源码java-Easy2Spring:springIoC原理

    IoC控制反转 & DI依赖注入 Author:Qin Zhenghan 一、SpringIoC 高内聚、低耦合:首先设想在一家超市,如果所有商品没有分门别类,杂乱无章的摆放在一起,顾客很难从中挑出所要购买的商品。反之,若将不同种类的商品...

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

    1. 软件系统在没有引IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者 2. 软件系统在引IOC容器之后,这种情形就完全改变了,如图2所示

    10-IoC配置-依赖注入概念(DI)

    我相信很多朋友学习IOC概念的时候,查找了很多资料结果还是一头雾水,感觉高深难懂或者一知半解,而我这篇博客就是以通俗易懂的话语,用故事的方式,讲解IOC(控制反转)和DI(依赖注入)的概念,让大家不再晕,不再觉得...

    .NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)

    他是指一种特定的的解耦形式,使得高层次的模块不依赖低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象. 该原则规定: 高层次的模块不应该依赖低层次模块,二者都应该...

    理解php依赖注入和控制反转

    要想理解php依赖注入和控制反转两个概念,就必须搞清楚如下的问题:  DI——Dependency Injection 依赖注入 IoC——Inversion of Control 控制反转 1、参与者都有谁?  答:一般有三方参与者,一个是某个对象;...

    带容器的控制IOC反转(也称为依赖注入)

    通过依赖注入(DI)进行控制反转(又称为IOC)的概念和实现

    PHP依赖注入(DI)和控制反转(IoC)详解

    首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程序间的耦合,鄙人学习了一下,看TP官网还没有相关的文章,就写下这篇拙作介绍一下这种设计模式,希望能为TP社区贡献一些力量。...

    spring-zwz.zip

    spring一篇入门博文的配套资源,包含了第一个spring程序、IOC控制反转、DI依赖注入、静态代理、动态代理、AOP面向切面编程等源代码

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

    源代码 博文链接:https://danielkwo.iteye.com/blog/40945

Global site tag (gtag.js) - Google Analytics