Spring通过注解注入Bean,这里记录一下注入List、Map、String类型的注入
MyBean.java
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;
import java.util.List; import java.util.Map;
@Component public class MyBean {
private List<String> list;
public List<String> getList() { return list; }
@Autowired @Qualifier(value = "testList") public void setList(List<String> list) { this.list = list; }
public Map<String,Integer> initMap;
public Map<String, Integer> getInitMap() { return initMap; } @Autowired @Qualifier(value = "springMap") public void setInitMap(Map<String, Integer> initMap) { this.initMap = initMap; }
private String string;
public String getString() { return string; }
@Value("111") public void setString(String string) { this.string = string; } }
|
上下文环境BeanConfig.java
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order;
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;
@Configuration @ComponentScan(value = "com.example.demo") public class BeanConfig {
@Bean public List<String> testList() { List<String> list = new ArrayList<>(); list.add("List"); list.add("类型"); return list; }
@Bean("springMap") public Map<String, Integer> initMap() { Map<String, Integer> hashMap = new HashMap<>(); hashMap.put("aaa", 123); hashMap.put("bbb", 456); hashMap.put("ccc", 777); return hashMap; }
@Bean @Order(60) public String string1() { return "123"; }
@Bean @Order(50) public String string2() { return "456"; } @Bean public Integer integer1() { return 888; }
@Bean public Integer integer2() { return 999; } }
|
测试代码Test.java
import com.example.demo.spring.BeanConfig; import com.example.demo.spring.MyBean; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.List; import java.util.Map;
public class Test {
public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class); MyBean myBean = applicationContext.getBean("myBean", MyBean.class); System.out.println("myBean = " + myBean); for (String s : myBean.getList()) { System.out.println(s); } for (Map.Entry<String, Integer> entry : myBean.getInitMap().entrySet()) { System.out.println(entry.getKey()); System.out.println("value:" + entry.getValue()); } System.out.println(myBean.getString()); List testList = myBean.getContext().getBean("testList", List.class); System.out.println("======================"); for (Object o : testList) { System.out.println(o); }
} }
|
总结
注入List类型
- 在MyBean.java中生成List的Set、Get方法,在Set方法上使用@Autowired注解,告诉Spring上下文环境中需要一个List类型的Bean
- 在BeanConfig.java上下文环境中生成List类型的Bean,即创建返回值为List的方法并在方法上方使用@Bean,将该方法交由Spring管理
- 在Test.java获取上下文环境后通过getList()方法获取注入的List>>遍历打印输出,List中元素的顺序即为添加时的顺序
注意
- 如果在BeanConfig.java上下文环境中同时存在List类型的Bean和与注入的List泛型相同Bean(也就是返回结果为String类型的方法的Bean),Spring会优先考虑与注入List类型泛型相同的String类型的Bean,并且将该String类型的Bean的返回值放到List中,因而Test.java测试代码输出结果就是该String类型的Bean的返回值。
- 如果使用与泛型相同Bean注入,使用@Order控制顺序,@Order注解的值为int类型,值不需要约束从下标0开始,不需要连续,例如:@Order(10)、@Order(20),@Order(10)注解下的值就会排在前面
- 如果需要BeanConfig.java上下文环境中需要同时存在上面两种情况,那么又想使用List类型的Bean,这个时候需要在MyBean.java注入时,指定Bean,需要使用@Qualifier(value = “testList”),其中value值为Bean的ID,@Bean默认值为方法名,也可以指定,例如:@Bean(“itze”),那么使用这个Bean就是@Qualifier(value = “itze”)
注入Map类型
和注入List类型的大差不差 1. 在MyBean.java中生成Map的Set、Get方法,在Set方法上使用@Autowired注解,告诉Spring上下文环境中需要一个Map类型的Bean 2. 在BeanConfig.java上下文环境中生成Map类型的Bean,即创建返回值为Map的方法并在方法上方使用@Bean,将该方法交由Spring管理 3. 在Test.java获取上下文环境后通过getInitMap()方法获取注入的Map>>遍历打印输出
注意
和List规则也是大差不差 - 如果BeanConfig.java上下文环境中同时存在Map类型的Bean和与注入Map<String,Integer>类型泛型value类型相同的Bean(也就是返回值为Integer类型的方法,在方法上加了@Bean注解),Spring会优先考虑返回值与注入泛型中value类型相同的Bean,并将该Bean的ID作为Map的Key,该Bean的返回值作为Map的Value,因而Test.java测试代码输出Map遍历的结果就是该Integer类型方法名>>>Key,返回值>>>Value - 如果BeanConfig.java上下文环境中同时存在两种类型,又想使用Map类型的Bean,同样方法注入时使用@Qualifier(value = “BeanID”)指定Bean的ID
注入String类型
- 同样在MyBean.java中生成String的Set、Get方法,在Set方法上使用@Value(“213”)注解
- 在Test.java测试代码中,获取上下文环境之后直接通过getString()获取”213”