6、依赖注入

概念

  • 依赖注入(Dependency Injection,DI)。
  • 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 .
  • 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 .

构造器注入

之前已经讲过

Set 注入 (重点)

要求被注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is .

测试pojo类 :

Address.java

package com.kuber.pojo;public class Address {private String homeAddress;public String getHomeAddress() {return homeAddress;}public void setHomeAddress(String homeAddress) {this.homeAddress = homeAddress;}@Overridepublic String toString() {return "Address{" +"homeAddress='" + homeAddress + '\'' +'}';}
}

Student.java:

package com.kuber.pojo;import java.util.*;public class Student {private String name;private Address address;private String[] books;private List<String> hobbies;private Map<String,String> card;private Set<String> games;private String girlfriend;private Properties info;public String getGirlfriend() {return girlfriend;}public void setGirlfriend(String girlfriend) {this.girlfriend = girlfriend;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public String[] getBooks() {return books;}public void setBooks(String[] books) {this.books = books;}public List<String> getHobbies() {return hobbies;}public void setHobbies(List<String> hobbies) {this.hobbies = hobbies;}public Map<String, String> getCard() {return card;}public void setCard(Map<String, String> card) {this.card = card;}public Set<String> getGames() {return games;}public void setGames(Set<String> games) {this.games = games;}public Properties getInfo() {return info;}public void setInfo(Properties info) {this.info = info;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", address=" + address.toString() +", books=" + Arrays.toString(books) +", hobbies=" + hobbies +", card=" + card +", games=" + games +", info=" + info +'}';}
}

student各种属性注入beans.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:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><import resource="userbeans.xml"/><import resource="employee-beans.xml"/><bean id="address" class="com.kuber.pojo.Address"><property name="homeAddress" value="河南"/></bean><!--Bean注入,注意点:这里的值是一个引用,ref--><bean id="student" class="com.kuber.pojo.Student"><property name="name" value="倪文翰"/><property name="address" ref="address"/><property name="books"><array><value>红楼梦</value><value>三国演义</value><value>水浒传</value><value>西游记</value></array></property><property name="hobbies"><list><value>敲代码</value><value>看书</value><value>打游戏</value></list></property><property name="card"><map><entry key="身份证" value="46541651"/><entry key="学生证" value="201619823"/></map></property><property name="games"><set><value>GTA5</value><value>LOL</value><value>CS:GO</value></set></property><property name="girlfriend" value="gyy"/><property name="info"><props><prop key="username">root</prop><prop key="password">root</prop><prop key="driver">dddd</prop><prop key="url">aqwer</prop></props></property></bean>
</beans>

测试代码:

@Test
public void test1(){ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");Student student = (Student) context.getBean("student");System.out.println(student);/*Student{name='倪文翰',address=Address{homeAddress='河南'},books=[红楼梦, 三国演义, 水浒传, 西游记],hobbies=[敲代码, 看书, 打游戏],card={身份证=46541651, 学生证=201619823},games=[GTA5, LOL, CS:GO],info={password=root, url=aqwer, driver=dddd, username=root}}*/
}

测试结果:

p命名和c命名注入

User.java :【注意:这里没有有参构造器!】

 public class User {private String name;private int age;public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}}

p命名空间注入 : 需要在头文件中加入约束文件

c 命名空间注入 : 需要在头文件中加入约束文件

<?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"xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="user" class="com.kuber.pojo.User" p:username="工藤静香" p:age="20"/><bean id="user2" class="com.kuber.pojo.User" c:username="工藤胖虎" c:age="40" scope="singleton"/><!--默认单例模式,scope=singleton""-->
</beans>

发现问题:爆红了,刚才我们没有写有参构造!

解决:把有参构造器加上,这里也能知道,c 就是所谓的构造器注入!

测试代码:

@Test
public void test2(){ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");User user = context.getBean("user", User.class);System.out.println(user);
}

