文章目录

  • 1. 概念
  • 2. 构造器注入
  • 3. Set注入
    • 3.1 环境搭建
    • 3.2 注入方式
  • 4. p命名和c命名注入
  • 5. Bean的作用域
    • 5.1 singleton
    • 5.2 prototype
    • 5.3 其他作用域

1. 概念

  • 依赖注入(Dependency Injection,DI)。

  • 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 .

  • 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 .

2. 构造器注入

上篇博客https://blog.csdn.net/qq_43601784/article/details/107301938中

3. Set注入

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

3.1 环境搭建

Address实体类

public class Address {private String address;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

Student实体类

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 wife;private Properties info;public String getName() {return name;}public Address getAddress() {return address;}public String[] getBooks() {return books;}public List<String> getHobbies() {return hobbies;}public Map<String, String> getCard() {return card;}public Set<String> getGames() {return games;}public String getWife() {return wife;}public Properties getInfo() {return info;}public void setName(String name) {this.name = name;}public void setAddress(Address address) {this.address = address;}public void setBooks(String[] books) {this.books = books;}public void setHobbys(List<String> hobbys) {this.hobbies = hobbys;}public void setCard(Map<String, String> card) {this.card = card;}public void setGames(Set<String> games) {this.games = games;}public void setWife(String wife) {this.wife = wife;}public void setInfo(Properties info) {this.info = info;}public void show(){System.out.println("name="+ name+ ",address="+ address.getAddress()+ ",books=");for (String book:books){System.out.print("<<"+book+">>\t");}System.out.println("\n爱好:"+hobbies);System.out.println("card:"+card);System.out.println("games:"+games);System.out.println("wife:"+wife);System.out.println("info:"+info);}
}

3.2 注入方式

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="address" class="com.zh.pojo.Address"><property name="address" value="皮尔特沃夫"/></bean><bean id="student" class="com.zh.pojo.Student"><!--常量注入--><property name="name" value="伊泽瑞尔"/><!--bean注入--><property name="address" ref="address"/><!--数组注入--><property name="books"><array><value>西游记</value><value>红楼梦</value><value>三国演义</value><value>水浒传</value></array></property><!--List注入--><property name="hobbys"><list><value>动漫</value><value>游戏</value></list></property><!--map注入--><property name="card"><map><entry key="身份证" value="123456"/><entry key="银行卡" value="1234564"/></map></property><!--Set注入--><property name="games"><set><value>LOL</value><value>DNF</value></set></property><!--NULL注入--><property name="wife"><null/></property><!--properties注入--><property name="info"><props><prop key="学号">13245</prop><prop key="性别">男</prop><prop key="姓名">伊泽瑞尔</prop></props></property></bean>
</beans>

测试

public class MyTest {@Testpublic void test1(){ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");Student student = (Student) context.getBean("student");student.show();}
}

4. p命名和c命名注入

p命名和c命名注入 分别对应set注入和构造器注入

测试类user

public class User {private String name;private int age;public User() {}public User(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}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;}
}

beans设置

 <!--P(属性: properties)命名空间 , 属性依然要设置set方法--><bean id="user1" class="com.zh.pojo.User" p:name="伊泽瑞尔" p:age="18" /><!--C(构造: Constructor)命名空间 , 属性依然要设置set方法--><bean id="user2" class="com.zh.pojo.User" c:name="金克斯" c:age="18"/>

注意!
p和c注入不能直接使用,必须导入对应约束

 xmlns:p="http://www.springframework.org/schema/p"xmlns:c="http://www.springframework.org/schema/c"

