一、概要
Sping装配bean主要有三种装配机制:
- 在XML中进行显式配置。
- 在Java中进行显式配置。
- 隐式的bean发现机制和自动装配。
原则:
建议尽可能地使用自动配置的机制,显式配置越少越好。当你必须要显式配置bean的时候(比如,有些源码不是由你来维护的,而当你需要为这些代码配置bean的时候),我推荐使用类型安全并且比XML更加强大的JavaConfig。最后,只有当你想要使用便利的XML命名空间,并且在JavaConfig中没有同样的实现时,才应该使用XML。
二、自动装配
Spring从两个角度来实现自动化装配:
- 组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean。
- 自动装配(autowiring):Spring自动满足bean之间的依赖
1.组件扫描
@Component注解:添加注解表明该类会作为组件类,并告知Spring要为这个类创建bean。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package
bean;
import
org.springframework.stereotype.Component;
@Component
public
class
Category {
private
int
cateId;
public
int
getCateId() {
return
this
.cateId;
}
public
void
setCateId(
int
id) {
this
.cateId = id;
}
@Override
public
String toString() {
return
" 商品类型 id="
+
this
.cateId;
}
}
|
2.启用组件扫描两种方式:
①使用XML来启用组件扫描,在applicationContext.xml配置:
1
|
<context:component-scan base-
package
=
"autowire.bean"
></context:component-scan>
|
单元测试:
1
2
3
4
5
6
7
8
9
10
11
12
|
@ContextConfiguration
(locations =
"classpath*:applicationContext.xml"
)
@RunWith
(SpringJUnit4ClassRunner.
class
)
public
class
testAutowireXml {
@Autowired
private
Category category;
@Test
public
void
TestXmlBean() {
Assert.assertNotNull(category);
}
}
|
②使用java配置
前面的bean类不做任何调整,通过@ComponentScan注解实现自动扫描。例如新建java配置文件BeanConfig.java
1
2
3
4
|
@Configuration
@ComponentScan
(basePackageClasses = bean.Category.
class
)
public
class
BeanConfig {
}
|
单元测试:
1
2
3
4
5
6
7
8
9
10
11
12
|
@RunWith
(SpringJUnit4ClassRunner.
class
)
@ContextConfiguration
(classes = BeanConfig.
class
)
public
class
testAutowireJava {
@Autowired
private
Category category;
@Test
public
void
categoryNotNull() {
Assert.assertNotNull(category);
}
}
|
三、JavaConfig装配bean
上面的BeanConfig就是用java config方式实现的。java Config也是一个java类,但它不应该包含任何业务逻辑,也不应该侵入到业务逻辑代码之中,通常会将JavaConfig放到单独的包中。
创建java config关键是使用@Configuration ,表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。
在JavaConfig中声明bean,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解。
我们新建一个config文件JavaConfig.java,是在BeanConfig.java基础上去掉@ComponentScan注解,并添加category()返回Category实例。
1
2
3
4
5
6
7
8
|
@Configuration
public
class
JavaConfig {
@Bean
public
Category category(){
return
new
Category();
}
}
|
单元测试:
1
2
3
4
5
6
7
8
9
10
11
12
|
@RunWith
(SpringJUnit4ClassRunner.
class
)
@ContextConfiguration
(classes = JavaConfig.
class
)
public
class
testJavaConfig {
@Autowired
private
Category category;
@Test
public
void
testCategoryBean(){
Assert.assertNotNull(category);
}
}
|
四、XML方式装配bean
在JAVA入门[3]—Spring依赖注入这篇笔记中包含了如何通过xml方式装配bean实例。
1.构造器传参
①首先为Category添加构造函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public
class
Category {
private
int
cateId;
public
Category() {
}
public
Category(
int
id) {
cateId = id;
}
public
int
getCateId() {
return
this
.cateId;
}
public
void
setCateId(
int
id) {
this
.cateId = id;
}
@Override
public
String toString() {
return
" 商品类型 id="
+
this
.cateId;
}
}
|
②applicationContext添加bean节点,为constructor-arg设置Id或者index。
1
2
3
|
<bean
class
=
"bean.Category"
>
<constructor-arg name=
"id"
value=
"100"
></constructor-arg>
</bean>
|
或
1
2
3
|
<bean
class
=
"bean.Category"
>
<constructor-arg index=
"0"
value=
"100"
></constructor-arg>
</bean>
|
③单元测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@ContextConfiguration
(locations =
"classpath*:applicationContext.xml"
)
@RunWith
(SpringJUnit4ClassRunner.
class
)
public
class
testAutowireXml {
@Autowired
private
Category category;
……
@Test
public
void
testId(){
Assert.assertEquals(
100
,category.getCateId());
}
}
|
④c-命名空间
这种语法用起来简化一些。
调整②中的bean节点:
1
|
<bean
class
=
"bean.Category"
c:_0=
"100"
></bean>
|
或
1
|
<bean
class
=
"bean.Category"
c:id=
"100"
></bean>
|
2.设置属性 :
①通过为bean设置property实现属性
1
2
3
|
<bean
class
=
"bean.Category"
>
<property name=
"cateId"
value=
"100"
></property>
</bean>
|
②p-命名空间
前面的bean配置可以简化为:
1
|
<bean
class
=
"bean.Category"
p:cateId=
"100"
></bean>
|
五、属性占位符
Spring支持将属性定义到外部的属性的文件中,并使用占位符值将其插入到Spring bean中。在Spring装配中,占位符的形式为使用“${ ... }”包装的属性名称。
config.properties:
1
|
cateid=
100
|
spring-config.xml:
1
2
3
4
5
6
7
8
9
|
<bean id=
"propertyConfigurer"
class
=
"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
>
<property name=
"locations"
>
<list>
<value>classpath:properties/config.properties</value>
</list>
</property>
</bean>
<bean
class
=
"bean.Category"
p:cateId=
"${cateid}"
></bean>
|
示例代码:https://github.com/cathychen00/learnjava/tree/master/DemoBean
本文转自 陈敬(Cathy) 博客园博客,原文链接:http://www.cnblogs.com/janes/p/6868149.html,如需转载请自行联系原作者