`

Spring通过@Value注解注入属性的几种方式

阅读更多
1.@Value标签
  由于Spring对通过IOC的方式对对象进行统一管理,所以对任何对象而言,其生成方法均由Spring管理。传统的方法是通过XML配置每一个Bean,并对这个Bean的所有Field进行声明式配置。

  以一个简单的学校的例子为示范。假设有两种角色,老师和班长。

package org.kingszelda.version3.controller;

/**
* Created by shining.cui on 2017/7/30.
*/
public class Teacher {

    /**
     * 姓名
     */
    private String name = "王老师";

    /**
     * 教授科目
     */
    private String major = "数学";

    /**
     * 教授课程班级的班长
     */
    private ClassMonitor classMonitor = new ClassMonitor();

    /**
     * 老师会上课
     */
    public void teachLesson() {

    }

    /**
     * 老师要收作业,然而老师并不亲自收,而是交给班长收
     */
    public void collectHomework() {
        classMonitor.collectHomework();
    }

    public String getName() {
        return name;
    }

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

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    public ClassMonitor getClassMonitor() {
        return classMonitor;
    }

    public void setClassMonitor(ClassMonitor classMonitor) {
        this.classMonitor = classMonitor;
    }
}

老师有自己的名字和教授的科目两个属性,这属于老师的静态属性。老师有很多“功能“,比如上课和收作业。上课属于老师可以自己完成的功能,而收作业则需要班长帮忙。所以老师为了完成自己的工作是不能独立存在的,需要依赖班长。

/**
* Created by shining.cui on 2017/7/30.
*/
public class ClassMonitor {

    public void collectHomework(){
        System.out.println("开始收作业了!");
        System.out.println("收作业完毕");
    }
}

这里我们假设班长只有一个功能,就是收作业。

  上面的例子很好的说明了对象之间相互依赖共同合作的方法,即互相依赖。这些功能交给spring之后管理起来就方便多了,以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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="classMonitor" class="org.kingszelda.version3.controller.ClassMonitor"/>
    <bean id="teacher" class="org.kingszelda.version3.controller.Teacher">
        <property name="name" value="王老师"/>
        <property name="major" value="数学"/>
        <property name="classMonitor" ref="classMonitor"/>
    </bean>
</beans>


通过这种配置的方式之后,实体之间的依赖关系变得一清二楚。比如Teacher的名字,科目,所依赖的班长是哪个,只看配置文件就可以一目了然。但是,当实体变多了之后,可想而知,这个xml配置文件将庞大的不可想象,就更不要提可读性了。

  于是Spring从3.0开始推出了基于注解的形式,来简化配置。


package org.kingszelda.version3.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
* Created by shining.cui on 2017/7/30.
*/
@Service
public class Teacher {

    /**
     * 姓名
     */
    @Value("王老师")
    private String name;

    /**
     * 教授科目
     */
    @Value("数学")
    private String major;

    /**
     * 教授课程班级的班长
     */
    @Resource
    private ClassMonitor classMonitor;

    /**
     * 老师会上课
     */
    public void teachLesson() {

    }

    /**
     * 老师要收作业,然而老师并不亲自收,而是交给班长收
     */
    public void collectHomework() {
        classMonitor.collectHomework();
    }
}


通过注解的形式已经减少了大量的get、set方法,通过@Resource注入了依赖的班长,并且通过@Value注入了老师的姓名和科目。

  问题来了,当姓名与科目如何做到可配置,而不是写死的呢?对应xml与注解都有其对应的方式。

  首先声明一个config.perproties文件:
name=张老师
major=数学


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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:property-placeholder location="classpath:config.properties"/>
    <bean id="classMonitor" class="org.kingszelda.version3.controller.ClassMonitor"/>
    <bean id="teacher" class="org.kingszelda.version3.controller.Teacher">
        <property name="name" value="${name}"/>
        <property name="major" value="${major}"/>
        <property name="classMonitor" ref="classMonitor"/>
    </bean>
</beans>

注解:

package org.kingszelda.version3.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
* Created by shining.cui on 2017/7/30.
*/
@Service
public class Teacher {

    /**
     * 姓名
     */
    @Value("${name}")
    private String name;

    /**
     * 教授科目
     */
    @Value("${major}")
    private String major;

    /**
     * 教授课程班级的班长
     */
    @Resource
    private ClassMonitor classMonitor;

    /**
     * 老师会上课
     */
    public void teachLesson() {

    }

    /**
     * 老师要收作业,然而老师并不亲自收,而是交给班长收
     */
    public void collectHomework() {
        classMonitor.collectHomework();
    }
   
}

我们看到,不论是通过xml配置,还是通过注解@Value的方式,姓名与科目都在生成Teacher对象是被赋值进去了。

分享到:
评论

相关推荐

    详解Spring通过@Value注解注入属性的几种方式

    本文将详细介绍通过`@Value`注解注入属性的几种常见方式。 ### 1. 基于属性文件注入 #### 1.1 `PropertyPlaceholderConfigurer` 当需要从属性文件(如`dev.properties`)中读取值时,可以使用`...

    关于spring boot中几种注入方法的一些个人看法

    Spring Boot 中的几种注入方法 在 Spring Boot 中,注入是一种非常重要的机制,用于将 bean 对象注入到其他 bean 对象中,以便实现松耦合和高内聚的设计目标。下面我们将对 Spring Boot 中的几种注入方法进行详细的...

    spring注解笔记

    当使用@Resource或@Autowired注解注入Spring管理的Bean时,需要注意注入变量的类型必须与要注入的Bean类型或其父类类型匹配。否则,Spring将无法完成注入过程,因为类型不一致会导致注入失败。 总结来说,Spring...

    Spring定义bean的三种方式和自动注入

    同时,可以通过`@Value`或`@Autowired`注解进行属性注入。 ```java @Component("teacher") public class Teacher { private String name; // ... } @Component public class Student { private String ...

    spring依赖注入的几种方式

    Spring 依赖注入的几种方式 依赖注入(Dependency Injection,简称 DI)是一种设计模式,它可以将对象之间的耦合关系降到最低,从而提高系统的灵活性和可维护性。在 Spring 框架中,依赖注入是通过 IoC 容器来实现...

    spring注解完整版[定义].pdf

    在Spring框架中,注解是实现Inversion of Control(IoC)或依赖注入(DI)的一种强大工具。Spring 2.5引入了@Autowired注解,它极大地简化了配置,允许开发者在不编写XML配置文件的情况下完成bean的自动装配。本文将...

    Spring通过注解实现IOC

    在Spring中,主要通过以下几种注解来实现IOC: 1. `@Component`:这是最基础的注解,用于标记一个类为Spring的Bean。将这个注解添加到类上,Spring就会自动扫描并管理这个类的实例。例如: ```java @Component ...

    Spring中你不知道的注入方式编程开发技术共6页.pdf

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它极大地提高了代码的可测试性和可维护性。本资料“Spring中你不知道的注入方式编程开发技术共6页.pdf”深入探讨了一些不常见但...

    Spring通过配置文件和注解实现属性赋值

    对于通过注解的方式实现属性赋值,Spring提供了`@Value`注解来简化操作。首先,通过`@PropertySource`注解来加载外部配置文件,配置文件中的键值对会被保存到运行环境变量中。之后,可以使用`${}`从环境变量中取出...

    SpringCloud实用篇02

    Nacos配置管理是SpringCloud中的一种配置管理方式,能够提供统一的配置管理、配置热更新、配置共享等功能。在Nacos中添加配置信息可以通过在Nacos中添加配置文件实现,配置文件可以是.properties或.yaml格式。 统一...

    Springioc注入Demo

    在Spring IOC中,主要的注入方式有以下几种: 1. **构造器注入**:通过构造函数传递依赖对象,Spring容器会根据构造函数的参数类型创建并注入相应的对象。这种方式确保对象在创建时就具备所有依赖,增强了对象的...

    Spring注解驱动开发实现属性赋值

    在Spring注解驱动开发中,@Value注解实际上是通过注入一个PropertyPlaceholderConfigurer类型的bean实现的。当应用程序上下文启动时,该bean会负责加载指定的属性文件,并将它们作为环境变量保存起来,之后就可以...

    Spring在代码中获取bean的几种方式.rar

    以下将详细介绍Spring在代码中获取bean的几种主要方法: 1. **`ApplicationContext` 接口** `ApplicationContext` 是Spring中最常用的接口之一,它提供了获取Bean的多种方法。例如,`getBean(String beanName)` ...

    Struts2+spring注解配置

    Spring 使用注解配置主要是为了简化 Bean 的定义,包括但不限于以下几种: 1. `@Component`, `@Service`, `@Repository`, `@Controller` 这些注解用于标记组件类,它们分别对应不同的服务层角色,Spring 会自动扫描...

    spring jersey整合后无法注入

    当Spring与Jersey整合时,我们通常会遇到以下几种常见问题: 1. **未正确配置Spring上下文**:确保在你的项目中包含Spring的上下文配置文件,如`applicationContext.xml`,并且在这个配置文件中声明了你需要注入的...

    Spring与IoC系列四:基于注解的依赖注入.rar

    4. `@Value`:用于注入基本类型的值或者从Spring的属性配置文件中注入值。 5. `@Scope`:用于定义Bean的作用域,如单例(`singleton`)、原型(`prototype`)等。 6. `@PostConstruct` 和 `@PreDestroy`:这两个...

    spring整合数据库连接的几种方式

    - 在Spring中注入并使用DBCP连接池,可以通过@Autowired注解或JdbcTemplate来实现。 2. **C3P0** - C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。 - C3P0的优势在于...

    Spring如何注入Date类型的变量

    以上是几种在Spring中注入Date类型变量的方法。根据实际项目需求和设计,选择最适合的方式。在阅读提供的PDF文档"Spring – How to pass a Date into bean property"时,你将能深入理解这些方法的实现细节和适用场景...

Global site tag (gtag.js) - Google Analytics