测试:

    @Testpublic void test2(){ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");User user1 = context.getBean("user1", User.class);User user2 = context.getBean("user2", User.class);System.out.println("user1:"+user1);System.out.println("user2:"+user2);}

5. Bean的作用域

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

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

5.1 singleton

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

 <bean id="user1" class="com.zh.pojo.User" p:name="伊泽瑞尔" p:age="18" scope="singleton "/>

5.2 prototype

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

        <bean id="user1" class="com.zh.pojo.User" p:name="伊泽瑞尔" p:age="18" scope="prototype"/>

5.3 其他作用域

其他仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。

(Spring)依赖注入相关推荐

  1. arg是什么函数_java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪...

    前言 前两天和一个同学吃饭的时候同学跟我说了一件事,说他公司有个做了两年的人向他提出要涨薪资,他就顺口问了一个问题关于spring依赖注入的,那个要求涨薪的同学居然被问懵了...事后回家想了想这一块确 ...

  2. Java程序员进阶——Spring依赖注入原理分析

    Spring依赖注入原理分析 下面谈谈Spring是如何实现反转模式IOC或依赖注入模式DI: 平时,我们需要生成一个对象,使用new语法,如一个类为A public class A{public v ...

  3. spring 依赖注入

    Technorati 标记: spring,依赖注入,DI,ioc 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的 ...

  4. java接口注入对象的意义_Java Web系列:Spring依赖注入基础

    一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...

  5. spring依赖注入原理(转载)

    关于spring依赖注入原理的文章在网络上已经有很多,我要写的这篇文章原文出自http://taeky.iteye.com/blog/563450,只所以再一次写下来只是为了一为自己收藏,方便以后的复 ...

  6. Spring依赖注入:注解注入总结

    更多11 spring 依赖注入 注解 java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.C ...

  7. spring依赖注入_Spring源码阅读:Spring依赖注入容器

    依赖注入 依赖注入是Spring框架最核心的能力,Spring框架提供的AOP,WebMVC等其它功能都是以依赖注入容器作为基础构建的,Spring依赖注入容器类似于一个用于组装对象的框架内核,任何应 ...

  8. diy实现spring依赖注入

    [README] 本文diy代码实现了 spring 依赖注入,一定程度上揭示了依赖注入原理: [1]控制反转-Inversion of Control 是一种编码思想,简而言之就是 应用程序A可以使 ...

  9. spring依赖注入_Spring依赖注入

    spring依赖注入 介绍: 在设计良好的Java应用程序中,这些类应尽可能独立. 这样的设计提高了组件的可重用性. 它还使对各个组件进行单元测试变得更加容易. 依赖注入的概念促进了Java对象之间的 ...

  10. spring依赖注入_Spring的依赖注入陷阱

    spring依赖注入 Spring框架中有三种注入变量: 基于二传手的注射 基于构造函数的注入 基于现场的注入 这些机制中的每一种都有优点和缺点,并且不仅只有一种正确的方法. 例如现场注入: @Aut ...

最新文章

  1. Python量化(八)下影线选股法
  2. Java Web学习(三)数据加密方式详解
  3. css实现垂直居中(+水平居中)
  4. Why Ceph and how to use Ceph?
  5. 网络工程 IP地址与子网掩码
  6. 12.性能之巅 洞悉系统、企业与云计算 --- 基准测试
  7. C++11 实现defer功能(转载)
  8. Hibernate一对多双向关联
  9. ERP物料信息编码体系的研究与实践
  10. 微信公众号运营推广方案分享
  11. 特殊字符--百度百科
  12. python卷积神经网络训练,python卷积神经网络图像
  13. 我的世界服务器空岛删除怎么找回,我的世界-删除空岛指令 岛屿删除指令分享...
  14. mysql根据出生日期计算年龄并查询
  15. VS连接数据库运行后显示对象名无效
  16. Windows Server 2012 R2 更改系统语言
  17. 腾讯云服务器8核16G18M配置测评
  18. 使用大神U盘工具安装原版系统的操作方法
  19. 嵌入式在各个行业的应用
  20. 哈工大软件过程与工具复习1——第1-2讲 概论与核心思想

热门文章

  1. (chap2 TCP/IP基础知识) TCP/IP分层模型的通信流程
  2. CSS之关系选择器、属性选择器、伪类选择器
  3. OpenGL 坐标系统(Perspective)
  4. 【CTF大赛】第五届XMan选拔赛 ezCM Writeup
  5. Windows保护模式学习笔记(三)—— 长调用/短调用/调用门
  6. 9、 InnoDB行锁
  7. 1.22 实例:Java输出杨辉三角形(使用二维数组)
  8. 数据库的UNDO和REDO
  9. Pycharm解决中文字体大小不一致问题
  10. JVM新生代老年代GC分析