学习路径 b站:遇见狂神说 微信公众号:狂神说

Dependency Injection

概念

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

构造器注入

见spring03

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.wang.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<String> hobbys;           //listprivate Map<String,String> card;    //mapprivate Set<String> games;             //setprivate String wife;                        //null注入private Properties info;                    //Properties 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.hobbys = 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爱好:"+hobbys);System.out.println("card:"+card);System.out.println("games:"+games);System.out.println("wife:"+wife);System.out.println("info:"+info);}}

1、常量注入

 <bean id="student" class="com.kuang.pojo.Student"><property name="name" value="小明"/></bean>

测试:

 @Testpublic void test01(){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Student student = (Student) context.getBean("student");System.out.println(student.getName());}

2、Bean注入

注意点:这里的值是一个引用,ref

 <bean id="addr" class="com.kuang.pojo.Address"><property name="address" value="北京西路"/></bean><bean id="student" class="com.kuang.pojo.Student"><property name="name" value="小明"/><property name="address" ref="addr"/></bean>

3、数组注入

 <bean id="student" class="com.kuang.pojo.Student"><property name="name" value="小明"/><property name="address" ref="addr"/><property name="books"><array><value>活着</value><value>骆驼祥子</value></array></property></bean>

4、List注入

     <property name="hobbys"><list><value>唱歌</value><value>跳舞</value><value>睡觉</value></list></property>

5、Map注入

         <property name="card"><map><entry key="学号" value="123123"/><entry key="身份证号" value="131312345435346"/></map></property>

6、set注入

         <property name="games"><set><value>lol</value><value>wzry</value><value>ckxt</value></set></property>

7、Null注入

 <property name="wife"><null/></property>

8、Properties注入

 <property name="info"><props><prop key="学号">20190604</prop><prop key="性别">男</prop><prop key="姓名">小明</prop></props></property>

测试:

 @Testpublic void myTest(){ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");Student student = (Student) context.getBean("student");student.show();}

测试结果:

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命名方式注入

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

 导入约束 : xmlns:p="http://www.springframework.org/schema/p"<!--P(属性: properties)命名空间 , 属性依然要设置set方法-->
<bean id="user" class="com.wang.pojo.User" p:name="小明" p:age="14"/>

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

 导入约束 : xmlns:c="http://www.springframework.org/schema/c"<!--C(构造: Constructor)命名空间 , 属性依然要设置set方法--><bean id="user2" class="com.wang.pojo.User" c:_0="王" c:_1="14"/>

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

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

测试代码:

 @Testpublic void test02(){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");User user = (User) context.getBean("user");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">

测试:

 @Testpublic void test03(){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");User user = (User) context.getBean("user");User user2 = (User) context.getBean("user");System.out.println(user==user2);}

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也会被废弃掉。

spring04:注入依赖相关推荐

  1. @javax.inject.Inject,新的注入依赖规范

    这个是 Java EE 6 规范 JSR 330 – Dependency Injection for Java 中的东西,也就是 Java EE 的依赖注入. Spring自带的@Autowired ...

  2. mockito手动注入依赖_依赖注入–手动方式

    mockito手动注入依赖 依赖注入是一种将行为与依赖解决方案分开的技术. 用简单的话来说,它使开发人员可以定义具有特定功能的类,这些功能取决于各种协作者,而不必定义如何获取对这些协作者的引用. 以此 ...

  3. 大数据WEB阶段Spring框架(一)IOC控制反转、DI注入依赖

    Spring-IOC.DI 零.Spring简介 Spring官网:http://projects.spring.io/spring-framework Jar包的下载地址:http://repo.s ...

  4. 依赖注入依赖注入容器

    依赖注入: 应用程序对需要使用的依赖[插件]在编译(编码)阶段仅依赖于接口的定义,到运行阶段由一个独立的组装模块(容器)完成对实现类的实例化工作,并将其[注射]到应用程序中称之为--"依赖注 ...

  5. 利用Unity和C#特性实现自动注入(依赖注入)

    公司目前使用的依赖注入框架是Unity,所以就对这个框架进行了对应的学习,网上也有比较多的资料,不过注入方面大部分都是偏向于构造器注入.属性注入和方法注入等,好像还没有自动注入相关的文章,所以就有了本 ...

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

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

  7. java 抽象类 注入,依赖注入 抽象类

    搜索热词 Spring配置Bean如下: txProxyTemplate 作用是继承 其他spring.xml中声明式事务的,这里关键注意的是 id ="Privilege" 和c ...

  8. 软件测试:sql注入·依赖基本sql语句

    查询语句 目的:回顾数据库查询条件语句(手工sql注入操作基础知识) 语句: 1. 查询所有字段:select * from users; 2. 查询指定字段: select user,passwor ...

  9. JAVA websocket中 spring无法注入依赖问题解决

    实现一个工具类 @Component public class SpringAware implements ApplicationContextAware {private static Appli ...

最新文章

  1. Win2008 远程时提示“要登录到此远程计算机,您必须被授予允许通过终端登录登录的权限“的解决方法
  2. java程序设计_JAVA基础程序设计之方法
  3. 基于密度的异常值检测方法整理
  4. mysql索引背后的数据结构_图解Mysql索引的数据结构!看不懂你来找我
  5. MySQL笔记-binlog理论及binlog回滚恢复数据
  6. 从测试流程角度,阿里P8大佬对产品质量的一些总结思考...
  7. python 系统编程
  8. windows server 2003优化设置方法
  9. oracle 索引-1无效,oracle 索引失效原因及解決方法
  10. 对二宝软件的NABCD分析
  11. tpadmin合成推广二维码
  12. FileZilla 无法连接服务器 fzSftp started, protocol_version=11
  13. (八)RHEL系统之红帽8操作系统基础环境配置及软件安装
  14. 中文代码示例视频演示Python入门教程第五章 数据结构
  15. 笔记本Ubuntu系统,关上盖子不休眠设置
  16. Go语言-数据结构-线性表
  17. 原生js打造自定义播放器
  18. python实时显示图片_任何显示来自Cam的实时图像的快速Python GUI
  19. GLSL着色器实现多重纹理与帧缓冲对象(FBO)
  20. Agora声网-Uniapp拉流(Vue拉流)

热门文章

  1. ikbc 104键win键失效
  2. 基于CIFAR100的VGG网络结构详解
  3. 谷歌浏览器Chrome 100即将发布,但可能无法正常使用?
  4. 最新QQ辅助任务平台悬赏接单源码+支持商家等功能
  5. linux设备模型详解
  6. 2念整数(5分) 题目内容: 你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。 如输入1234,则输出: yi er san si
  7. adb环境搭建以及使用教程
  8. 【Linux】进程间通讯
  9. biabiamiamia百度音乐网批量歌曲下载工具
  10. 深信服S5000-AC刷入 RouterOS 软路由 U盘PE下安装教程 (图文详解超详细)