`
Joson_Coney
  • 浏览: 54777 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring构造器注入

阅读更多

(转自:http://javasight.net/2011/05/spring-contructor-inject-example/

 

 

 

 

在本示例中你将学到如何通过构造器注入来设置bean的属性。考虑如下的User bean类。

 

package net.javasight.designpattern.spring;

public class User {
        private String name;
        private int age;
        private String country;

        User(String name, int age, String country) {
                this.name = name;
                this.age = age;
                this.country = country;
        }

        public String toString() {
                return name + " is " + age + " years old, living in " + country;
        }
}

User类有三个属性:name, age,country。所有的三个属性是通过构造器注入来设置。User的toString()方法覆盖来展示用户对象信息。

下面是beans.xml你勇于Spring的配置。下面的代码展示了如何通过构造器来设置属性值。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        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">
        <bean id="user" class="net.javasight.designpattern.spring.User">
                <constructor-arg value="Eswar" />
                <constructor-arg value="24" />
                <constructor-arg value="India" />
        </bean>
</beans>

bean中的constructor-arg元素用于通过构造器注入来设置属性。因为User类中只有一个构造器,所以该代码没有任何问题。当有相同个数的构造方法时,将会出现冲突。考虑如下代码:

        User(int age, String country) {
                this.age = age;
                this.country = country;
        }

        User(String name, String country) {
                this.name = name;
                this.country = country;
        }

下面是配置文件。

        <bean id="user" class="net.javasight.designpattern.spring.User">
                <constructor-arg value="24" />
                <constructor-arg value="India" />
        </bean>

那么现在你认为哪个构造器将被调用?第一个带有int和String参数的,是吧?但是你将惊讶于Spring将调用第二个构造方法。即使我们知道第一个参数是int第二个参数是String,spring将其都解析为String。要避免该冲突,你需要定义constructor-arg的 type 属性。现在如下配置,第一个构造方法将被调用。

        <bean id="user" class="net.javasight.designpattern.spring.User">
                <constructor-arg type="int" value="24" />
                <constructor-arg type="java.lang.String" value="India" />
        </bean>

那么现在考虑如下情况。我们在User类中有如下的构造方法

        User(String name, int age) {
                this.name = name;
                this.age = age;
        }

        User(int age, String country) {
                this.age = age;
                this.country = country;
        }

配置文件如下.

<bean id="user" class="net.javasight.designpattern.spring.User">
        <constructor-arg type="int" value="24" />
        <constructor-arg type="java.lang.String" value="India" />
</bean>

那么现在你认为哪个构造方法将被调用?第二个,是吗?但是你将又一次吃惊,这是因为在调用构造方法配置文件中定义的参数顺序不做考虑。要解决该问题,需要指定index

下面是增加了index属性的配置文件:

<bean id="user" class="net.javasight.designpattern.spring.User">
        <constructor-arg index="0" type="int" value="24" />
        <constructor-arg index="1" type="java.lang.String"
                value="India" />
</bean>

现在,如我们所期待的,第二个构造方法将被调用.

分享到:
评论

相关推荐

    Spring框架构造注入操作实战案例

    主要介绍了Spring框架构造注入操作,结合具体实例形式分析了spring框架构造输入的相关定义与使用操作技巧,需要的朋友可以参考下

    spring setter 和构造 注入 例子 spring 4.2.0

    IOC DI 一个spring4.2.0 spring setter 和构造 注入 的小例子

    spring通过构造函数注入实现方法分析

    主要介绍了spring通过构造函数注入实现方法,结合实例形式分析了spring通过构造函数注入的原理、实现步骤及相关操作注意事项,需要的朋友可以参考下

    通过实例了解java spring使用构造器注入的原因

    主要介绍了通过实例了解spring使用构造器注入的原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    基于SpringBoot构造器注入循环依赖及解决方式

    1. 循环依赖是什么? Bean A 依赖 B,Bean B 依赖 A这种情况下出现循环依赖。 Bean A → Bean B → Bean A 更复杂的间接依赖造成的循环...Spring先创建beanC,接着创建bean B(将C注入B中),最后创建bean A(将B注

    spring介绍(set和构造器注入)

    NULL 博文链接:https://cdxs2.iteye.com/blog/1940307

    SpringSet方法注入

    我们学习了spring框架spring框架里面有3个优势第一个是轻量级的IOC也叫控制反转后来改名为DI也叫依赖注入,依赖注入里面有3中注入方法分别是set注入,构造器注入,注解注入,我传的是set注入的视频

    Spring系列之依赖注入的三种方式.docx

    对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的 依赖注入就是通过...·使用构造器注入; 最好的解决方案是用构造器参数实现强制依赖,setter 方法实现可选依赖。

    Spring.Net演示实例(IOC、AOP、属性注入、构造函数注入、通知过滤器)

    今天有空,写了基于C#使用Spring.Net的演示实例,希望能给有需要的人带来帮助,其中演示了配置下的IOC、AOP、属性注入、构造函数注入、通知过滤器、以及不使用配置直接代码硬编的AOP动态代码过程,另外还增加了...

    C# Spring.Net演示实例【更新版】(IOC、AOP、属性注入、构造函数注入、通知过滤器)

    今天有空,写了基于C#使用Spring.Net的演示实例,希望能给有需要的人带来帮助,其中演示了配置下的IOC、AOP、属性注入、构造函数注入、通知过滤器、以及不使用配置直接代码硬编的AOP动态代码过程,另外还增加了...

    Spring_0300_IOC_Injection_Type 构造器注入

    NULL 博文链接:https://diaochenlong2.iteye.com/blog/1831224

    Spring中依赖注入与容器

    - 构造器注入 - 属性(setter)注入  容器 容器是管理 组件的生命周期,注入组件(声明)所需的资源 例如: 容器 : 国家 义务教育、纳税、社保、医疗、养老 组件 : 公民 - apache tomcat 是 JSP/Servlet 容器,...

    Spring开发指南

    Type3 构造子注入 几种依赖注入模式的对比总结 Spring Bean封装机制 Bean Wrapper Bean Factory ApplicationContext Web Context Spring 高级特性 Web 应用与 MVC Spring MVC Spring MVC指南 基于模板的...

    今天的面试官是个锤子,Spring为什么建议使用构造器来注入?.zip

    计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...

    Spring面试题含答案.pdf

    20. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter 方法注入? 21.什么是 Spring beans? 22. 一个 Spring Bean 定义 包含什么? 23. 如何给 Spring 容器提供配置元数据? 24. 你怎样定义类的作用域? 25. ...

    Spring攻略PDF版

     3.3 解决构造器歧义   3.3.1 问题描述   3.3.2 解决方案   3.3.3 实现方法   第4章 高级Spring IoC容器   第5章 动态代理和经典的Spring AOP   第6章 Spring 2.x AOP和AspectJ支持  第...

    spring4示例代码

    spring-1 演示了使用setter方式及构造器方式创建bean,util:list标签创建集合,p标签简化配置 和依赖注入, 以及bean的autowire和继承与依赖,以及bean的作用域。 spring-2 演示了外部配置文件的引入(connection)...

    Spring的Bean配置

    Spring IOC和DI概述,Bean的配置形式,IOC容器BeanFactory和ApplicationContext概述,依赖注入的方式,属性注入,构造器注入等案例

    Spring的三种注入方式

     3、构造器注入(死的应用)  关于getter和setter方式的注入 1.autowire=defualt 2.autowire=“byName”  3.autowire=bytype    详细解析注入方式  例如:有如下两个类需要注入  第一个类: 1....

    spring.doc

    3.5.1 使用构造器注入 20 3.5.2 使用属性setting方法进行注入 21 3.5.3 装配list集合 22 3.5.4 装配set集合 22 3.5.5 装配map 22 3.5.6 装配Properties 23 3.6 注解注入 23 注解注入拓展: 23 3.6.1 @Autowired 26 ...

Global site tag (gtag.js) - Google Analytics