依赖注入的原理
依赖注入的方式---XML配置
依赖注入的方式---注解的方式

Spring 它的核心就是IOC和AOP。而IOC中实现Bean注入的实现方式之一就是DI(依赖注入)。

一 DI的原理
DI的基本原理:对象之间的依赖关系只会通过三种方式:构造函数参数,工厂方法的参数以及构造函数或工厂方法创建的对象属性设置。因此,容器的工作哦就是
在创建Bean时注入所有的依赖关系。相对于由Bean自己控制其实例化,直接在构造器中指定依赖关系或者类似服务定位器(Service
Locator)这三种自主控制依赖关系注入的方法,而控制权从根本上发生改变,即控制反转(Inverse of Controll)---IOC.

应用DI规则后,我们不用在关注对象之间的依赖关系,从而达到高层次的松耦合。DI有两种实现方式---Setter/getter方式(传值方式)和构造器方式(引用方式)。

下面就从XML配置和注解角度来介绍这两种方式。

二、DI的方式---XML配置
1. Setter/getter方法
下面是一个Sample

1)、beans.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-2.5.xsd
  7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  8. <bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>
  9. <bean id="personService" class="com.spring.service.impl.PersonServiceBean" >
  10. <property name="personDao" ref="personDao"/>
  11. </bean>
  12. </beans>

2) PersonDao.java

  1. package com.spring.dao;
  2. ublic interface PersonDao {
  3. public void add();

3) PersonDaoImpl.java

  1. package com.spring.dao.impl;
  2. import com.spring.dao.PersonDao;
  3. public class PersonDaoImpl implements PersonDao {
  4. public void add() {
  5. System.out.println("PersonDao.add() is running.");
  6. }
  7. }

4) PersonService.java

  1. package com.spring.service;
  2. public interface PersonService {
  3. public  void save();
  4. }

5) PersonServiceBean.java

  1. package com.spring.service.impl;
  2. import com.spring.dao.*;
  3. import com.spring.service.PersonService;
  4. import javax.annotation.PostConstruct;
  5. import javax.annotation.PreDestroy;
  6. public class PersonServiceBean implements PersonService {
  7. private PersonDao personDao;
  8. public PersonServiceBean(){
  9. System.out.println("personServiceBean.constructor() is running.");
  10. }
  11. public PersonDao getPersonDao() {
  12. return personDao;
  13. }
  14. public void setPersonDao(PersonDao personDao) {
  15. this.personDao = personDao;
  16. }
  17. public void save(){
  18. System.out.println("Name:" );
  19. personDao.add();
  20. }
  21. @PostConstruct
  22. public void init(){
  23. System.out.println("PersonServiceBean.init() is running.");
  24. }
  25. @PreDestroy
  26. public void destory(){
  27. System.out.println("PersonServiceBean.destory() is running.");
  28. }
  29. }

6) SpringIOCTest.java(测试类)

  1. package junit.test;
  2. import org.junit.BeforeClass;
  3. import org.junit.Test;
  4. import org.springframework.context.support.AbstractApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6. import com.spring.service.PersonService;
  7. public class SpringIOCTest {
  8. @BeforeClass
  9. public static void setUpBeforeClass() throws Exception {
  10. }
  11. @Test public void instanceSpring(){
  12. AbstractApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
  13. PersonService personService = (PersonService)context.getBean("personService");
  14. personService.save();
  15. //          context.close();
  16. }
  17. }

我们还可以采用内部注入的方式来处理:
Beans.xml修改如下:

  1. <bean id="personService">
  2. <property name="personDao">
  3. <bean/>
  4. </property>
  5. </bean>

2、构造器注入

以下是个例子

  1. <bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>
  2. <bean id="personService"  class="com.spring.service.impl.PersonServiceBean" init-method="init" destroy-method="destory">
  3. <constructor-arg index="0" type="com.spring.dao.PersonDao" ref="personDao"/>
  4. <constructor-arg index="1" value="Jamson" />
  5. </bean>

