依赖注入—手工装配(XML方式)
--通过属性注入(相应属性必须有setter方法才行,同时,要有无参构造方法):

<!-- 通过属性注入(setter方法) -->
<bean id="user1" class="com.winner.spring.User">
<property name="id" value="1"/>
<property name="name" value="zhangsan"/>
</bean>

--通过构造器注入:

public User(Long id, String name) {
this.id = id;
this.name = name;
}
 <!-- 通过构造方法注入 -->
<bean id="user2" class="com.winner.spring.User">
<constructor-arg value="2"/>
<constructor-arg value="lisi"/>
</bean>

注意顺序,与构造方法对应

或是:
 这样对顺序就没有要求了

<bean id="user3" class="com.winner.spring.User">
<constructor-arg index="0" value="3"/>
<constructor-arg index="1" value="wangwu"/>
</bean>

注入集合属性

private Set<String> addressSet;

public Set<String> getAddressSet() {
return addressSet;
} public void setAddressSet(Set<String> addressSet) {
this.addressSet = addressSet;
}
<property name="addressSet">
<set>
<value>beijing</value>
<value>nanjing</value>
</set>
</property>
public class User {
private String name; // 集合属性要定义为接口类型
// 集合类型可以不初始化,因为会注入一个新的集合对象
// 集合最好指定强类型,以便Spring转型,如果未指定,就会是String型的值
// 如果没有指定强类型,也可以在配置时指定:
//<value type="java.lang.Integer">10</value>
private Set<String> addressSet = new HashSet<String>();
private Set<Integer> numberSet;
private List<String> addressList;
private String[] addressArray;
private Map<String, String> addressCodeMap;
private Properties userProperties; //getter,setter
}
<bean id="user" class="cn.itcast.k_di_collection.User">
<property name="name" value="张三"></property> <!-- Set类型 -->
<property name="addressSet">
<set>
<value>广东路1号</value>
<value>广东路2号</value>
</set>
</property> <!-- Set类型 -->
<property name="numberSet">
<set>
<value type="java.lang.Integer">1</value>
<value type="java.lang.Integer">2</value>
</set>
</property> <!-- List类型,数组类型与List配置完全一样(具体代码略) -->
<property name="addressList" >
<list>
<value>广东路27号</value>
<value>广东路28号</value>
</list>
</property> <!-- Map类型,要指定key-value对 -->
<property name="addressCodeMap">
<map>
<entry key="广东路27号" value="100085" ></entry>
<entry key="广东路28号" value="100086"></entry>
</map>
</property> <!-- Properties类型,只能是String型的值 -->
<property name="userProperties">
<props>
<prop key="firstName" >hello</prop>
<prop key="lastName">world</prop>
</props>
</property>
</bean>

注入依赖对象

<!-- 定义一个bean -->
<bean id="userDao" class="com.winner.spring.UserDaoImpl"/> <!-- 使用ref属性指定要注入的bean(id或是name属性) -->
<bean id="userService" class="com.winner.spring.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>

说明:
定义bean时不分先后,Spring会自动处理他们之间的依赖关系,以决定先创建谁再创建谁。

方式二:使用内部bean,因为没有id或name,所以该bean不能被其他bean使用

<!-- 在property中直接定义一个bean,不需要指定id或name,指定了也无效 -->
<bean id="userService2" class="com.winner.spring.UserServiceImpl">
<property name="userDao">
<bean id="userDao2" class="com.winner.spring.UserDaoImpl" />
</property>
</bean>

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

使用注解的方式注入依赖

在java代码中使用@Resource注解方式进行装配,需要在xml配置文件中配置以下信息:

1. 引入context命名空间。

xmlns:context="http://www.springframework.org/schema/context"

2.在配置文件中添加context:component-scan标签。
applicationContext.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,扫描指定包及其所有下级包中的类,可以写多个,之间用英文的逗号隔开 -->
<context:component-scan base-package="cn.itcast"></context:component-scan> </beans>

在类中使用——定义bean
spring2.5为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。
功能介绍:

这几个注解的功能其实是一样的,只是委屈区分bean的作用。
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)、
@Repository用于标注数据访问组件,即DAO组件。
而@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定当前bean的作用域。
在类中使用——注入
这需要通过@Resource注解实现,@Resource注解可以标注在字段或属性的setter方法上,但它默认按名称装配。名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。如果没有指定name属性,并且按照默认的名称找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。

@Resource(name="personDao")
private PersonDao personDao;;//用于字段上
//用于属性的set方法上
@Resource(name="personDao")
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}

后一种相当于xml配置文件中的

