手记

多种方式实现Spring的Bean注入

Spring的核心是控制反转(IoC)和面向切面(AOP)。

Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理 。

Spring工厂是用于生成Bean,对Bean进行管理。

在Spring中,所有Bean的生命周期都交给Ioc容器管理。

Spring中,Spring可以通过Xml形式或注解的形式来管理Bean 。

下面基于注解的形式,采用多种方式实现Spring的Bean注入。具体如下:

一、通过方法注入Bean

1. 通过构造方法注入Bean

实例代码:

@Component("anotherBean1")
public class AnotherBean {
}


@Component
public class MyBean1 {

    private AnotherBean anotherBean1;

    public MyBean1(AnotherBean anotherBean1) {
        this.anotherBean1 = anotherBean1;
    }

    @Override
    public String toString() {
        return "MyBean1{" +
                "anotherBean1=" + anotherBean1 +
                '}';
    }
}

2.通过Set方法注入Bean

实例代码:

@Component
public class MyBean2 {

    private AnotherBean anotherBean2;

    @Autowired
    public void setAnotherBean2(AnotherBean anotherBean2) {
        this.anotherBean2 = anotherBean2;
    }

    @Override
    public String toString() {
        return "MyBean2{" +
                "anotherBean2=" + anotherBean2 +
                '}';
    }
}

二、通过属性注入Bean

@Component
public class MyBean3 {

    @Autowired
    private AnotherBean anotherBean3;

    @Override
    public String toString() {
        return "MyBean3{" +
                "anotherBean3=" + anotherBean3 +
                '}';
    }
}

三、通过集合类型注入Bean

1. 直接注入集合实例   

List集合注入Bean

@Component
public class MyBean4 {

    private List<String> stringList;

    public List<String> getStringList() {
        return stringList;
    }

    @Autowired
    public void setStringList(List<String> stringList) {
        this.stringList = stringList;
    }

    private List<String> stringList1;

    public List<String> getStringList1() {
        return stringList1;
    }

    @Autowired
    @Qualifier("stringList1")   //使用@Qualifier注解指定bean的Id,此处的Id与BeanConfiguration类中的stringList1方法的Bean 的Id要一致
    public void setStringList1(List<String> stringList1) {
        this.stringList1 = stringList1;
    }

    @Override
    public String toString() {
        return "MyBean4{" +
                "stringList=" + stringList +
                ", stringList1=" + stringList1 +
                '}';
    }
}


Map集合注入Bean

@Component
public class MyBean5 {

    private Map<String, Integer> integerMap;

    public Map<String, Integer> getIntegerMap() {
        return integerMap;
    }

    @Autowired  //加上@Autowired 注解是希望Spring帮我们完成注入
    public void setIntegerMap(Map<String, Integer> integerMap) {
        this.integerMap = integerMap;
    }

    @Override
    public String toString() {
        return "MyBean5{" +
                "integerMap=" + integerMap +
                '}';
    }
}


2. 将多个泛型的实例注入到集合     

(1)将多个泛型的实例注入到List     

(2)控制泛型实例在List中的顺序     

(3)将多个泛型的实例注入到Map

@Configuration
@ComponentScan("com.lhf.spring.bean")
public class BeanConfiguration {

    //方式一: List集合注入Bean
    @Bean   //告知这个Bean将会交给Spring进行管理
    public List<String> stringList(){
        //List集合有序可重复
        List<String> list = new ArrayList<String>();
        list.add("111");
        list.add("222");
        list.add("333");
        return list;
    }

    @Bean("stringList1")   //告知这个Bean将会交给Spring进行管理, 指定Bean的Id
    public List<String> stringList1(){
        //List集合有序可重复
        List<String> list = new ArrayList<String>();
        list.add("1111");
        list.add("2222");
        list.add("3333");
        return list;
    }

    //方式二:List集合注入Bean,   注意类型一定要与List集合的类型一致
    @Bean
    @Order(100)  //@Order注解指定顺序
    public String string1(){
        return "444";
    }
    @Bean
    @Order(1)
    public String string2(){
        return "555";
    }
    @Bean
    @Order(50)
    public String string3(){
        return "666";
    }

    //----------------------------------------------------------------//
    //方式一:Map集合注入Bean
    @Bean
    public Map<String, Integer> integerMap(){
        Map<String, Integer> map = new HashMap<>();
        map.put("aaa", 1111);
        map.put("bbb", 2222);
        map.put("ccc", 3333);
        return map;
    }

    //方式二:Map集合注入Bean,  注意类型一定要与Map集合的类型一致
    @Bean("int1")
    public Integer integer1(){
        return 10001;
    }
    @Bean("int2")
    public Integer integer2(){
        return 10002;
    }


}

四、简单类型(String、Integer)直接注入Bean

@Component
public class MyBean6 {


    private String string;

    private Integer integer;

    public String getString() {
        return string;
    }

    @Value("没有了你,万杯觥筹只不是是提醒寂寞罢了")  //使用@Value注解直接注入值
    public void setString(String string) {
        this.string = string;
    }

    public Integer getInteger() {
        return integer;
    }

    @Value("1314")
    public void setInteger(Integer integer) {
        this.integer = integer;
    }

    @Override
    public String toString() {
        return "MyBean6{" +
                "string='" + string + '\'' +
                ", integer=" + integer +
                '}';
    }
}


五、SpringIoc容器内置接口注入Bean

@Component
public class MyBean7 {

    private ApplicationContext context;

    public ApplicationContext getContext() {
        return context;
    }

    @Autowired
    public void setContext(ApplicationContext context) {
        this.context = context;
    }

    @Override
    public String toString() {
        return "Mybean7{" +
                "context=" + context +
                '}';
    }
}

在这里,除了可以直接将ApplicationContext注入进来之外,还可以注入BeanFactory、Environment、ResourceLoader、ApplicationEventPublisher、MessageSource及其实现类。

完整代码见github:https://github.com/JavaCodeMood/spring-bean-demo





1人推荐
随时随地看视频
慕课网APP