写在之前,作为正在学习的程序员,对于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#如何立即回收内存

    1.把对象赋值为null 2.立即调用GC.Collect(); 注意:这个也只是强制垃圾回收器去回收,但具体什么时候执行不确定.  代码: class Test { ~Test() { Consol ...

  2. docker 学习(八) docker file

    一 什么是Dockerfile: Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像.它们简化了从头到尾的流程并极大的简化了部署工作.Dockerfile ...

  3. ubuntu下终于安装好了nvidia的gt540显卡驱动

    ubuntu下终于安装好了nvidia的gt540显卡驱动.估计好多童鞋怕麻烦都放弃安装了哈. 先看看效果. ~$ lspci |grep -i vga :) :00.0 VGA compatible ...

  4. 苦逼三流小公司程序员这半年找工作经历(3)——选择offer

    本文按照企业规模.性质.规模,分成三类,点评一下遇到的这些公司.也算是为半年找工作经历的一个总结. 1,三流小公司 公司规模类似于笔者跳槽前所在企业,性质有外商独资.合资,当然大多数都是民营企业,规模 ...

  5. [poj]开关类问题 枚举 位运算

    poj 1222  EXTENDED LIGHTS OUT 开关只有两种方案 按和不按,按两次相当于关 只用枚举第一排开关的按法即可,剩下的行为使上一排的灯全部关闭,按法可以确定,并且是唯一的. 最后 ...

  6. Unity中的Lod

    http://blog.csdn.net/bigpaolee/article/details/48521371 LOD是( Level of Detail)的缩写,表示细节级别. 这里注意下,Lodg ...

  7. TemplateText TT 在Runtime发生 Could not load type ...... because the format is invalid

    Severity Code Description Project File Line Suppression State Error Running transformation: System.T ...

  8. visdom可视化pytorch训练过程

    一.前言 在深度学习模型训练的过程中,常常需要实时监听并可视化一些数据,如损失值loss,正确率acc等.在Tensorflow中,最常使用的工具非Tensorboard莫属:在Pytorch中,也有 ...

  9. MyBaties源码解析

    觉得查看源代码确实是一个学习的一种方法 因为很多时候别人把最核心的代码给我们都封装好了 我们直接可以来拿使用 很多时候自己也会问 为什么通过这个方法就可以得到我觉得就是一颗好奇心吧 我算了算 就这三个 ...

  10. W3C标准以及规范

    1.什么是DOCTYPE DOCTYPE是document type(文档类型)的简写,用来说明你用的XHTML或者HTML是什么版本.其中的DTD(例如xhtml1-transitional.dtd ...