Spring——多种方式实现依赖注入
在Spring的XML配置中,只有一种声明bean的方式:使用<bean>元素并指定class属性。Spring会从这里获取必要的信息来创建bean。
但是,在XML中声明DI时,会有多种可选的配置方式和风格,具体到setter方式、构造器方式和P命名空间方式。
一、使用setter进行注入
二、使用构造注入
- 为POJO类创建带参的构造方法
- 使用<constructor-arg>元素
给原先的实体类添加构造,记得带着无参构造,这个问题在这里不细说
Spring配置文件如下
<bean id="student" class="com.cmy.entity.StudentBean">
<!--constructor-arg:代表构造函数中的一个参数 索引从0开始-->
<constructor-arg type="java.lang.String" value="呵呵"></constructor-arg>
<constructor-arg type="int" value="16"></constructor-arg>
</bean>
注意:
1、一个<constructor-arg>元素表示构造方法的一个参数,且使用时不区分顺序。
2、通过<constructor-arg>元素的index 属性可以指定该参数的位置索引,位置 从0 开始。
3、<constructor-arg>元素还提供了type 属性用来指定参数的类型,避免字符串和基本数据类型的混淆。
三、使用P命名空间进行注入
<bean id="student" class="com.cmy.entity.studentBean" p:name="呵呵"
p:age="16">
</bean>
注意:
1、P命名空间注入的方式也是使用setter方式注入,所有POJO类中必须存在对应的set方法
2、 使用前需要在Spring的配置文件中引入p命名空间 xmlns:p="http://www.springframework.org/schema/p"
AOP也同样如此,不过在idea中可以使用ctrl+Enter自动引入 xmlns:aop="http://www.springframework.org/schema/aop"
四、注入不同的类型
这个关注第四点,POJO类如下:
public class Datetype {
//数组
private String[] arrays;
//list
private List<Integer> lists;
//set
private Set<Integer> sets;
//map
private Map<String,String> maps;
//配置
private Properties pros; public String[] getArrays() {
return arrays;
} public void setArrays(String[] arrays) {
this.arrays = arrays;
} public List<Integer> getLists() {
return lists;
} public void setLists(List<Integer> lists) {
this.lists = lists;
} public Set<Integer> getSets() {
return sets;
} public void setSets(Set<Integer> sets) {
this.sets = sets;
} public Map<String, String> getMaps() {
return maps;
} public void setMaps(Map<String, String> maps) {
this.maps = maps;
} public Properties getPros() {
return pros;
} public void setPros(Properties pros) {
this.pros = pros;
} @Override
public String toString() {
return "Datetype{" +
"arrays=" + Arrays.toString(arrays) +
", lists=" + lists +
", sets=" + sets +
", maps=" + maps +
", pros=" + pros +
'}';
}
}
大配置文件:
<bean id="dateType" class="cn.spring.entity.Datetype"> <property name="arrays">
<array>
<value>hehe</value>
<value>haha</value>
</array>
</property> <property name="lists">
<list>
<value>1</value>
<value>2</value>
</list>
</property> <property name="sets">
<set>
<value>3</value>
<value>4</value>
</set>
</property> <property name="maps">
<map>
<entry key="c" value="才"></entry>
<entry value="的" key="d"></entry>
</map>
</property> <property name="pros">
<props>
<prop key="a">啊</prop>
<prop key="b">吧</prop>
</props>
</property> </bean>
测试类:
输出结果:
五、域属性的自动注入
在之前我们采用手动的域属性注入,即:
这里采用自动注入,自动注入有两种方式:
1.byName:保证域属性名字和bean的id一致
2.byType:保证域属性的类型和bean的类型一致,与其相兼容的类型也不可以
Spring——多种方式实现依赖注入的更多相关文章
- Spring多种方式实现依赖注入
平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...
- IOC和AOP使用扩展 多种方式实现依赖注入
多种方式实现依赖注入 1.Spring 使用setter访问器实现对属性的赋值, 2.Spring 构造constructor方法赋值, 3.接口注入 4.Spring P命名空间注入直接量 sett ...
- Spring - lookup-method方式实现依赖注入
引言 假设一个单例模式的bean A需要引用另外一个非单例模式的bean B,为了在我们每次引用的时候都能拿到最新的bean B,我们可以让bean A通过实现ApplicationContextWa ...
- 多种方式实现依赖注入及使用注解定义bean
构造注入 如何给构造方法中的参数注入方法呢如下 首先bean代码如下 package cn.pojo; public class Greeting { /** * 说的话 */ private Str ...
- Ioc和Aop扩展--多种方式实现依赖注入(构造注入,p命名空间注入,集合类型注入,注入null和注入空值)
构造注入 语法: <constructor-arg> <ref bean="bean的id"/> </constructor-arg> 1 ...
- Spring源码剖析依赖注入实现
Spring源码剖析——依赖注入实现原理 2016年08月06日 09:35:00 阅读数:31760 标签: spring源码bean依赖注入 更多 个人分类: Java 版权声明:本文为博主原 ...
- (转)Spring读书笔记-----Spring核心机制:依赖注入
Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因此,我们说这些对象间存在依赖关系.加入A组件调用了B组件的方法,我们就 ...
- 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)
前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...
- ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
ExpandoObject与DynamicObject的使用 using ImpromptuInterface; using System; using System.Dynamic; names ...
随机推荐
- X86逆向9:通过关键常量破解
本章将讲解一下关于关键全局变量的一些内容,关键的全局变量对于软件的破解非常的有用,找到了关键全局变量并改写它同样可以完成完美爆破一个程序,这里我将使用CM小例子来讲解搜索关键变量的一些技巧,最后我们来 ...
- ASP.NET Core如何限制请求频率
原文:ASP.NET Core如何限制请求频率 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.ne ...
- C#.net开发 List与DataTable相互转换
1.DataTable转List集合 /// <summary> /// DataTable转化为List集合 /// </summary> /// <typeparam ...
- Json-server在Vue 2.0中使用--build文件中没有dev-server文件
跟大佬的视频使用json-server模拟后台数据调用,发现build文件中并没有dev-server.js. 新版的vue-cli取消了dev-server.js和dev-client.js 改 ...
- JCA-Java加密框架
转自:https://www.jianshu.com/p/a8194c237363 JCA是平台的一个主要部分,包含一个“Provider”体系结构和一组用于数字签名,消息摘要(哈希),证书和证书验证 ...
- OGG学习笔记02
实验环境:源端:192.168.1.30,Oracle 10.2.0.5 单实例目标端:192.168.1.31,Oracle 10.2.0.5 单实例 1.模拟源数据库业务持续运行 2.配置OGG前 ...
- JavaWeb【七、JSP状态管理】
http协议无状态性 当提交请求,服务器返回响应.但当同一用户同一浏览器再次提交请求,服务器并不知道与刚才的请求是同一用户浏览器发起. 保存用户状态的两大机制 Session-保存在服务器端 Cook ...
- 开源Android 恶意软件Radio Balouch
安全研究机构 ESET 首次发现了开源 Android 间谍软件在 Google Play 上的恶意信息窃取行为,并且在被删除后仍在Google Play 重复出现.据悉,第一个间谍软件是基于开源间 ...
- TensorFlow可以在终端和通过终端打开的PyCharm中运行,不能在直接打开的PyCharm中运行
然后看运行窗口的出错信息,点击最右边的view,发现缺少个文件,如代码所示 Traceback (most recent call last): File "/usr/local/lib/p ...
- slplunk原始数据和索引数据大小比较
DB目录总大小:2468MB 所有buckets的meta信息在.bucketManifest文件里: id,path,"raw_size","event_count&q ...