一.@Autowired
自动装配(可以用在字段、构造、方法、参数)
匹配方式:
先根据类型匹配再根据名称匹配,如果匹配不到就报错
未匹配解决方案:
1.设置@Autowired对应的字段名
2.通过@Qualifier(名称) 指定具体对象名
3.设置@Autowired(required=false),代表非必须字段,不匹配(一个都没有时)就为null
自动装配一定要使用@Autowried吗?
1.@Bean方法的参数会自动装配
2.构造方法的参数会自动装配
二.@Resource
Idea使用@Autowired时会出现警告
@Resource是由JDK提供的,更推荐使用
匹配方式:
先根据名称匹配,再根据类型匹配
三.@Value
设置字段值,用于字段、构造参数上(必须是bean,@Value才生效)
1.直接值
package com.gok.iocdi.student;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Student {
@Value("张三")
private String name;
@Value("18")
private Integer age;
}
2.读取配置文件值
package com.gok.iocdi.student;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Student {
@Value("${student.name}")
private String name;
@Value("${student.age}")
private Integer age;
@Value("${student.score:100}") //使用:指定默认值
private Integer score;
}
读取的配置值不存在会报错
application.properties文件默认使用ISO-8859-1编码,SpringBoot项目整体使用UTF-8,所以application.properties文件中使用中文会乱码,之后会使用.yml文件代替.properties文件
3.复杂类型(SPEL表达式)
package com.gok.iocdi.student;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
public class Student {
@Value("#{1 + 1}") //使用#{}执行运算
private Integer count;
@Value("#{{'语文':'90', '数学':'100'}}") //map数据
private Map<String, Integer> scores;
@Value("#{'唱歌,跳舞'}") //List数据
private List<String> hobbies;
@Value("#{${student.age} * 2}") //#{}搭配${}
private Integer age;
}