在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——多种方式实现依赖注入的更多相关文章

  1. Spring多种方式实现依赖注入

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  2. IOC和AOP使用扩展 多种方式实现依赖注入

    多种方式实现依赖注入 1.Spring 使用setter访问器实现对属性的赋值, 2.Spring 构造constructor方法赋值, 3.接口注入 4.Spring P命名空间注入直接量 sett ...

  3. Spring - lookup-method方式实现依赖注入

    引言 假设一个单例模式的bean A需要引用另外一个非单例模式的bean B,为了在我们每次引用的时候都能拿到最新的bean B,我们可以让bean A通过实现ApplicationContextWa ...

  4. 多种方式实现依赖注入及使用注解定义bean

    构造注入 如何给构造方法中的参数注入方法呢如下 首先bean代码如下 package cn.pojo; public class Greeting { /** * 说的话 */ private Str ...

  5. Ioc和Aop扩展--多种方式实现依赖注入(构造注入,p命名空间注入,集合类型注入,注入null和注入空值)

    构造注入 语法: <constructor-arg>    <ref bean="bean的id"/> </constructor-arg> 1 ...

  6. Spring源码剖析依赖注入实现

    Spring源码剖析——依赖注入实现原理 2016年08月06日 09:35:00 阅读数:31760 标签: spring源码bean依赖注入 更多 个人分类: Java   版权声明:本文为博主原 ...

  7. (转)Spring读书笔记-----Spring核心机制:依赖注入

    Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因此,我们说这些对象间存在依赖关系.加入A组件调用了B组件的方法,我们就 ...

  8. 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)

    前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...

  9. 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 ...

随机推荐

  1. vs 2017创建类时的默认模板修改

    思路:找到vs 2017安装目录---->找到模板文件---->修改 一般安装目录: C:\Program Files (x86)\Microsoft Visual Studio\2017 ...

  2. centos7上的firewalld 的使用

    #centos7上的firewalld 的使用 一.firewalld的基本启动关闭命令 启动服务------systemctl start firewalld 关闭服务------systemctl ...

  3. day07 类

    一.目录 1.模块 2.包 3.isinstance issubclass type 4.方法和函数 5.反射 6.约束 7.继承 8.特殊成员 9.异常处理 补充知识点 10.hashlib模块 1 ...

  4. jdk中集成的jre和单独安装的jre有什么区别?

    jdk 和 jre 是什么? 有什么区别? jre Jre 是java runtime environment, 是java程序的运行环境.既然是运行,当然要包含jvm,也就是大家熟悉的虚拟机啦,还有 ...

  5. vue防重复点击(指令实现)

    快速点击按钮会重复多次调用接口,防止出现这样的情况 全局定义,方便调用 新建plugins.js export default { install (Vue) { // 防重复点击(指令实现) Vue ...

  6. 【玩转SpringBoot】通过事件机制参与SpringBoot应用的启动过程

    生命周期和事件监听 一个应用的启动过程和关闭过程是归属到“生命周期”这个概念的范畴. 典型的设计是在启动和关闭过程中会触发一系列的“事件”,我们只要监听这些事件,就能参与到这个过程中来. 要想监听事件 ...

  7. 基于Java使用Flink读取CSV文件,针对批处理,多表联合两种方式Table类和Join方法的实现数据处理,再入CSV文件

    Maven依赖 源头 <dependencies> <dependency> <groupId>org.projectlombok</groupId> ...

  8. php--常见算法2

    <?php function zhi($number){ $f1=1; $f2=1; for($i=3;$i<=$number;$i++){ //前一个的前一个值+前一个值 $f3=$f1 ...

  9. Windows问题

    常用工具 DisplayFusion 官网 电脑分屏,V9.4 Pro 破解版 问题解决 Win64位注册表导入方法 64位Windows操作系统注册表不同于32位Windows操作系统,Win64 ...

  10. head pose estimation

    opencv:帖子中介绍了算法原理和opencv估计姿态的代码 https://www.learnopencv.com/head-pose-estimation-using-opencv-and-dl ...