Spring IOC 依赖注入的两种方式XML和注解
依赖注入的原理
依赖注入的方式---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 (外部注入的方式)
- <?xml version="1.0" encoding="UTF-8"?>
- <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-2.5.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
- <bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>
- <bean id="personService" class="com.spring.service.impl.PersonServiceBean" >
- <property name="personDao" ref="personDao"/>
- </bean>
- </beans>
2) PersonDao.java
- package com.spring.dao;
- ublic interface PersonDao {
- public void add();
3) PersonDaoImpl.java
- package com.spring.dao.impl;
- import com.spring.dao.PersonDao;
- public class PersonDaoImpl implements PersonDao {
- public void add() {
- System.out.println("PersonDao.add() is running.");
- }
- }
4) PersonService.java
- package com.spring.service;
- public interface PersonService {
- public void save();
- }
5) PersonServiceBean.java
- package com.spring.service.impl;
- import com.spring.dao.*;
- import com.spring.service.PersonService;
- import javax.annotation.PostConstruct;
- import javax.annotation.PreDestroy;
- public class PersonServiceBean implements PersonService {
- private PersonDao personDao;
- public PersonServiceBean(){
- System.out.println("personServiceBean.constructor() is running.");
- }
- public PersonDao getPersonDao() {
- return personDao;
- }
- public void setPersonDao(PersonDao personDao) {
- this.personDao = personDao;
- }
- public void save(){
- System.out.println("Name:" );
- personDao.add();
- }
- @PostConstruct
- public void init(){
- System.out.println("PersonServiceBean.init() is running.");
- }
- @PreDestroy
- public void destory(){
- System.out.println("PersonServiceBean.destory() is running.");
- }
- }
6) SpringIOCTest.java(测试类)
- package junit.test;
- import org.junit.BeforeClass;
- import org.junit.Test;
- import org.springframework.context.support.AbstractApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import com.spring.service.PersonService;
- public class SpringIOCTest {
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- }
- @Test public void instanceSpring(){
- AbstractApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
- PersonService personService = (PersonService)context.getBean("personService");
- personService.save();
- // context.close();
- }
- }
我们还可以采用内部注入的方式来处理:
Beans.xml修改如下:
- <bean id="personService">
- <property name="personDao">
- <bean/>
- </property>
- </bean>
2、构造器注入
以下是个例子
- <bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>
- <bean id="personService" class="com.spring.service.impl.PersonServiceBean" init-method="init" destroy-method="destory">
- <constructor-arg index="0" type="com.spring.dao.PersonDao" ref="personDao"/>
- <constructor-arg index="1" value="Jamson" />
- </bean>
2) PersonService.java:同Setter方法注入
3) PersonServiceBean.java
- public class PersonServiceBean implements PersonService {
- private PersonDao personDao;
- private String name;
- public PersonServiceBean(){
- System.out.println("personServiceBean.constructor() is running.");
- }
- public PersonServiceBean(PersonDao personDao, String name) {
- this.personDao = personDao;
- this.name = name;
- }
- // public PersonDao getPersonDao() {
- // return personDao;
- // }
- // public void setPersonDao(PersonDao personDao) {
- // this.personDao = personDao;
- // }
- public void save(){
- System.out.println("Name:"+name );
- personDao.add();
- }
- @PostConstruct
- public void init(){
- System.out.println("PersonServiceBean.init() is running.");
- }
- @PreDestroy
- public void destory(){
- System.out.println("PersonServiceBean.destory() is running.");
- }
- }
4) PersonDao.java:同Setter方法注入
5) PersonDaoImpl.java:同Setter方法注入
6) 测试类(SpringIOCTest.java):同上
控制台信息
- PersonServiceBean.init() is running.
- Name:Jamson
- PersonDao.add() is running.
- 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
- <context:annotation-config/>
- <bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>
- <bean id="personService" class="com.spring.service.impl.PersonServiceBean" init-method="init" destroy-method="destory">
- </bean>
2) PersonService.java:同上。
3) PersonServiceBean.java
- package com.spring.service.impl;
- import com.spring.dao.*;
- import com.spring.service.PersonService;
- import javax.annotation.PostConstruct;
- import javax.annotation.PreDestroy;
- import javax.annotation.Resource;
- public class PersonServiceBean implements PersonService {
- @Resource(name="personDao")
- private PersonDao personDao;
- private String name;
- public PersonServiceBean(){
- System.out.println("personServiceBean.constructor() is running.");
- }
- public PersonServiceBean(PersonDao personDao, String name) {
- this.personDao = personDao;
- this.name = name;
- }
- // public PersonDao getPersonDao() {
- // return personDao;
- // }
- // public void setPersonDao(PersonDao personDao) {
- // this.personDao = personDao;
- // }
- public void save(){
- System.out.println("Name:"+name );
- personDao.add();
- }
- @PostConstruct
- public void init(){
- System.out.println("PersonServiceBean.init() is running.");
- }
- @PreDestroy
- public void destory(){
- System.out.println("PersonServiceBean.destory() is running.");
- }
- }
4) PersonDao.java:同上
5) PersonDaoService.java:同上
6) 测试类SpringIOCTest.java:同上
Spring IOC 依赖注入的两种方式XML和注解的更多相关文章
- Spring中依赖注入的四种方式
在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入 这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...
- spring的ioc依赖注入的三种方法(xml方式)
常见的依赖注入方法有三种:构造函数注入.set方法注入.使用P名称空间注入数据.另外说明下注入集合属性 先来说下最常用的那个注入方法吧. 一.set方法注入 顾名思义,就是在类中提供需要注入成员的 s ...
- spring的IOC——依赖注入的两种实现类型
一.构造器注入: 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <constructor-arg ref="userDao4Oracle" ...
- spring的依赖注入的四种方式,数组与集合注入;引用注入;内部bean注入
三种注入方式 第一种: 基于构造函数 hi.java (bean) package test_one; public class hi { private String name; public hi ...
- Spring的依赖注入的2种方式(1天时间)
今天花了一天的时间才调试出来 private 接口 实现类的那个bean; 最后面的那个名字不能随便的写,必须是配置文件中,实现类的那个bean 就是后面的那个名字写错了,花了整整一天 ...
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
上篇博文,我们介绍了为什么使用IOC容器,和IOC的设计思想以及IOC容器的优缺点,并且给大家转载了一篇介绍IOC原理的博文,我们这篇主要给大家依赖注入的两种方式,以及他们的优缺点. 我们这篇博文还是 ...
- ASP.NET MVC中使用Unity进行依赖注入的三种方式
在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...
- Spring中属性注入的几种方式以及复杂属性的注入
在Spring框架中,属性的注入我们有多种方式,我们可以通过构造方法注入,可以通过set方法注入,也可以通过p名称空间注入,方式多种多样,对于复杂的数据类型比如对象.数组.List集合.map集合.P ...
- 峰Spring4学习(2)依赖注入的几种方式
一.装配一个bean 二.依赖注入的几种方式 com.cy.entity People.java: package com.cy.entity; public class People { pri ...
随机推荐
- 如何为数据源向导填加一种自定义的数据源类型(win示例)
https://www.devexpress.com/Support/Center/Example/Details/T310160
- Redis中的客户端redis-cli 命令总结
1.连接操作相关的命令quit:关闭连接(connection)auth:简单密码认证 2.对value操作的命令exists(key):确认一个key是否存在del(key):删除一个keytype ...
- Webpack、Browserify和Gulp
https://www.zhihu.com/question/37020798 https://www.zhihu.com/question/35479764
- python画图
正弦图像: #coding:utf-8import numpy as npimport matplotlib.pyplot as pltx=np.linspace(0,10,1000)y=np.sin ...
- HTML5 十大新特性(五)——SVG绘图
相对于canvas绘图,SVG是一种绘制矢量图的技术.全称叫做Scalable Vector Graphics,可缩放的矢量图,在2000年就已经存在,H5把它纳入了标准标签库,并进行了一些瘦身.需要 ...
- 转:Linux内部的时钟处理机制全面剖析
Linux内部的时钟处理机制全面剖析 在 Linux 操作系统中,很多活动都和时间有关,例如:进程调度和网络处理等等.所以说,了解 Linux 操作系统中的时钟处理机制有助于更好地了解 Linux 操 ...
- 【UE4+Vive】学习笔记1
16.9.10为了做房产项目,这两天开始学习Unreal Engine 4.之前一直用unity,但是视觉效果一直不满意,听说虚幻4的效果更好,就来试一试水. 1.安装UE4 参考资料一: http: ...
- HTML5新增标签
section标签 <section>标签,定义文档中的节.比如章节.页眉.页脚或文档中的其它部分.一般用于成节的内容,会在文档流中开始一个新的节.它用来表现普通的文档内容或应用区块,通 ...
- 百度在线笔试编程测试题(Python):整数分解成素数的积
编程测试题: 输入一个正整数将其分解成素数的乘积,输入格式连续输入m个数,然后将这m个数分别分解,如 输入: 2 10 20 输出: 2 5 2 2 5 Python code: def primes ...
- Redis常用命令入门2:散列类型
散列命令 散列类型的键值其实也是一种字典解耦,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,所以说散列类型不能嵌套其他的数据类型.一个散列类型的键可以包含最多2的32次方-1个 ...