热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

3、javaSpring依赖注入(DI)

依赖注入(DI)DependencyInjection概念依赖注入(DependencyInjection,DI)。依赖:指

依赖注入(DI)   Dependency Injection

概念


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

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

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


构造器注入

我们在之前的案例已经讲过了

Set 注入 (重点)

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

测试pojo类 :

Address.java

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

Student.java

 package com.kuang.pojo;import java.util.List;import java.util.Map;import java.util.Properties;import java.util.Set;public class Student {private String name;private Address address;private String[] books;private List hobbys;private Map card;private Set games;private String wife;private Properties info;public void setName(String name) {this.name &#61; name;}public void setAddress(Address address) {this.address &#61; address;}public void setBooks(String[] books) {this.books &#61; books;}public void setHobbys(List hobbys) {this.hobbys &#61; hobbys;}public void setCard(Map card) {this.card &#61; card;}public void setGames(Set games) {this.games &#61; games;}public void setWife(String wife) {this.wife &#61; wife;}public void setInfo(Properties info) {this.info &#61; info;}public void show(){System.out.println("name&#61;"&#43; name&#43; ",address&#61;"&#43; address.getAddress()&#43; ",books&#61;");for (String book:books){System.out.print("<<"&#43;book&#43;">>\t");}System.out.println("\n爱好:"&#43;hobbys);System.out.println("card:"&#43;card);System.out.println("games:"&#43;games);System.out.println("wife:"&#43;wife);System.out.println("info:"&#43;info);}}

1、常量注入

 

测试&#xff1a;

 &#64;Testpublic void test01(){ApplicationContext context &#61; new ClassPathXmlApplicationContext("applicationContext.xml");Student student &#61; (Student) context.getBean("student");System.out.println(student.getName());}

2、Bean注入

注意点&#xff1a;这里的值是一个引用&#xff0c;ref

 

3、数组注入

 西游记红楼梦水浒传

4、List注入

 听歌看电影爬山

5、Map注入

 

6、set注入

 LOLBOBCOC

7、Null注入

 

8、Properties注入

 20190604小明

测试结果&#xff1a;

图片

p命名和c命名注入

User.java &#xff1a;【注意&#xff1a;这里没有有参构造器&#xff01;】

 public class User {private String name;private int age;public void setName(String name) {this.name &#61; name;}public void setAge(int age) {this.age &#61; age;}&#64;Overridepublic String toString() {return "User{" &#43;"name&#61;&#39;" &#43; name &#43; &#39;\&#39;&#39; &#43;", age&#61;" &#43; age &#43;&#39;}&#39;;}}

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

 导入约束 : xmlns:p&#61;"http://www.springframework.org/schema/p"

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

 导入约束 : xmlns:c&#61;"http://www.springframework.org/schema/c"

发现问题&#xff1a;爆红了&#xff0c;刚才我们没有写有参构造&#xff01;

解决&#xff1a;把有参构造器加上&#xff0c;这里也能知道&#xff0c;c 就是所谓的构造器注入&#xff01;

测试代码&#xff1a;

 &#64;Testpublic void test02(){ApplicationContext context &#61; new ClassPathXmlApplicationContext("applicationContext.xml");User user &#61; (User) context.getBean("user");System.out.println(user);}

Bean的作用域

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

图片

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

Singleton&#xff08;默认随机&#xff0c;单例模式&#xff09;

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

 

测试&#xff1a;

 &#64;Testpublic void test03(){ApplicationContext context &#61; new ClassPathXmlApplicationContext("applicationContext.xml");User user &#61; (User) context.getBean("user");User user2 &#61; (User) context.getBean("user");System.out.println(user&#61;&#61;user2);}

Prototype 原型模式 每次从容器中get的时候&#xff0c;都会产生一个新对象。

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

   或者

Request

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

 

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

Session

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

 

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


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
author-avatar
永恒多一天_313
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有