spring04:注入依赖
学习路径 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:注入依赖相关推荐
- @javax.inject.Inject,新的注入依赖规范
这个是 Java EE 6 规范 JSR 330 – Dependency Injection for Java 中的东西,也就是 Java EE 的依赖注入. Spring自带的@Autowired ...
- mockito手动注入依赖_依赖注入–手动方式
mockito手动注入依赖 依赖注入是一种将行为与依赖解决方案分开的技术. 用简单的话来说,它使开发人员可以定义具有特定功能的类,这些功能取决于各种协作者,而不必定义如何获取对这些协作者的引用. 以此 ...
- 大数据WEB阶段Spring框架(一)IOC控制反转、DI注入依赖
Spring-IOC.DI 零.Spring简介 Spring官网:http://projects.spring.io/spring-framework Jar包的下载地址:http://repo.s ...
- 依赖注入依赖注入容器
依赖注入: 应用程序对需要使用的依赖[插件]在编译(编码)阶段仅依赖于接口的定义,到运行阶段由一个独立的组装模块(容器)完成对实现类的实例化工作,并将其[注射]到应用程序中称之为--"依赖注 ...
- 利用Unity和C#特性实现自动注入(依赖注入)
公司目前使用的依赖注入框架是Unity,所以就对这个框架进行了对应的学习,网上也有比较多的资料,不过注入方面大部分都是偏向于构造器注入.属性注入和方法注入等,好像还没有自动注入相关的文章,所以就有了本 ...
- java 注入依赖_依赖注入(Dependency Injection)
一.依赖注入的概念了解 介绍依赖注入(di),首先要先了解一个概念--即控制反转(ioc). 控制反转是面向对象编程的一种设计原则,可以用来减低计算机代码之间的耦合度.在传统的应用程序中,都是程序员手 ...
- java 抽象类 注入,依赖注入 抽象类
搜索热词 Spring配置Bean如下: txProxyTemplate 作用是继承 其他spring.xml中声明式事务的,这里关键注意的是 id ="Privilege" 和c ...
- 软件测试:sql注入·依赖基本sql语句
查询语句 目的:回顾数据库查询条件语句(手工sql注入操作基础知识) 语句: 1. 查询所有字段:select * from users; 2. 查询指定字段: select user,passwor ...
- JAVA websocket中 spring无法注入依赖问题解决
实现一个工具类 @Component public class SpringAware implements ApplicationContextAware {private static Appli ...
最新文章
- Win2008 远程时提示“要登录到此远程计算机,您必须被授予允许通过终端登录登录的权限“的解决方法
- java程序设计_JAVA基础程序设计之方法
- 基于密度的异常值检测方法整理
- mysql索引背后的数据结构_图解Mysql索引的数据结构!看不懂你来找我
- MySQL笔记-binlog理论及binlog回滚恢复数据
- 从测试流程角度,阿里P8大佬对产品质量的一些总结思考...
- python 系统编程
- windows server 2003优化设置方法
- oracle 索引-1无效,oracle 索引失效原因及解決方法
- 对二宝软件的NABCD分析
- tpadmin合成推广二维码
- FileZilla 无法连接服务器 fzSftp started, protocol_version=11
- (八)RHEL系统之红帽8操作系统基础环境配置及软件安装
- 中文代码示例视频演示Python入门教程第五章 数据结构
- 笔记本Ubuntu系统,关上盖子不休眠设置
- Go语言-数据结构-线性表
- 原生js打造自定义播放器
- python实时显示图片_任何显示来自Cam的实时图像的快速Python GUI
- GLSL着色器实现多重纹理与帧缓冲对象(FBO)
- Agora声网-Uniapp拉流(Vue拉流)
热门文章
- ikbc 104键win键失效
- 基于CIFAR100的VGG网络结构详解
- 谷歌浏览器Chrome 100即将发布,但可能无法正常使用?
- 最新QQ辅助任务平台悬赏接单源码+支持商家等功能
- linux设备模型详解
- 2念整数(5分) 题目内容: 你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。 如输入1234,则输出: yi er san si
- adb环境搭建以及使用教程
- 【Linux】进程间通讯
- biabiamiamia百度音乐网批量歌曲下载工具
- 深信服S5000-AC刷入 RouterOS 软路由 U盘PE下安装教程 (图文详解超详细)