在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. QT 获取字体大小

    QFont font(androidFont); QFontInfo fInfo(font); qDebug()<<"FFFFFFFFFFFFFFFFFFFFFFFPPPSIZE ...

  2. 一行python能干什么?

    我们都知道,python作为一个编程语言,它有一个最大的优势就是代码简短,那么一行python代码能实现哪些操作呢?一起来看看吧! 1.打印Hello World! 这是最基础的,相信不管学习哪一门语 ...

  3. mybatis抛出异常(java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1)

    文章参考 https://blog.csdn.net/junsure2012/article/details/42171035 https://www.cnblogs.com/WangYunShuai ...

  4. Vue-router 报NavigationDuplicated的可能解决方案

    出现这个问题,控制台会报[NavigationDuplicated {_name: "NavigationDuplicated", name: "NavigationDu ...

  5. Linux下的用户和用户组,文件权限:chown和chmod

    如下图所示,root权限下新建一个用户MasterBai, /etc/passwd文件中新加入一些信息 这个文件中,记录了该服务器的用户信息,如下图红色框起来的用户,就是我们自己创建的用户,而起来2- ...

  6. SQL语句复习【专题四】

    SQL语句复习[专题四] 多表查询 sql 92多表查询 sql92.sql99 标准--查询所有员工的姓名,部门编号,部门名称select * from empselect * from dept- ...

  7. 访问kubernetes api

    kubernetes api介绍 作用: 将各种资源对象的数据都通过该api接口被提交到后端的持久化存储etcd中; 一个api的顶层元素由kind丶apiVersion丶metadata丶spec和 ...

  8. linux常用查看命令

    一般查看 cat -n 文件名 n 代表显示行号 分页查看 more 文件名 more -50 文件名 -50 代表一页显示50行 向下翻页  空格 向上翻页 b more +/搜索值 文件名 查找文 ...

  9. PHP-MYSQL中文乱码问题.

    从MySQL 4.1开始引入多语言的支持,但是用PHP插入的中文会出现乱码.无论用什么编码也不行. 解决这个问题其实很简单. 1.在建表的时候设置编码类型为gb2312_chinese_ci. 2.在 ...

  10. impdp导入报错39002

    原文:https://www.cnblogs.com/huacw/p/3888807.html 1 create directory data_pump_dir as '\exphd\datapump ...