<property name="personDao" ref="personDao" />
//使用@Component注解可以定义一个bean,
// bean的名称可以不写,默认为类的简单名称且第1个字母小写。
@Repository("userDao")
public class UserDao{ private DataSource dataSource; public void saveUser(Object user) {
System.out.println("UserDao.saveUser()");
} public DataSource getDataSource() {
return dataSource;
} public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource; }
}
@Service
public class UserService { @Resource
private UserDao userDao; public UserDao getUserDao() {
return userDao;
} public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
<?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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 设置为自动扫描与装配置bean,base-package是指定要扫描哪个包,可以使用逗号隔开的多个包名 -->
<context:component-scan base-package="com.winner.spring"/>
</beans>

Spring的依赖注入的更多相关文章

  1. (spring-第3回【IoC基础篇】)spring的依赖注入-属性、构造函数、工厂方法等的注入(基于XML)

    Spring要把xml配置中bean的属性实例化为具体的bean,"依赖注入"是关卡.所谓的"依赖注入",就是把应用程序对bean的属性依赖都注入到spring ...

  2. Spring的依赖注入(DI)三种方式

    Spring依赖注入(DI)的三种方式,分别为: 1.  接口注入 2.  Setter方法注入 3.  构造方法注入 下面介绍一下这三种依赖注入在Spring中是怎么样实现的. 首先我们需要以下几个 ...

  3. spring的依赖注入的最常见的两种方法

    package com.lsz.spring.action; public class User { /** * set注入 */ private String username; public vo ...

  4. 一步一步深入spring(3)--spring的依赖注入方式

    对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程,sprin ...

  5. spring的依赖注入是什么意思

    最近学习spring框架,对依赖注入有些模糊,遂上网翻阅资料,做了下列总结,原博客为CSDN 南夏的 spring的依赖注入是什么意思,侵删! Spring 能有效地组织J2EE应用各层的对象.不管是 ...

  6. SpringBoot系列: 理解 Spring 的依赖注入(一)

    ==============================Spring 的依赖注入==============================对于 Spring 程序, Spring 框架为我们提供 ...

  7. Spring.NET依赖注入框架学习--实例化容器常用方法

    Spring.NET依赖注入框架学习---实例化容器常用方法 本篇学习实例化Spring.NET容器的俩种方式 1.通过XmlObjectFactory创建一个Spring.NET容器 IResour ...

  8. Spring.NET依赖注入框架学习--简单对象注入

    Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常 ...

  9. Spring.NET依赖注入框架学习--简介

    Spring.NET依赖注入框架学习--Spring.NET简介 概述 Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序.它提供了很多方面的功能,比如依赖注入. ...

  10. Spring.NET依赖注入框架学习--入门

    Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...

随机推荐

  1. 膜拜 2014-2 (献给L之三)

    文/安然 深深的夜静静的想你细细的品味满满的甜蜜爱,心灵的对话让我流泪战栗谢谢你给我这么弥足珍贵的体会不能一生相随又有什么关系你一直都在我的爱就永不停息此生足以——献给心底的爱

  2. gdb/valgrind/coredump to debug c/cpp program

    gdb/valgrind/coredump 调试 1.gdb 调试 while/for 循环 ①如果在调试 while/for的时候,可以用until xxx(其中,xxx代表 行号)直接跳转到循环后 ...

  3. Qt5中使用lambda表达式

    c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...

  4. 在Spring中使用cache(EhCache的对象缓存和页面缓存)

    Spring框架从version3.1开始支持cache,并在version4.1版本中对cache功能进行了增强. spring cache 的关键原理就是 spring AOP,通过 spring ...

  5. 让Dock自动 显示/隐藏 不再有延迟

    Safari 5.2 Mac OS X 10.7.2 <ignore_js_op> 可能很多朋友使用Mac的时候都会选择将Dock隐藏(可以在系统偏好设置-Dock中选择),等到使用的时候 ...

  6. 《疯狂的android讲义第3版》读书笔记

    第一章.开始启程,你的第一行android代码 1.android系统架构: 1)linux内核层:为底层硬件提供驱动,如显示驱动.音频驱动.照相机驱动.蓝牙驱动.Wifi驱动.电源管理等 2)系统运 ...

  7. Demo学习: Collapsible Panels

    Collapsible Panels 设置TUniPanel布局属性,布局属性在Ext里是比较常用的属性,当前版本虽已经提供了布局功能,但很不完善,比如当Panel.TitlePosition=tpR ...

  8. Ubuntu 14.04的SWAP 为0

    [@@@@@@]# free total used free shared buffers cached Mem: 1024976 248992 775984 0 16820 73128 -/+ bu ...

  9. SharedPreference.Editor的apply与commit方法不同之处

    定义: void apply boolean commit; 相同:二者都是提交修改的数据 手机里的文件存放在/data/data/<package_name>/shared_prefs ...

  10. MySQL创建数据库[保存mojo格式的数据库]已经常用的utf8格式数据库

    一.创建最新编码utf8mb4格式的库: CREATE DATABASE IF NOT EXISTS yourdbname CHARACTER SET utf8mb4 COLLATE utf8mb4_ ...