DI:Dependency Injection(依赖注入),通俗的讲就是一种通过xml配置文件,为交给sping容器的对象初始化参数。又称做控制反转:Inversion of Control(IoC)

依赖注入主要分为四种形式:

|-:基于构造方法的依赖注入

|-:基于setter方法的依赖注入

|-:基于工厂的注入 

|-:基于泛型的注入

 基于构造方法的依赖注入又可以分为以下几种:

·复杂数据类型:

·简单数据类型:

|- 基于属性类型(type)

|-基于索引(index)

|-基于参数名称(name)

复杂数据类型实例

 package com.fuwh.spring;

 /*
* POJO类
*/
public class Clazz { private String name;
private int grade;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
} }
package com.fuwh.spring;
/*
* POJO类
*/
public class Lesson { private String name;
private int score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
} }
package com.fuwh.spring; public class Student { private Clazz clazz;
private Lesson lesson; public Student(Clazz clazz, Lesson lesson) {
this.clazz = clazz;
this.lesson = lesson;
} @Override
public String toString() {
return "Student [clazz=" + clazz.getGrade()+clazz.getName() + ", lesson=" + lesson.getName()+","+lesson.getScore() + "学分]";
} } <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置文件 --> <bean id="student" class="com.fuwh.spring.Student" lazy-init="default">
<constructor-arg ref="clazz"/>
<constructor-arg ref="lesson"/>
</bean> <bean id="clazz" class="com.fuwh.spring.Clazz">
<property name="name" value="信本"/>
<property name="grade" value="08"/>
</bean>
<bean id="lesson" class="com.fuwh.spring.Lesson">
<property name="name" value="java"/>
<property name="score" value="4"/>
</bean>
</beans> package com.fuwh.spring; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Spring01 { public static void main(String[] args) {
/*
* 测试类
*/
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
System.out.println(ac.getBean("student",Student.class));
}
}
 

基于属性类型(type) 实例: 

 
 package com.fuwh.spring;
/*
* POJO类
*/
public class Clazz { private String name;
private int grade; public Clazz(String name, int grade) {
super();
this.name = name;
this.grade = grade;
}
@Override
public String toString() {
return "Student [name=" + name + ", grade=" + grade + "]";
} }
 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- spring配置文件 -->
<bean id="clazz" class="com.fuwh.spring.Clazz" lazy-init="default">
<constructor-arg type="String" value="信息与计算科学"/>
<constructor-arg type="int" value="08"/>
</bean>
</beans>
package com.fuwh.spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Spring01 { public static void main(String[] args) {
/*
* 测试类
*/
//ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
//ApplicationContext ac=new ClassPathXmlApplicationContext(new String[]{"beanStudent.xml","beanClazz.xml"});
//ApplicationContext ac=new ClassPathXmlApplicationContext("beanStudent.xml");
//System.out.println(ac.getBean("student"));
ApplicationContext ac=new ClassPathXmlApplicationContext("beanClazz.xml");
System.out.println(ac.getBean("clazz",Clazz.class));
}
}
 
 

 基于索引(index)实例

※需要注意的是,索引是从“0”开始

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- spring配置文件 -->
<bean id="clazz" class="com.fuwh.spring.Clazz" lazy-init="default">
<constructor-arg index="0" value="信息与计算科学"/>
<constructor-arg index="1" value="08"/>
</bean>
</beans>

基于参数名称(name)实例:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- spring配置文件 -->
<bean id="clazz" class="com.fuwh.spring.Clazz" lazy-init="default">
<constructor-arg name="name" value="信息与计算科学"/>
<constructor-arg name="grade" index="1" value="08"/>
</bean>
</beans>

基于setter方法的依赖注入

 
package com.fuwh.spring;

/*
* POJO类
*/
public class Lesson { private String name;
private int score; public void setName(String name) {
System.out.println("name parameter is injected");
this.name = name;
} public void setScore(int score) {
System.out.println("score parameter is injected");
this.score = score;
} @Override
public String toString() {
return "Lesson [name=" + name + ", score=" + score + "学分]";
} }
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- spring配置文件 -->
<bean id="lesson" class="com.fuwh.spring.Lesson" lazy-init="default"
p:name="php"
p:score="2"/>
</beans>
package com.fuwh.spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Spring01 { public static void main(String[] args) {
/*
* 测试类
*/
ApplicationContext ac=new ClassPathXmlApplicationContext("beanLesson.xml");
System.out.println(ac.getBean("lesson",Lesson.class));
}
}
 

在注入的时候,使用以上两种方式都是可以的,但是在以下一种情况下,只能使用setter的方式注入

Class A的构造方法中需要Class B的实例, Class B的构造方法中又需要Class A的实例,

这时候就会报BeanCurrentlyInCreationException的exception.

