在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. exclipe怎么设置编码为UTF-8

    如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好使 Java文件使用UTF-8编码.然而,Eclipse工作空间(workspace)的缺省字符编码是操作系统缺省的编码,简 ...

  2. linq to xml运用示例

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste ...

  3. JS-数值转换

    JS数值转换 JS数值转换的方式有4种:Number(),parseInt(),parseFloat(),数据类型*1或者/1. 他们的区别在于: 1.Number():可以将非数值转为数值 如果是B ...

  4. 1 sql server 中cursor的简介

    1.游标的分类 游标共有3类:API服务器游标.Transaction-SQL游标和API客户端游标. 2 API服务器cursor共有如下几种 静态游标的完整结果集将打开游标时建立的结果集存储在临时 ...

  5. js中——限制文本框输入非数字

      //先把非数字的都替换掉,除了数字和.和/             obj.value = obj.value.replace(/[^\-\d./]/g, ""); //必须保 ...

  6. java开发环境构建

    一. 基本工具安装 1. 配置终端命令别名 vim ~/.bash_profile *********************************************** # for colo ...

  7. thinkphp5.0 field和with连用的问题

    field在with后面时field会不起作用,会查询数据库中全部的字段: field在with前面时会无法筛选联表的字段 解决办法把with换成join,field和join顺序无所谓 * @par ...

  8. 0、CentOS7系统root密码丢失找回方法

    第一步 1.重新启动或开启CentOS7.6系统,在选择进入系统的Grub菜单界面如下图1-1,根据提示按"e"小写字母进入编辑界面,如下图1-2所示: 图1-1 CentOS7. ...

  9. kafka api的基本使用

    kafka API kafka Consumer提供两套Java API:高级Consumer API.和低级Consumer API. 高级Consumer API 优点: 高级API写起来简单,易 ...

  10. Selenium(5)

    一.WebDriver结合Junit的使用 1.Junit中常用的断言 (1)assertEquals:断言实际结果与预期结果是否相等 Equals:相等 格式:assertEquals(预期值,实际 ...