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的方式
最原始的裝配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科技!