spring的依赖注入的四种方式,数组与集合注入;引用注入;内部bean注入
三种注入方式
第一种: 基于构造函数
hi.java (bean)
package test_one; public class hi {
private String name;
public hi(String name) {
this.name=name;
}
public void sayhi() {
System.out.println("你好呀 "+this.name);
} }
<bean id="binbin" class="test_one.hi" scope="singleton">
<constructor-arg name="name" value="斌斌"/>
</bean>
上面是通过配置文件注入字符串
我们来看看如何注入bean
<bean id="binbin" class="test_one.hi" scope="singleton">
<constructor-arg ref="No"/>
</bean>
<bean id="No" class="test_one.no"></bean>
<!--通过构造函数,将id="No"的bean 注入到 hi 中
总结:
constructor-arg 元素表示通过构造函数注入
属性: index: 对应构造函数参数列表的位置
type:对应构造函数列表里的的数据类型
name:对应在构造函数列表里的变量名
value: 赋值
ref:对应bean类型的id名
一般都是通过name="" value="" 去注入
而注入bean只要 ref="id名"
其他用法:
<constructor-arg type="java.lang.String" value="45"/>
<constructor-arg index="0" value="20"/>
值得注意的是通过参数名称来匹配的方法,代码必须启用了调试标记编译,这样spring才可以从构造函数中查找参数名称
开发者也可以使用@ConstructorProperties注解来显式声明构造函数的名称
public class ExampleBean{
/***省略字段**/
@ConstructorProperties({"years","ultimateAnswer"})
public ExampleBean(int years,String ultimateAnswer){
this.years=years;
this.ultimateAnswer=ultimateAnswer;
}
}
注意: spring的便利之处就是,将value属性的字符串类型自动转换为指定类型
第二种: 基于set方法
hi.java (bean)
package test_one; public class hi {
private String name;
private int age;
private no a;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setA(no a) {
this.a = a;
} public void print() {
System.out.print(name+" "+age+" "+a);
}
}
<bean id="binbin" class="test_one.hi" scope="singleton">
<property name="name" value="斌斌"/>
<property name="age" value="17"/>
<property name="a" ref="No"/>
</bean>
<bean id="No" class="test_one.no"></bean>
总结:
property 表示基于set方法注入
属性: name: 对应变量名匹配
ref: 如果注入的是bean,对应bean的id名
value: 赋值,spring会自动将字符串类型转换为对应类型
注意:如果注入的是bean,那么对于property来说就要加上name
<property name="a" ref="No"/>
第三种: 使用p命名空间注入
本质还是基于set注入,不过xml的配置更加简单,主要一个命名空间就可以对所有的bean赋值,不用多余的嵌套property
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--使用无参构造函数实例化,使用p命令空间注入-->
<bean id="binbin" class="test_one.hi" scope="singleton" p:name="斌斌" p:age="17" p:a-ref="No"></bean>
<bean id="No" class="test_one.no" p:name="明明"></bean>
第四种:使用c命名空间注入
与p命名空间注入一样,不过是基于构造函数注入
xmlns:c="http://www.springframework.org/schema/c"
<bean id="C" class="test_one.c_name" c:name="i'm c"/>
如果注入的是数组,List , Set , map, Properties
hi.java (bean)
package test_one; import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set; public class hi {
private String[] myStrs;
private List<String> myList;
private Set<Integer> mySet;
private Map<String,String> myMap;
private Properties myProps; public void setMyStrs(String[] myStrs) {
this.myStrs = myStrs;
}
public void setMyList(List<String> myList) {
this.myList = myList;
}
public void setMySet(Set<Integer> mySet) {
this.mySet = mySet;
}
public void setMyMap(Map<String, String> myMap) {
this.myMap = myMap;
}
public void setMyProps(Properties myProps) {
this.myProps = myProps;
} public String[] getMyStrs() {
return myStrs;
}
public List<String> getMyList() {
return myList;
}
public Set<Integer> getMySet() {
return mySet;
}
public Map<String, String> getMyMap() {
return myMap;
}
public Properties getMyProps() {
return myProps;
} public void print() {
System.out.println("array:"+myStrs[0]+" "+myStrs[1]+"\nList:"+myList+"\nSet:"+mySet+"\nMap:"+myMap+"\nProperties:"+myProps);
} }
<!--使用无参构造函数实例化-->
<bean id="binbin" class="test_one.hi" scope="singleton">
<!--给数组注入数据-->
<property name="myStrs">
<array>
<value>array_one</value>
<value>array_two</value>
</array>
</property>
<!--给List注入数据-->
<property name="myList">
<array>
<value>List_one</value>
<value>List_two</value>
</array>
</property>
<!--给set集合注入数据-->
<property name="mySet">
<list>
<value>1314</value>
<value>520</value>
</list>
</property>
<!--注入map数据-->
<property name="myMap">
<props>
<prop key="testA">map_one</prop>
<prop key="testB">map_two</prop>
</props>
</property>
<!--注入Properties数据-->
<property name="myProps">
<map>
<entry key="testA" value="properties_one"/>
<entry key="testB">
<value>properties_two</value>
</entry>
</map>
</property>
</bean>
可以发现我将array, list,set 的元素混用了,将map和props混用了
也就是说 array,list ,set之间可以混用,map与props之间可以混用。 不过在实际开发时还是元素和数据类型对应使用
如果集合的数据类型是其他类型,在配置文件中,会自动将value的值转化为对应类型
注入Properties数据的另一种方式,更加简便
key=value 的写法
<!--注入Properties数据-->
<property name="myProps">
<value>
testA=Properties_one
testB=Properties_two
</value>
</property>
引用bean注入
参考:https://www.cnblogs.com/CloudComputing-binbin/p/15939822.html
内部bean注入
内部bean也称为内部匿名bean, 如果需要注入bean并且只用于一个特定的属性,建议使用内部bean
内部bean无法被外部bean引用,哪怕你加上id,她会无视scope标签
<bean id="binbin" class="test_one.hi" scope="singleton">
<!--给数组注入数据-->
<property name="myStrs">
<array>
<bean class="test_one.no" parent="parent"/>
</array>
</property>
</bean>
那个内部bean是通过抽象bean注入的,想了解抽象bean请参考:三种实例化bean以及非实例化抽象bean
Null以及空字符的值
<bean class="ExampleBean">
<property name="email" value=""/>
</bean>
什么示例与下列java代码效果一样
ExampleBean.setEmail("");
<null/>元素表示null(空指针)
<bean class="ExampleBean">
<property name="email">
<null/>
</property>
</bean>
与下面的java代码效果一样
ExampleBean.setEmail(null);
spring的依赖注入的四种方式,数组与集合注入;引用注入;内部bean注入的更多相关文章
- Android 查看项目依赖树的四种方式
Android 查看项目依赖树的四种方式: 方式一: ./gradlew 模块名:dependencies //查看单独模块的依赖 ./gradlew :app:dependencies --conf ...
- Spring中依赖注入的四种方式
在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入 这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...
- Spring通过构造方法注入的四种方式
通过构造方法注入,就相当于给构造方法的参数传值 set注入的缺点是无法清晰表达哪些属性是必须的,哪些是可选 的,构造注入的优势是通过构造强制依赖关系,不可能实例化不 完全的或无法使用的bean. Me ...
- spring注入的四种方式
配置文件spring.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...
- 【websocket】spring boot 集成 websocket 的四种方式
集成 websocket 的四种方案 1. 原生注解 pom.xml <dependency> <groupId>org.springframework.boot</gr ...
- Spring依赖注入的四种方式
首先,我们需要定义一个Bean的class类: package framework.spring; import org.springframework.beans.BeansException; i ...
- 六 Spring属性注入的四种方式:set方法、构造方法、P名称空间、SPEL表达式
Spring的属性注入: 构造方法的属性注入 set方法的属性注入
- Spring中配置数据源的四种方式
1.spring自带的数据源 <bean id="dataSource" class="org.springframework.jdbc.datasource.Dr ...
- R3注入的四种方式
DLL注入 1.首先要获取想要注入的进程句柄(OpenProcess) 2.从要注入的进程的地址空间中分配一段内存(VirtualAllocEx) 3.往分配的内存位置写入要注入的DLL名称(Writ ...
随机推荐
- gin中的重定向
package main import ( "github.com/gin-gonic/gin" ) func main() { // HTTP重定向很容易,内部.外部重定向均支持 ...
- python列表增加,修改,插入
- Android开发-资源导入
安卓开发首先要导入开发资源,这些资源包括图片,图标等,方便开发过程中的使用 我是跟着b站博主做的记账本app所以导入的资源也来自于网络 将资源导入到res文件夹下这里面包括颜色资源,布局资源,图片资源 ...
- Hbase 项目
需求分析 1) 微博内容的浏览,数据库表设计 2) 用户社交体现:关注用户,取关用户 3) 拉取关注的人的微博内容 表结构 代码实现 1) 创建命名空间以及表名的定义 2) 创建微博内容表 3) 创 ...
- ApacheCN 人工智能知识树 v1.0
贡献者:飞龙 版本:v1.0 最近总是有人问我,把 ApacheCN 这些资料看完一遍要用多长时间,如果你一本书一本书看的话,的确要用很长时间.但我觉得这是非常麻烦的,因为每本书的内容大部分是重复的, ...
- AtCoder ABC213 简要题解
这世道连 \(\rm ABC\) 都要写题解来续命了... A - D 略. E 有如下观察: 对于任意的四个方格,出去之后再回来可以调整为先在内部走到固定位置再走出去. 因此只需要考虑在一开始把内部 ...
- Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理
一.前言 大家在面试过程中,必不可少的问题是线程池,小编也是在面试中被问啥傻了,JUC就了解的不多.加上做系统时,很少遇到,自己也是一知半解,最近看了尚硅谷阳哥的课,恍然大悟,特写此文章记录一下!如果 ...
- cell重用
少数几个cell可不重用 NSString *CellIdentifier = [NSString stringWithFormat:@"MyCellID_%d",indexPat ...
- MybatisPlus二级缓存
一.序言 本文承接[Mybatis缓存体系探究],提供基于MybatisPlus技术可用于生产环境下的二级缓存解决方案. 1.前置条件 掌握MyBatis二级缓存的原理 有关MyBatis缓存原理内容 ...
- [GWCTF 2019]babyvm re
BABYVM 基于虚拟机操作的一个题 明面上的check函数和加密逻辑都是假的 操作码 重点分析这个vm 0xF5, 0xF1, 0xE1, 0x00, 0x00, 0x00, 0x00, 0xF2, ...