写在之前,作为正在学习的程序员,对于Spring理解比较差,给两个简单的定义大家看一下。

控制反转(Inversion of Control),是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心,beans。

DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现。

今天的博客主要写的是DI,所以我们看的是实现,而不是思想。

首相我们先来看最简单的set方法注入

我们准备一个实体类就可以做第一个例子,

publi class Users(){
private String name; private Integer age;
}
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p" 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/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- <context:component-scan base-package="cn.curry"></context:component-scan>
-->
<bean id="users" class="cn.curry.spring.Users">
<property name="name" value="呵呵"></property>
</bean>

上面是我们的部分配置文件。

最后我们看简单的测试

 @Test
public void test01(){
Resource resource=new ClassPathResource("applicationContext.xml");
BeanFactory bf=new XmlBeanFactory(resource);
Users users=(Users)bf.getBean("users");
Users userss=(Users)bf.getBean("users");
System.out.println(users==userss);
System.out.println(users.getName());
}

然后我们再看域属性注入和P命名空间注入

这时我们会添加第二个实体类,并且在Users类里加一个构造

public Users() {
System.out.println("Object Init");
} public Users(String name, Integer age, Car car) {
this.name = name;
this.age = age;
this.car = car;
}
public class Car {private String color;

    public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
}
}

配置文件

<bean id="us2" class="cn.curry.spring.Users">
<constructor-arg index="0" value="花花"></constructor-arg>
<constructor-arg index="1" value="12"></constructor-arg>
<constructor-arg index="2" ref="car"></constructor-arg>
</bean> <bean id="usersP" class="cn.curry.spring.Users" p:name="花花" p:age="12" p:car-ref="car"></bean>

看测试

@Test
public void test02(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Users users=(Users) context.getBean("us2");
System.out.println(users.getCar().getColor()+" "+users.getName()); }
@Test
public void test03(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Users users=(Users) context.getBean("usersP");
System.out.println(users.getCar().getColor()+" "+users.getName());
}

然后看集合属性注入

先修改Users,添加集合属性

    private List<Car> list;

    private Set<Car> set;

    private Map<Integer,Car> map;

在看配置文件

<bean id="uslist" class="cn.curry.spring.Users">
<property name="list">
<list>
<ref bean="car"></ref>
</list>
</property>
</bean> <bean id="usset" class="cn.curry.spring.Users">
<property name="set">
<set>
<ref bean="car"></ref>
</set>
</property>
</bean>
<bean id="usmap" class="cn.curry.spring.Users">
<property name="map">
<map>
<entry key="1" value-ref="car"></entry>
</map>
</property>
</bean>

在看测试

@Test
public void test04(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Users users=(Users) context.getBean("uslist");
List<Car> list = users.getList();
for (Car item : list) {
System.out.println(item.getColor());
}
}
@Test
public void test05(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Users users=(Users) context.getBean("usset");
Set<Car> set = users.getSet();
for (Car item : set) {
System.out.println(item.getColor());
}
}
@Test
public void test06(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Users users=(Users) context.getBean("usmap");
Map<Integer, Car> map = users.getMap();
for (Integer item : map.keySet()) {
System.out.println(map.get(item).getColor());
}
}

最后我们看一下注解这时配置只需一句话

<context:component-scan base-package="cn.curry"></context:component-scan>

然后看我们的实体类

package cn.curry.spring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set; /**
* Created by Curry on 2017/3/25.
*/
@Component("usss")
public class Users {
@Value("赫尔")
private String name;
@Value("18")
private Integer age;
//@Resource(name="car")
@Autowired
@Qualifier("car")
private Car car;
private List<Car> list; private Set<Car> set; private Map<Integer,Car> map; public Users() {
System.out.println("Object Init");
} public Users(String name, Integer age, Car car) {
this.name = name;
this.age = age;
this.car = car;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Car getCar() {
return car;
} public void setCar(Car car) {
this.car = car;
} public List<Car> getList() {
return list;
} public void setList(List<Car> list) {
this.list = list;
} public Set<Car> getSet() {
return set;
} public void setSet(Set<Car> set) {
this.set = set;
} public Map<Integer, Car> getMap() {
return map;
} public void setMap(Map<Integer, Car> map) {
this.map = map;
}
}
package cn.curry.spring;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service; /**
* Created by Curry on 2017/3/25.
*/
@Component("car")
//@Service
//@Controller
//@Repository
public class Car {
@Value("黄色")
private String color; public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
}
}

最后一个测试

package cn.curry.test;

