Spring 容器的元數(shù)據(jù)可以基于注解配置,它比 XML 配置更簡潔拂蝎,而且提供了更多的上下文配置穴墅。
兩種配置方式各有優(yōu)缺點(diǎn),XML 配置不會(huì)侵入源代碼温自,配置修改后不需要重新編譯源文件玄货。
你可以在項(xiàng)目中任意選擇哪種配置方式,或者兩者混合使用悼泌。
參閱上一篇《Spring基于XML配置的容器》
一松捉、Bean 管理
Spring 通過掃描指定包路徑下所有的類(包括子包下的類),來尋找哪些類是要容器管理的馆里。
默認(rèn)情況下隘世,根據(jù)類是否存在 @Component
注解(或其組合注解)來判斷是否由容器管理。
1. 掃描類路徑配置
基于 XML 配置
在 XML 配置文件中使用 context:component-scan
來配置掃描的包路徑鸠踪。
<beans>
<context:component-scan base-package="cn.codeartist.spring.bean.annotation"/>
</beans>
使用 ClassPathXmlApplicationContext
來實(shí)例化容器丙者。
public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("bean-annotation.xml");
BeanExample beanExample = (BeanExample) applicationContext.getBean("beanExample");
}
基于注解配置
定義類并使用 @Configuration
和 @ComponentScan
來配置掃描的包路徑。
@Configuration
@ComponentScan(basePackages = "cn.codeartist.spring.bean.annotation")
public class AppConfig {
}
@ComponentScan
可以不指定 basePackages营密,默認(rèn)掃描類(AppConfig
)所在的包路徑械媒。
使用 AnnotationConfigApplicationContext
來實(shí)例化容器。
public static void main(String[] args) {
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
BeanExample beanExample = (BeanExample) applicationContext.getBean("beanExample");
}
2. 使用注解管理 Bean
在掃描的包下面评汰,在類上面使用 @Component
注解來注冊 Bean滥沫。
@Component
public class BeanExample {
private String name;
private Integer year;
// Getter and setter
}
為了更明確 Bean 的業(yè)務(wù)用途侣集,體現(xiàn)項(xiàng)目的分層結(jié)構(gòu)键俱,Spring 還提供了 @Service
兰绣、@Repository
和 @Controller
等注解。
這些注解默認(rèn)使用類名小駝峰格式作為 Bean 名稱编振,也可以通過注解的 value
屬性來指定缀辩。
BeanExample -> beanExample
Bean 作用域
使用 @Scope
注解來指定 Bean 的作用域。
@Component
@Scope("singleton")
public class BeanExample {
private String name;
private Integer year;
}
作用域類型參閱《Spring基于XML配置的容器》
二踪央、依賴管理
在基于 XML 配置容器中臀玄,使用 context:annotation-config
來配置注解注入。
<beans>
<context:annotation-config/>
</beans>
如果 XML 配置文件中存在
context:component-scan
畅蹂,則不需要配置context:annotation-config
健无。
Spring 通常使用 @Autowired
和 @Resource
注解注入 Bean 依賴,@Autowired
注解默認(rèn)通過類型注入液斜。
@Resource
注解默認(rèn)通過名稱注入累贤,只有匹配不到對(duì)應(yīng)名稱的 Bean,才會(huì)按類型注入少漆。
1. 依賴注入
1.1 字段注入
直接在字段上面使用注解注入依賴臼膏。
@Component
public class BeanExample {
private String name;
private Integer year;
@Autowired
private BeanProvider beanProvider;
}
1.2 構(gòu)造器注入
在構(gòu)造器方法上使用注解注入依賴。
@Component
public class BeanExample {
private String name;
private Integer year;
private BeanProvider beanProvider;
@Autowired
public BeanExample(BeanProvider beanProvider) {
this.beanProvider = beanProvider;
}
}
Spring 4.3.x 版本后示损,構(gòu)造器注入可以不用寫注解渗磅。
1.3 Setter 方法注入
在 Setter 方法上使用注解注入依賴。
@Component
public class BeanExample {
private String name;
private Integer year;
private BeanProvider beanProvider;
@Autowired
public void setBeanProvider(BeanProvider beanProvider) {
this.beanProvider = beanProvider;
}
}
2. 依賴關(guān)系
使用 @DependsOn
注解指定依賴關(guān)系检访。
@Component
@DependsOn("beanProvider")
public class BeanExample {
private String name;
private Integer year;
private BeanProvider beanProvider;
// Getter and setter
}
3. 懶加載
使用 @Lazy
注解配置懶加載始鱼。
@Lazy
@Component
public class BeanProvider {
// Fields
// Getter and setter
}
懶加載 Bean 在注入的地方也要加上 @Lazy
注解,或者使用 ApplicationContext.getBean()
方法獲取 Bean脆贵,才能使懶加載生效医清。
@Component
public class BeanExample {
private String name;
private Integer year;
@Lazy
@Autowired
private BeanProvider beanProvider;
}
三、附錄
1. 配置屬性
屬性 | 描述 |
---|---|
context:component-scan |
在基于 XML 配置容器中丹禀,指定掃描包路徑 |
context:annotation-config |
在基于 XML 配置容器中状勤,啟用注解注入依賴 |
2. 常用注解
注解 | 描述 |
---|---|
@Configuration |
指定 Bean 的配置類 |
@ComponentScan |
(默認(rèn)為類所在的包)指定包路徑,該包下的類由容器管理 |
@Component |
指定該類由 Spring 容器管理 |
@Service |
與 @Component 一致双泪,通常在業(yè)務(wù)層使用 |
@Repository |
與 @Component 一致持搜,通常在數(shù)據(jù)層使用 |
@Controller |
與 @Component 一致,通常在控制層使用 |
@Autowired |
配置自動(dòng)注入焙矛,優(yōu)先通過類型注入 |
@Resource |
配置自動(dòng)注入葫盼,優(yōu)先通過名稱注入 |
@Scope |
指定 Bean 的作用域 |
@DependsOn |
指定 Bean 的依賴關(guān)系 |
@Lazy |
配置懶加載 |
3. 示例代碼
Gitee 倉庫:https://gitee.com/code_artist/spring
項(xiàng)目模塊:spring-ioc
示例路徑:cn.codeartist.spring.bean.annotation
歡迎關(guān)注碼匠公眾號(hào):CodeArtist,更多干貨文章首發(fā)村斟!