[

Bean的作用域

在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象.

几种作用域中,request、session作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。

  • Singleton

    当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置:

     <bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" scope="singleton">
    
  • Prototype

    当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype,可以这样配置:

     <bean id="account" class="com.foo.DefaultAccount" scope="prototype"/>  或者<bean id="account" class="com.foo.DefaultAccount" singleton="false"/>
    
  • Request

    当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

     <bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>
    

    针对每次HTTP请求,Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。

  • Session

    当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

     <bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
    

    针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

【5】依赖注入DI(Dependency Injection)相关推荐

  1. java 注入依赖_依赖注入(Dependency Injection)

    一.依赖注入的概念了解 介绍依赖注入(di),首先要先了解一个概念--即控制反转(ioc). 控制反转是面向对象编程的一种设计原则,可以用来减低计算机代码之间的耦合度.在传统的应用程序中,都是程序员手 ...

  2. 一文读懂Asp.net core 依赖注入(Dependency injection)

    一.什么是依赖注入 首先在Asp.net core中是支持依赖注入软件设计模式,或者说依赖注入是asp.net core的核心: 依赖注入(DI)和控制反转(IOC)基本是一个意思,因为说起来谁都离不 ...

  3. 依赖倒置(DIP),控制反转(IoC)与依赖注入(DI)

    DIP,IoC与DI概念解析 依赖倒置 DIP(Dependency Inversion Principle) DIP的两大原则: 1.高层模块不应该依赖于低层模块,二者都应该依赖于抽象. 2.抽象不 ...

  4. 依赖注入(DI)和Ninject,Ninject

    我们所需要的是,在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用.这种"需要",就称为DI(依赖注入,Dependency Injection),和所谓的 ...

  5. 控制反转IOC与依赖注入DI

    为什么80%的码农都做不了架构师?>>>    1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最 ...

  6. 依赖注入(di)模式_Java依赖注入– DI设计模式示例教程

    依赖注入(di)模式 Java Dependency Injection design pattern allows us to remove the hard-coded dependencies ...

  7. [教程]控制反转(IoC)与依赖注入(DI)

    来源: http://zhangjunhd.blog.51cto.com/113473/126530/ 挺简单的,说的也很清楚 ※IoC/DI 依赖Java的反射机制 1.控制反转(Inversion ...

  8. 控制反转(IOC) 和依赖注入(DI) 的理解

    1.      IOC(控制反转) inverseof control是spring容器的内核,AOP.声明事务等功能在此基础上开花结果. 2.      通过实例理解IOC概念: 实例:<墨攻 ...

  9. 控制反转(IoC)与依赖注入(DI)详解

    文章目录 什么是控制反转(IoC) 控制反转(IoC)有什么作用 控制反转(IoC)是怎么分类的 依赖注入 接口注入 Setter方法注入 构造器注入 依赖查找 上下文依赖查找(Contextuali ...

最新文章

  1. 医疗卫生信息化 医学信息 医院管理 医疗信息化 资源下载
  2. CCNA-第十篇-VLAN-下
  3. linux生产环境下安装anaconda总结
  4. C语言之字符串探究(九):空格去除——trim系列
  5. 爬虫-request和BeautifulSoup模块
  6. WindowsServers2019上手体验
  7. www.biubiujie.com BiuBiu街-要Beautiful的女孩纸逛的街
  8. 笔记本电脑自带键盘禁用与恢复
  9. 高跟鞋,五角星与黄金分割比
  10. 优酷中转码是什么意思
  11. 使用LSV制作KML文件教程
  12. 一文打通ER图(手把手教你画)
  13. element ui背景图_vue+element-ui如何为元素设置背景图片
  14. List,Set,Map集合总结
  15. 极地漩涡袭美中西部致多人死 芝加哥六成航班取消
  16. C语言函数,与网站推荐,学习推荐。
  17. ctf.show web2 最简单的SQL注入
  18. csv与json互转_JSON与CSV相互转换
  19. Java: 根据网易云音乐URL下载歌曲、歌词、专辑封面和MV
  20. SpringBoot undertow accesslog格式

热门文章

  1. iphone html 手机震动,​苹果手机震动器在哪里?如何设置与关闭?
  2. 生成网站与发布网站的区别
  3. SimpleDateFormat的概述
  4. Calendar的基本使用和属性说明
  5. Java工程师的工资待遇如何?
  6. 计算机退休工资排名,广州2017退休工资计算器的介绍_广州2017养老金计算方法
  7. predict函数 R_超星尔雅-R语言学习总结(上)
  8. 【GANs学习笔记】(一)初步了解GANs
  9. CGLIB介绍与原理
  10. Locale 和 LanguageTag