2) PersonService.java:同Setter方法注入
3) PersonServiceBean.java

  1. public class PersonServiceBean implements PersonService {
  2. private PersonDao personDao;
  3. private String name;
  4. public PersonServiceBean(){
  5. System.out.println("personServiceBean.constructor() is running.");
  6. }
  7. public PersonServiceBean(PersonDao personDao, String name) {
  8. this.personDao = personDao;
  9. this.name = name;
  10. }
  11. //      public PersonDao getPersonDao() {
  12. //          return personDao;
  13. //      }
  14. //     public void setPersonDao(PersonDao personDao) {
  15. //         this.personDao = personDao;
  16. //      }
  17. public void save(){
  18. System.out.println("Name:"+name );
  19. personDao.add();
  20. }
  21. @PostConstruct
  22. public void init(){
  23. System.out.println("PersonServiceBean.init() is running.");
  24. }
  25. @PreDestroy
  26. public void destory(){
  27. System.out.println("PersonServiceBean.destory() is running.");
  28. }
  29. }

4) PersonDao.java:同Setter方法注入
5) PersonDaoImpl.java:同Setter方法注入
6) 测试类(SpringIOCTest.java):同上

控制台信息

  1. PersonServiceBean.init() is running.
  2. Name:Jamson
  3. PersonDao.add() is running.
  4. PersonServiceBean.destory() is running.

三 DI的方式---注解的配置
自从Jdk5中引入Annotation类后,在EJB和Spring中得到广泛的使用,也越来越被开发者们在平时的应用中使用。主要是用在Field上
的注入。在日常的应用开发中,一个项目中有很多的bean,如果使用XML文件配置,就会导致配置文件难以管理。使用注解注入的时候,能够使bean的配
置文件内容不至于繁杂。

首先介绍下注解的两种方式:@Resource(javax.annotation.Resource)和@Autowired.
@Resource:首先按照名称去寻找当前的bean,如果找不到的话,那就以类型装配。
@Autowired:首先按照类型去寻找当前的bean, 如果找不到的话,那就以名称装配。
1. Resource
下面介绍一个Sample:

1)beans.xml

  1. <context:annotation-config/>
  2. <bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>
  3. <bean id="personService"  class="com.spring.service.impl.PersonServiceBean"  init-method="init" destroy-method="destory">
  4. </bean>

2) PersonService.java:同上。
3) PersonServiceBean.java

  1. package com.spring.service.impl;
  2. import com.spring.dao.*;
  3. import com.spring.service.PersonService;
  4. import javax.annotation.PostConstruct;
  5. import javax.annotation.PreDestroy;
  6. import javax.annotation.Resource;
  7. public class PersonServiceBean implements PersonService {
  8. @Resource(name="personDao")
  9. private PersonDao personDao;
  10. private String name;
  11. public PersonServiceBean(){
  12. System.out.println("personServiceBean.constructor() is running.");
  13. }
  14. public PersonServiceBean(PersonDao personDao, String name) {
  15. this.personDao = personDao;
  16. this.name = name;
  17. }
  18. //      public PersonDao getPersonDao() {
  19. //          return personDao;
  20. //      }
  21. //     public void setPersonDao(PersonDao personDao) {
  22. //         this.personDao = personDao;
  23. //      }
  24. public void save(){
  25. System.out.println("Name:"+name );
  26. personDao.add();
  27. }
  28. @PostConstruct
  29. public void init(){
  30. System.out.println("PersonServiceBean.init() is running.");
  31. }
  32. @PreDestroy
  33. public void destory(){
  34. System.out.println("PersonServiceBean.destory() is running.");
  35. }
  36. }

4) PersonDao.java:同上
5) PersonDaoService.java:同上
6) 测试类SpringIOCTest.java:同上

