最近在看《spring实战》一书,记录下spring装配bean这一章中自己学到的一些知识点。
下面简单说明下bean和装配这两个概念的意思。
- bean:在spring中代表组件,通过bean将不同的组件联系在一起。
- 装配:是指创建应用对象之间协作关系的行为
配置方案
- 在xml中显式配置
- 在java中显式配置
- 隐式的bean发现机制和自动装配(最方便)
详细介绍一下三种配置方式
xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!--声明使用注解-->
<context:annotation-config/>
//声明CatTest为名为cat的bean
<bean id="cat" class="com.vdian.CatTest">
</bean>
</beans>
注入初始化值
在Spring中可以使用元素配置Bean的属性,在实例化bean时调用setAge方法给age的属性赋值为10。
<bean id="cat"
class="com.vdian.CatTest">
<property name="age" value="10" />
</bean>
比如我们在测试dubbo接口时,也是通过这种xml装配引入被测方接口。
以xml形式配置被测service:
<dubbo:reference id="mcItemService" interface="com.vdian.MCItemService" version="1.0"/>
然后通过@Autowired注解引入被测service:
@Autowired
MCService mcService;
java装配
@Configuration
public class CDPlayerConfig {
}
//@Configuration注解表示该类是一个配置类,要创建的bean的信息要放到这个类中。
然后通过注解@Bean声明bean。
@Bean
public CompactDisc sgtPeppers() {
return new SgtPeppers();
}
自动化装配
自动化装配bean实现原理
组件扫描:spring自动识别应用上下文中的bean
自动装配:spring自动满足bean之间的依赖
组件扫描流程是:
定义bean–>扫描bean–>注入bean
通过注解@component可以定义bean,如:
@Component
public class Car(){
//省略
}
然后通过注解@ComponentScan或者xml扫描bean,找到并创建bean。
注解方式:
@Configuration
@ComponentScan
public class Carfig(){
//省略
}
不配置时默认扫描同个package下面的bean,也可显示定义扫描的包名。
@ComponentScan(basePackages={"packageName"})
xml形式:
一般在工程中,我们更倾向在applicationContext.xml统一配置扫描路径,如下,扫描这个package下的所有bean。
<context:annotation-config/>
<context:component-scan base-package="com.vdian.test"/>
这里对spring注解类做一个小说明:
@component 是所有受Spring管理组件的通用形式(把普通pojo实例化到spring容器中,相当于配置文件中的)。
而@Repository、@Service和 @Controller则是@Component的细化,用来表示更具体的用例(例如,分别对应了持久化层、服务层和表现层)
自动装配:
通过spring注解@Autowired实现,表示该类依赖@Autowired注解的bean。
整体上推荐以自动装配为主,遇到第三方库无法自动装配时,采用java或xml装配。