import cn.curry.spring.Car;
import cn.curry.spring.Users;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource; import java.util.List;
import java.util.Map;
import java.util.Set; /**
* Created by Curry on 2017/3/25.
*/
public class MyTest {
@Test
public void test01(){
Resource resource=new ClassPathResource("applicationContext.xml");
BeanFactory bf=new XmlBeanFactory(resource);
Users users=(Users)bf.getBean("users");
Users userss=(Users)bf.getBean("users");
System.out.println(users==userss);
System.out.println(users.getName());
}
@Test
public void test02(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Users users=(Users) context.getBean("us2");
System.out.println(users.getCar().getColor()+" "+users.getName()); }
@Test
public void test03(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Users users=(Users) context.getBean("usersP");
System.out.println(users.getCar().getColor()+" "+users.getName());
}
@Test
public void test04(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Users users=(Users) context.getBean("uslist");
List<Car> list = users.getList();
for (Car item : list) {
System.out.println(item.getColor());
}
}
@Test
public void test05(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Users users=(Users) context.getBean("usset");
Set<Car> set = users.getSet();
for (Car item : set) {
System.out.println(item.getColor());
}
}
@Test
public void test06(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Users users=(Users) context.getBean("usmap");
Map<Integer, Car> map = users.getMap();
for (Integer item : map.keySet()) {
System.out.println(map.get(item).getColor());
}
}
@Test
public void test07(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Users users=(Users) context.getBean("usss");
System.out.println(users.getName()+" "+users.getCar().getColor());
}
}

Spring的DI(Dependency Injection)的更多相关文章

  1. spring in action学习笔记一:DI(Dependency Injection)依赖注入之CI(Constructor Injection)构造器注入

    一:这里先说一下DI(Dependency Injection)依赖注入有种表现形式:一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) ...

  2. 理解依赖注入(DI - Dependency Injection)

    系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...

  3. Spring框架xml配置文件 复杂类型属性注入——数组 list map properties DI dependency injection 依赖注入——属性值的注入依赖于建立的对象(堆空间)

    Person类中的各种属性写法如下: package com.swift.person; import java.util.Arrays; import java.util.List; import ...

  4. spring ioc DI 理解

    下面是我从网上找来的一些大牛对spring ioc和DI的理解,希望也能让你对Spring ioc和DI的设计思想有更进一步的认识. 一.分享Iteye的开涛对Ioc的精彩讲解 Ioc—Inversi ...

  5. Spring系列(二):Spring IoC/DI的理解

    这几天重新学习了一下Spring,在网上找了相关的ppt来看,当看到Spring IoC这一章节的时候,先大致浏览了一下内容,有将近50页的内容,内心窃喜~QAQ~,看完这些内容能够对IoC有更深层次 ...

  6. 零基础学习java------37---------mybatis的高级映射(单表查询,多表(一对一,一对多)),逆向工程,Spring(IOC,DI,创建对象,AOP)

    一.  mybatis的高级映射 1  单表,字段不一致 resultType输出映射: 要求查询的字段名(数据库中表格的字段)和对应的java类型的属性名一致,数据可以完成封装映射 如果字段和jav ...

  7. Spring IOC/DI和AOP原理

    一 IOC/DI 1. 概念机原理 IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序.对象及其依赖对 ...

  8. What is dependency injection and when/why should or shouldn't it be used?

    参考:https://stackoverflow.com/questions/130794/what-is-dependency-injection 原文:https://www.jamesshore ...

  9. Spring IOC/DI和AOP原理(转发:https://www.cnblogs.com/techroad4ca/p/5770073.html)

    一 IOC/DI 1. 概念及原理 IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序.对象及其依赖对 ...

  10. spring IOC(DI)和AOP

    软件152谭智馗 IOC(Inversion of Control,控制倒转)Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制. DI—Dependency Injecti ...

随机推荐

  1. C# FileStream 按大小分段读取文本内容

    该例子首先在C盘根目录创建一个名为'file1.txt'的文本文件. 然后再运行该例子.. 完整代码如下: 引入命名空间: [csharp] view plain copy print? using  ...

  2. C++制作电压表电流表仪表盘(vs2008)

    Meter类 Meter.h #if !defined(AFX_METER_H__D5802279_6502_4453_BE21_58604877AD39__INCLUDED_) #define AF ...

  3. K-S Test

    K-S test, test for the equality of continuous, one-dimensional probability distribution that can be ...

  4. eclipse中jquery.js文件有错误提示…

    eclipse中jquery.js文件有错误提示的解决办法 2013-04-06 19:18 浏览次数:382 由于jquery.js文件进行了压缩,压缩之后的语法eclipse无法完全识别,所以有错 ...

  5. NOIP2015提高组 跳石头 ACM-ICPC2017香港 E(选择/移除+二分答案)

    跳石头 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 NN  ...

  6. ZOJ 1586 QS Network Kruskal求最小生成树

    QS Network Sunny Cup 2003 - Preliminary Round April 20th, 12:00 - 17:00 Problem E: QS Network In the ...

  7. 反射(type和assembly)

    这里简要介绍type和assembly 自定义特性 为了理解编写自定义特性的方式,应了解一下在编译器遇到代码中某个应用自定义特性的元素时,该如何处理. [AttributeUsage(Attribut ...

  8. 51nod1110(xjb)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1110 题意:中文题诶- 思路:可以将在 xi 位置,权值为 w ...

  9. Codeforces Round #290 (Div. 2) B (dfs)

    题目链接:http://codeforces.com/problemset/problem/510/B 题意:判断图中是否有某个字母成环 思路:直接dfs就好了,注意判断条件:若下一个字母与当前字母相 ...

  10. Jmeter接口自动化参数化 (转自软件测试部落)

    测试场景: 有个查询城市(大概一百个 )天气预报的接口(需求参考第一课),需要根据不同的citycode,去查询对应城市的天气预报,这种接口该如何去测试呢? 分析需求: 不管是功能测试需求,还是接口测 ...