Spring IOC 依赖注入的两种方式XML和注解的更多相关文章

  1. Spring中依赖注入的四种方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...

  2. spring的ioc依赖注入的三种方法(xml方式)

    常见的依赖注入方法有三种:构造函数注入.set方法注入.使用P名称空间注入数据.另外说明下注入集合属性 先来说下最常用的那个注入方法吧. 一.set方法注入 顾名思义,就是在类中提供需要注入成员的 s ...

  3. spring的IOC——依赖注入的两种实现类型

    一.构造器注入: 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <constructor-arg ref="userDao4Oracle" ...

  4. spring的依赖注入的四种方式,数组与集合注入;引用注入;内部bean注入

    三种注入方式 第一种: 基于构造函数 hi.java (bean) package test_one; public class hi { private String name; public hi ...

  5. Spring的依赖注入的2种方式(1天时间)

    今天花了一天的时间才调试出来 private      接口   实现类的那个bean; 最后面的那个名字不能随便的写,必须是配置文件中,实现类的那个bean 就是后面的那个名字写错了,花了整整一天 ...

  6. 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)

    上篇博文,我们介绍了为什么使用IOC容器,和IOC的设计思想以及IOC容器的优缺点,并且给大家转载了一篇介绍IOC原理的博文,我们这篇主要给大家依赖注入的两种方式,以及他们的优缺点. 我们这篇博文还是 ...

  7. ASP.NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...

  8. Spring中属性注入的几种方式以及复杂属性的注入

    在Spring框架中,属性的注入我们有多种方式,我们可以通过构造方法注入,可以通过set方法注入,也可以通过p名称空间注入,方式多种多样,对于复杂的数据类型比如对象.数组.List集合.map集合.P ...

  9. 峰Spring4学习(2)依赖注入的几种方式

    一.装配一个bean 二.依赖注入的几种方式 com.cy.entity   People.java: package com.cy.entity; public class People { pri ...

随机推荐

  1. s

    echo.  输出空行 echo; 输出空行 请求用户输入 set /p LOG_PATH=请输入log绝对路径: http://159.20.127:9009/gamesdk/doroot.jsp ...

  2. c++共享内存(转载)

    对于连个不同的进程之间的通信,共享内存是一种比较好的方式,一个进程把数据发送到共享内存中, 另一个进程可以读取改数据,简单记录一下代码 #define BUF_SIZE 256 TCHAR szNam ...

  3. C++ 应用处理异常崩溃(转载)

    有时,在我们的程序运行的时候,会遇到一些崩溃问题,尤其是概率出现的时候,如果能捕获其异常,那么对于我们快速定位bug是很有帮助的 这里借用网上搜寻回来的函数,记录一下: 头文件及库: #include ...

  4. .Net架构必备工具列表

    ★微软MSDN:每个开发人员现在应该下载的十种必备工具 点此进入 ★网友总结.Net架构必备工具列表 Visual Studio 这个似乎是不言而喻的,只是从严谨的角度,也列在这.实际上,现在也有一个 ...

  5. Ioc

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  6. nginx 支持laravel 5.3配置

    server { listen ; server_name www.baidu.com.cn; root /data/cehuiren/public; #charset koi8-r; #access ...

  7. jQuery事件绑定on()、bind()与delegate() 方法详解

    jquery中有四种事件绑定函数,bind(),live(),on(),delegate(),由于live现在并不常用,因此不做过多解释. 1. bind()用法 $("div p" ...

  8. (42) Aeroo 模板实战

    用writer设计一个采购单的模板 我用的是libreoffice 5.2.x 对于这个表格是通过工具栏上的插入指定的表格行和列完成,然后排版 对于单号po00001 这这样插入的 这样就完成一个订单 ...

  9. JavaScript判断、循环、Map、Set

     本文是笔者在看廖雪峰老师JavaScript教程时的个人总结      一些判断条件                 JavaScript把null.undefined.0.NaN和空字符串''视为 ...

  10. VHDL的参数写在一个vhd文件里

    1 参数文件top_pkg.vhd