Spring特性--DI

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.

时间: 2024-10-17 12:01:37

Spring特性--DI的相关文章

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

Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应用一般不依赖于spring的类. 容器:Spring是个容器,因为它包含并且管理应用对象的生命周期和配置.如对象的创建.销毁.回调等. 框架:Spring作为一个框架,提供了一些基础功能,(如事务管理,持久层集成等),使开发人员更专注于开发应用逻辑. Spring的优点1.降低了组件之间的耦合性 ,

Spring -- IOC/DI 基础概念的理解

Spring -- IOC/DI 基础概念 思维导图: ------------------------------------------------------- IoC/DI 的基本概念 IoC是什么 ? IoC -- Inversion of control, 控制反转   在Java开发中,IoC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则. 理解IoC的关键是明

[Spring系列01]Spring IOC/DI模拟

本文以一个简单的实例大致模拟Spring IOC/DI的运行原理,代码简单分dao,model,service三层.即:dao 与数据库的操作,增删改查等方法model 一般都是javabean对象,例如与数据库的某个表相关联.service 供外部调用,等于对dao,model等进行了包装. 程序结构图如下: 先粘贴部分代码,再进行解释: UserDAO.java package com.ctsh.dao; import com.ctsh.model.User; public interfac

Spring IOC/DI/注解

一.定义:Spring 是一个开源的控制反转(Inversion of Control,IoC/DI)和面向切面(AOP)的容器框架,它的主要目的是简化企业开发 二.实例化Spring容器: 方法一:在类路径下寻找配置文件来实例化容器 1 ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"beans.xml"}); 方法二:在文件系统路径下寻找配置文件来实例化容器 1 Applicatio

Spring IoC/DI

前言 假设项目层次划分包括logic层和dao层,logic层调用dao层完成业务逻辑,dao层一般与数据库交互.定义两个组件,TestLogic和TestDao,分别操作接口ILogic和IDao,这样程序开发时需要考虑怎样管理这两个组件. 传统方式 这种方式中,当TestLogic组件需要调用TestDao组件时,直接使用关键字new IDao testDao = new TestDao(); 这种方式简单直观,但造成了对外部组件的严重依赖,程序高度耦合,效率低下.当项目需要更换组件时需要修

Spring中di配合接口编程

一:DI基本概念 依赖注入(DI),是spring容器实现的基础,在spring-core模块中实现的.所谓DI,就是指对象是被动接受依赖类而不是自己主动去找,换句话说就是指对象不是从容器中查找它依赖的类,而是在容器实例化对象的时候主动将它依赖的类注入给它. DI作用: di配合接口编程,的确可以减少层(web层) 和 业务层的耦合度. 二:DI配合接口编程案例 1.项目截图 2.基本代码 package com.cloud.inter; public interfaceChangeLetter

spring 之 DI

1. DI:dependency injection:依赖注入.依赖注入和IOC是一件事不同的说法,对象的创建是依赖于容器的,对象属性的设置也是依赖于容器的.程序中被动接收对象,对象的属性值也是被动设置的.这个过程在spring称为注入.所以IOC又叫依赖注入(有容器来创建和管理对象). 2.DI 和 IOC的区别: DI (依赖注入) 更侧重于过程, 把对象通过setter.contruct.args等方式 注入到另一个对象中作为这个对象的一个成员变量(也可能是其他):IOC(控制反转): 侧

spring ioc DI 理解

下面是我从网上找来的一些大牛对spring ioc和DI的理解,希望也能让你对Spring ioc和DI的设计思想有更进一步的认识. 一.分享Iteye的开涛对Ioc的精彩讲解 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们

spring IOC(DI)实验

软件151  张鑫栋 一.IOC的意思是控件反转也就是由容器控制程序之间的关系,把控件权交给了外部容器,之前的写法,由程序代码直接操控,而现在控制权由应用代码中转到了外部容器,控制权的转移是所谓反转.DI(Dependency Injection,依赖注入).IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI(Dependency Injection,依赖注入)来实现的. IOC实现的原理: 定义DAO接口和接口的实现类 package com.dao; p