文档章节

Spring注入值得2种方式:属性注入和构造注入

CodingNew
 CodingNew
发布于 2016/06/22 00:00
字数 812
阅读 12
收藏 0

Spring是一个依赖注入(控制反转)的框架,那么依赖注入(标控制反转)表现在那些地方了?

即:一个类中的属性(其他对象)不再需要手动new或者通过工厂方法进行创建,而是Spring容器在属性被使用的时候给予注入。

注入有2种方式:

1. 属性注入:通过无参构造函数+setter方法注入

2. 构造注入:通过有参的构造函数注入。

优缺点:

1. 属性注入直白易懂,缺点是对于属性可选的时候,很多个构造函数会显得类很臃肿。

2. 构造注入是一种高内聚的体现,特别是针对有些属性需要在对象在创建时候赋值,且后续不允许修改(不提供setter方法)。

 

项目利用maven进行架构,其基本项目结构为:

其中pom.xml中的内容为:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mc.base.learn</groupId>
    <artifactId>spring</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>spring</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- Spring核心依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>

        <!-- 提供了Spring上下文对象 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>
        
    </dependencies>
</project>

项目基本结构完成

一、通过构造函数创建对象。

2.1 利用无参构造函数+setter方法注入值

最基本的对象创建方式,只需要有一个无参构造函数(类中没有写任何的构造函数,默认就是有一个构造函数,如果写了任何一个构造函数,默认的无参构造函数就不会自动创建哦!!)和字段的setter方法。

Person类:

package com.mc.base.learn.spring.bean;

public class Person {

    private String name;
    private Integer id;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", id=" + id + "]";
    }

}

XML配置:

<?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 class="com.mc.base.learn.spring.bean.Person" id="person">
        <property name="name" value="LiuChunfu"></property>
        <property name="id" value="125"></property>
    </bean>
    
</beans>

其本质为:

SpringContext利用无参的构造函数创建一个对象,然后利用setter方法赋值。所以如果无参构造函数不存在,Spring上下文创建对象的时候便会报错。

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'person' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; 
nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mc.base.learn.spring.bean.Person]: No default constructor found;
nested exception is java.lang.NoSuchMethodException: com.mc.base.learn.spring.bean.Person.<init>() at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1105)   。。。。。

2.2 利用有参构造函数直接注入

Person类:

package com.mc.base.learn.spring.bean;

public class Person {

    private String name;
    private Integer id;
    
    public Person(String name, Integer id) {
        super();
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", id=" + id + "]";
    }

}

XML配置:

 

<?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 class="com.mc.base.learn.spring.bean.Person" id="person">
        <constructor-arg name="id" value="123"></constructor-arg>
        <constructor-arg name="name" value="LiuChunfu"></constructor-arg>
    </bean>
    
</beans>

 

本文转载自:http://www.cnblogs.com/LiuChunfu/p/5574546.html

CodingNew
粉丝 2
博文 76
码字总数 0
作品 0
成都
私信 提问
spring 四种依赖注入方式

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

举个_栗子
2017/12/17
42
2
Spring的bean的属性注入

bean的属性注入3中方式。 1.0 接口注入。 2.0 构造函数注入。 3.0 setter方法的注入。 spring支持后面的2种注入 示范如下,设计一个Person类型,和一个Student类型。 Person类,采用setter方...

东风冷雪
2018/09/08
0
0
Spring框架笔记(三)——Spring容器、属性注入和构造器注入详解

Spring 容器 在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用. Spring 提供了两种类型的 IOC 容器...

HappyBKs
2015/07/12
4K
5
[3]Spring以配置文件的方式进行属性注入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_19560943/article/details/73603698 在Java中进行属性注入的三种方式(也就是给属性赋值的几种方式) 1....

wangke_king
2017/06/22
0
0
Spring两种依赖注入方式的比较

我们知道,Spring对象属性的注入方式有两种:设值注入和构造注入。先看代码:   假设有个类为People,该对象包含三个属性,name和school还有age,这些属性都有各自的setter和getter方法,还...

摆渡者
2014/02/27
6.9K
0

没有更多内容

加载失败,请刷新页面

加载更多

ubuntu 19.4 安装virtual

ubuntu 安装virtual 后报错 Solve “Result Code: NS_ERROR_FAILURE (0x80004005)” VirtualBox Error In Arch Linux $ sudo /sbin/vboxconfig 报错 “debconf: DbDriver ”config“: confi......

internetafei
14分钟前
4
0
思维导图技术分享

- by 文恒

程序员的自我成长
17分钟前
4
0
《将博客搬至CSDN》

将blog,也同步到CSDN中

温安适
25分钟前
7
0
watchbog再升级,企业黄金修补期不断缩小,或面临蠕虫和恶意攻击

概要 近日,阿里云安全团队发现wacthbo挖矿团伙[1]新增了CVE_2019_5475 的漏洞利用代码,并开始进行尝试性攻击。 通过对CVE_2019_5475漏洞的生命周期进行分析后发现,漏洞批量化利用的速度正...

大涛学长
28分钟前
4
0
深入理解JVM,虚拟机类加载机制

本人免费整理了Java高级资料,一共30G,需要自己领取; 传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 类加载过程概览 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的...

李红欧巴
30分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部