Spring | Spring通過註解注入Bean的四種方式

Spring

註解的方式注入Bean

官方定義:IoC又叫依賴注入(DI)。它描述了對象的定義和依賴的一個過程。依賴的對象通過構造參數、工廠方法參數或者屬性注入,當對象實例化後依賴的對象才被創建,當創建bean後容器注入這些依賴對象。這個過程基本上是反向的。

方法詳情

1.在Spring中,一個類我們爲它加上註解就可以被識別爲一個Bean。

例如你在一個類上加上一個@Component註解,它在配置類的@ComponentScan註解掃描的包下,或者把這給個類在配置類中加上@Bean註解,那麼它就被識別爲Bean,加入到Spring容器裏。

@Component
public class FirstBean {

}

或者直接把這個類在Spring配置類裏實例化然後使用@Bean註解。

@Configuration
@ComponentScan("com.imooc.spring.demo")
public class SpringBeanConfiguration {

    @Bean
    public FirstBean firstBean() {
        return new FirstBean();
    }
}
2.在一個Bean中調用另外一個Bean,就需要依賴注入。
@Component
public class SecondBean {
    private FirstBean firstBean;

    @Autowired
    public SecondBean(FirstBean firstBean) {
        this.firstBean = firstBean;
    }
    
    @Override
    public String toString() {
        return "SecondBean{firstBean=" + firstBean + '}';
    }
}

一個Bean要調用另一個Bean,直接調用是允許的,需要通過自動裝配註解@Autowired進行依賴注入才能達成目的。

常用註解

註解 解釋
@Configuration 標記的類是配置類
@ComponentScan(“包”) 指定哪個包,就掃描哪個包下的註解並識別。
@Autowired Bean的自動裝配,可以標註在類的屬性、方法及構造函數上。
@Component 把普通類標記爲Bean,加入到容器裏,並且是單例模式。
@Bean 定義一個Bean對象,加入到Spring容器裏
@Order(數字) 容器加載Bean的優先級,數字越小優先級越高

場景

我們將構造方法注入、工廠方法注入或者屬性注入三種注入方式進行細化,依賴注入的方式具體如下:

  • 構造方法注入Bean
  • Set方法注入Bean
  • 屬性注入Bean
  • 集合的方式注入

示例

首先通過Configuration和@ComponentScan創建一個Spring的配置類。

@Configuration
@ComponentScan("com.imooc.spring.demo.bean")//項目的包名
public class SpringBeanConfiguration {
}

新建一個類FirstBean,通過@Component註解標記爲Bean,加入到Spring容器裏。

@Component
public class FirstBean {

}

通過構造方法注入

@Component
public class SecondBean {
    private FirstBean firstBean;

    @Autowired
    public SecondBean(FirstBean firstBean) {
        this.firstBean = firstBean;
    }
    
    @Override
    public String toString() {
        return "SecondBean{firstBean=" + firstBean + '}';
    }
}

通過Set方法注入

@Component
public class ThirdBean {
    private FirstBean firstBean;

    @Autowired
    public void setFirstBean(FirstBean firstBean) {
        this.firstBean = firstBean;
    }

    @Override
    public String toString() {
        return "ThirdBean{firstBean=" + firstBean + '}';
    }
}

通過屬性注入

@Component
public class FourthBean {
    @Autowired
    private FirstBean firstBean;

    @Override
    public String toString() {
        return "FourthBean{firstBean=" + firstBean + '}';
    }
}
屬性注入時,private私有屬性,Spring是通過反射去加載它到Spring容器裏的。

通過集合注入Bean

新建一個類FifthBean,標記爲Bean。 加入一個List類型 的屬性,用@Autowired注入。
在配置類中對加入一個返回值爲List的方法或者加兩個返回String的方法,使用Bean註解,這樣就完成集合的賦值。

@Component
public class FifthBean {
    @Autowired
    private List<String> stringList;

    public List<String> getStringList() {
        return stringList;
    }
}
@Configuration
@ComponentScan("com.imooc.spring.demo")
public class SpringBeanConfiguration {

    @Bean
    public List<String> stringList() {
        List<String> list = new ArrayList<>();
        list.add("hello");
        list.add("imooc");
        return list;
    }
}
@Configuration
@ComponentScan("com.imooc.spring.demo")
public class SpringBeanConfiguration {

    @Bean
    public String firstString() {
        return "bye";
    }
    @Bean
    public String secondString() {
        return "imooc";
    }
}
第二種方式的優先級高於第一種,兩種同時存在時Spring默認使用第二種,若要控制優先級要使用@Order註解來控制優先級順序。

測試方法

class BeanDeoTest {

    @Test
    public void test() {
        ApplicationContext applicationContext =
        AnnotationConfigApplicationContext(SpringBeanConfiguration.class);
        SecondBean secondBean = applicationContext.getBean("secondBean", SecondBean.class);
        ThirdBean thirdBean = applicationContext.getBean("thirdBean", ThirdBean.class);
        System.out.println(secondBean.toString());
        System.out.println(thirdBean.toString());
    }
}

ApplicationContext用來獲取配置類,getBean函數用來獲取指定的Bean對象。

Tips

1. 只有@ComponentScan掃描的包下的被@Component標記的類才能識別爲Bean。
2. 測試時你會發現所有的FristBean對象都是一個地址,說明@Component是單例模式的。

知識對比

對比幾種裝配Bean的方式

  • XML注入

最原始的裝配Bean的方式是XML語句,這也是Spring最早的注入方式。

<context:component-scan base-package="com.imooc.spring.demo"/>
<bean id="firstbean" class="FirstBean" />
  • 代碼方式注入

上文的測試類就是使用ApplicationContext進行上下文的獲取,然後通過getBean進行Bean的注入。

ApplicationContext applicationContext = 
new AnnotationConfigApplicationContext(SpringBeanConfiguration.class);
SecondBean secondBean = applicationContext.getBean("secondBean", SecondBean.class);

註解注入的優點

  • 簡潔明瞭,用註解代替大量的XML配置,降低了開發成本,節省了開發量。
  • 不用在.java文件和.xml文件中不斷切換,提升開發的效率。

個人經驗

  • 使用統一裝配規則,開發時,一般使用統一的裝配規則,要麼就是全部註解方式,要麼就是全部XML方式。然後搭配BeanFactory 或者 ApplicationContext進行Bean的注入。非特殊情況避免註解和XMl結合使用。
  • 推薦使用註解方式。當今互聯網產品飛速迭代的情況下,成熟的互聯網項目整體都是千萬甚至上億行代碼,使用XML的成本會相當的高,註解已經是一種發展的趨勢。

程序員乾貨,職場必備技能,科技前沿資訊,盡在Mess科技!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章