Spring通过@Value注解注入属性的几种方式 博客分类: 框架开发 spring
程序员文章站
2024-02-13 10:32:40
...
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对通过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对象是被赋值进去了。