级联属性注入

 package com.fuwh.test;

 public class People {

     public int id;
public String name;
public int age; public Dog dog=new Dog(); public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Dog getDog() {
return dog;
} public void setDog(Dog dog) {
this.dog = dog;
} @Override
public String toString() {
return "People [id=" + id + ", name=" + name + ", age=" + age + ", dog=" + dog + "]";
} }
 package com.fuwh.test;

 public class Dog {

     public int id;
public String name;
public int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Dog [id=" + id + ", name=" + name + ", age=" + 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="people" class="com.fuwh.test.People">
<property name="id" value="1"></property>
<property name="name" value="laofu"></property>
<property name="age" value="27"></property> <!-- dog就是属于级联的初始化 -->
<property name="dog.id" value="12"></property>
<property name="dog.name" value="wangcai"></property>
<property name="dog.age" value="11"></property>
</bean> </beans>

最后,使用junit4进行测试

 package com.fuwh.test;

 import org.junit.Before;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { private ApplicationContext ac; @Before
public void setUp() throws Exception {
ac=new ClassPathXmlApplicationContext("beans.xml");
} @org.junit.Test
public void test() {
People people =(People)ac.getBean("people");
System.out.println(people);
} }

 注入集合变量

List

 package com.fuwh.test;

 import java.util.ArrayList;
import java.util.List; public class People { public int id;
public String name;
public int age; public List<String> nameList=new ArrayList<String>(); public List<String> getNameList() {
return nameList;
} public void setNameList(List<String> nameList) {
this.nameList = nameList;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "People [id=" + id + ", name=" + name + ", age=" + age + ", nameList=" + nameList + "]";
} }
 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="people" class="com.fuwh.test.People">
<property name="id" value="1"></property>
<property name="name" value="laofu"></property>
<property name="age" value="27"></property> <property name="nameList">
<list>
<value>唱歌</value>
<value>跳舞</value>
<value>编程</value>
</list>
</property>
</bean> </beans>
 package com.fuwh.test;

 import org.junit.Before;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { private ApplicationContext ac; @Before
public void setUp() throws Exception {
ac=new ClassPathXmlApplicationContext("beans.xml");
} @org.junit.Test
public void test() {
People people =(People)ac.getBean("people"); System.out.println(people);
} }

map

 package com.fuwh.test;

 import java.util.HashMap;
import java.util.Map; public class People { public int id;
public String name;
public int age; public Map<String,String> nameMap=new HashMap<String,String>(); public Map<String, String> getNameMap() {
return nameMap;
} public void setNameMap(Map<String, String> nameMap) {
this.nameMap = nameMap;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "People [id=" + id + ", name=" + name + ", age=" + age + ", nameMap=" + nameMap + "]";
} }
 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="people" class="com.fuwh.test.People">
<property name="id" value="1"></property>
<property name="name" value="laofu"></property>
<property name="age" value="27"></property> <property name="nameMap">
<map>
<entry>
<key><value>zhangsan</value></key>
<value>张三</value>
</entry>
<entry>
<key><value>lisi</value></key>
<value>李四</value>
</entry>
</map>
</property>
</bean> </beans>
 package com.fuwh.test;

 import org.junit.Before;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { private ApplicationContext ac; @Before
public void setUp() throws Exception {
ac=new ClassPathXmlApplicationContext("beans.xml");
} @org.junit.Test
public void test() {
People people =(People)ac.getBean("people"); System.out.println(people);
} }

注入属性

 package com.fuwh.test;

 import java.util.Properties;

 public class People {

     private int id;
private String name;
private int age; private Properties address=new Properties(); public Properties getAddress() {
return address;
} public void setAddress(Properties address) {
this.address = address;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "People [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
} }
 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="people" class="com.fuwh.test.People">
<property name="id" value="1"></property>
<property name="name" value="laofu"></property>
<property name="age" value="27"></property> <property name="address">
<props>
<prop key="sheng">shanghai</prop>
<prop key="shi">pudong</prop>
</props>
</property>
</bean> </beans>
 package com.fuwh.test;

 import org.junit.Before;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { private ApplicationContext ac; @Before
public void setUp() throws Exception {
ac=new ClassPathXmlApplicationContext("beans.xml");
} @org.junit.Test
public void test() {
People people =(People)ac.getBean("people"); System.out.println(people);
} }

bean的自动装配

  bean的自动装配总共分为四种方式:

no

(Default) No autowiring. Bean references must be defined via a ref element. Changing the default setting is not recommended for larger deployments, because specifying collaborators explicitly gives greater control and clarity. To some extent, it documents the structure of a system.

byName

Autowiring by property name. Spring looks for a bean with the same name as the property that needs to be autowired. For example, if a bean definition is set to autowire by name, and it contains a master property (that is, it has a setMaster(..) method), Spring looks for a bean definition named master, and uses it to set the property.

byType

Allows a property to be autowired if exactly one bean of the property type exists in the container. If more than one exists, a fatal exception is thrown, which indicates that you may not use byType autowiring for that bean. If there are no matching beans, nothing happens; the property is not set.

constructor

Analogous to byType, but applies to constructor arguments. If there is not exactly one bean of the constructor argument type in the container, a fatal error is r

 package com.fuwh.test;

 public class People {

     private int id;
private String name;
private int age; private Dog dog; public Dog getDog() {
return dog;
} public void setDog(Dog dog) {
this.dog = dog;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "People [id=" + id + ", name=" + name + ", age=" + age + ", dog=" + dog + "]";
} }
 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="dog" class="com.fuwh.test.Dog">
<property name="id" value="001"></property>
<property name="name" value="heihu"></property>
<property name="age" value="5"></property>
</bean> <!-- 也可以在beans中定义autowire="byName" 这时候就对所有bean有效-->
<bean id="people" class="com.fuwh.test.People" autowire="byName">
<property name="id" value="1"></property>
<property name="name" value="lisi"></property>
<property name="age" value="27"></property>
</bean> </beans>
 package com.fuwh.test;

 import org.junit.Before;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { private ApplicationContext ac; @Before
public void setUp() throws Exception {
ac=new ClassPathXmlApplicationContext("beans.xml");
} @org.junit.Test
public void test() {
People people =(People)ac.getBean("people");
System.out.println(people);
}
}

Spring特性--DI的更多相关文章

  1. Spring+IOC(DI)+AOP概念及优缺点

    Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应 ...

  2. myeclipse 去掉spring特性支持

    myeclipse10.0 去掉spring支持  手工修改工程目录下的.project文件中相关的内容 删除<nature>com.genuitec.eclipse.springfram ...

  3. 淘系工程师讲解的使用Spring特性优雅书写业务代码

    使用Spring特性优雅书写业务代码   大家在日常业务开发工作中相信多多少少遇到过下面这样的几个场景: 当某一个特定事件或动作发生以后,需要执行很多联动动作,如果串行去执行的话太耗时,如果引入消息中 ...

  4. spring+IOC+DI+AOP优点分析(一)

    Spring是什么: Spring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于sprin ...

  5. spring ioc DI 理解

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

  6. [置顶] Spring的DI依赖实现分析

    DI(依赖注入)是Spring最底层的核心容器要实现的功能之一,利用DI可以实现程序功能的控制反转(控制反转即程序之间之间的依赖关系不再由程序员来负责,而是由Spring容器来负责) 一个简单的例子( ...

  7. Spring IOC(DI)之注入方式

    一次被问到IOC的注入方式,当时脑袋一阵混乱,不知道噻.于是google了一下,发现众说纷纭,有说三种的,有说四种的.都滚犊子吧,还是看看官方文档吧. DI exists in two major v ...

  8. Spring Ioc DI 原理

    IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.Java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,每个对象在使用 ...

  9. SSM-Spring-02:Spring的DI初步加俩个实例

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- DI:依赖注入 第一个DEMO:域属性注入 java类:(Car类和Stu类,学生有一辆小汽车) packag ...

随机推荐

  1. [Modern OpenGL系列(一)]十步搞定OpenGL开发环境

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51292143 OpenGL官网:https://www.opengl.or ...

  2. Windows环境搭建Red5流媒体服务器指南

    Windows环境搭建Red5流媒体服务器指南 测试环境:Windows 7 一.   下载安装程序 red5-server 下载地址 https://github.com/Red5/red5-ser ...

  3. 表单中Readonly和Disabled的区别

    1.readonly是要锁定这个控件,通过在界面上无法修改他(但是通过javascript可以修改他). 2.disabled和readonly有相同的地方也是可以锁定这个控件用户不能改变他的值,但是 ...

  4. Linux 信号(二)—— signal 函数

    弗洛伊德认为:要解决这些苦恼,当事人就要通过回忆并理解自己早期的童年经历,来获得对潜意识冲突的顿悟.弗洛伊德的疗法被称为“精神分析” (psychoanalysis),在 20 世纪的很长一段时间被心 ...

  5. 升级Ubuntu 16.04 LTS后 DSL拨号上网(ppp)连接自动断开解决办法

    原本在Ubuntu 15.10用拨号上网没有问题,但升级了16.04 LTS后发现原来的DSL连接不上了.主要表现为: 1.在NetworkManager里面选择DSL Connection能够尝试拨 ...

  6. Intellij IDEA 快捷键整理

    CSDN 2016博客之星评选结果公布      [系列直播]算法与游戏实战技术      "我的2016"主题征文活动 Intellij IDEA 快捷键整理(TonyCody) ...

  7. 一个virtualbox开机即aborted的问题解决

    问题: 之前想装最新的virtualbox版本,从官网下载了virtualbox最新的5点几的版本,使用sudo dpkg -i *.deb进行安装的. 然而,在virtualbox中启动了ubunt ...

  8. [LeetCode] Word Pattern 词语模式

    Given a pattern and a string str, find if str follows the same pattern. Examples: pattern = "ab ...

  9. vue 2.0 开发实践总结之疑难篇

    续上一篇文章:vue2.0 开发实践总结之入门篇 ,如果没有看过的可以移步看一下. 本篇文章目录如下: 1.  vue 组件的说明和使用 2.  vuex在实际开发中的使用 3.  开发实践总结 1. ...

  10. 神奇的BFC以及被忽略的东西

    BFC是CSS中一个非常重要的概念,经常用来清除浮动以及处理外边距折叠,但BFC到底是个什么东西却很难准确的表达清楚,国内的相关技术文档基本都不全面,本文的目的就是对BFC的方方面面做个整理,当然未必 ...