Sping装配bean主要有三种装配机制:
在XML中进行显式配置。
在Java中进行显式配置。
隐式的bean发现机制和自动装配。
原则:
建议尽可能地使用自动配置的机制,显式配置越少越好。当你必须要显式配置bean的时候(比如,有些源码不是由你来维护的,而当你需要为这些代码配置bean的时候),我推荐使用类型安全并且比XML更加强大的JavaConfig。最后,只有当你想要使用便利的XML命名空间,并且在JavaConfig中没有同样的实现时,才应该使用XML。
Spring从两个角度来实现自动化装配:
组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean。
自动装配(autowiring):Spring自动满足bean之间的依赖
@Component注解:添加注解表明该类会作为组件类,并告知Spring要为这个类创建bean。
<code>package</code> <code>bean;</code>
<code>import</code> <code>org.springframework.stereotype.Component;</code>
<code>@Component</code>
<code>public</code> <code>class</code> <code>Category {</code>
<code> </code><code>private</code> <code>int</code> <code>cateId;</code>
<code> </code><code>public</code> <code>int</code> <code>getCateId() {</code>
<code> </code><code>return</code> <code>this</code><code>.cateId;</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>void</code> <code>setCateId(</code><code>int</code> <code>id) {</code>
<code> </code><code>this</code><code>.cateId = id;</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>String toString() {</code>
<code> </code><code>return</code> <code>" 商品类型 id="</code> <code>+ </code><code>this</code><code>.cateId;</code>
<code>}</code>
①使用XML来启用组件扫描,在applicationContext.xml配置:
<code><context:component-scan base-</code><code>package</code><code>=</code><code>"autowire.bean"</code><code>></context:component-scan></code>
单元测试:
<code>@ContextConfiguration</code><code>(locations = </code><code>"classpath*:applicationContext.xml"</code><code>)</code>
<code>@RunWith</code><code>(SpringJUnit4ClassRunner.</code><code>class</code><code>)</code>
<code>public</code> <code>class</code> <code>testAutowireXml {</code>
<code> </code><code>@Autowired</code>
<code> </code><code>private</code> <code>Category category;</code>
<code> </code><code>@Test</code>
<code> </code><code>public</code> <code>void</code> <code>TestXmlBean() {</code>
<code> </code><code>Assert.assertNotNull(category);</code>
②使用java配置
前面的bean类不做任何调整,通过@ComponentScan注解实现自动扫描。例如新建java配置文件BeanConfig.java
<code>@Configuration</code>
<code>@ComponentScan</code><code>(basePackageClasses = bean.Category.</code><code>class</code><code>)</code>
<code>public</code> <code>class</code> <code>BeanConfig {</code>
<code>@ContextConfiguration</code><code>(classes = BeanConfig.</code><code>class</code><code>)</code>
<code>public</code> <code>class</code> <code>testAutowireJava {</code>
<code> </code><code>public</code> <code>void</code> <code>categoryNotNull() {</code>
上面的BeanConfig就是用java config方式实现的。java Config也是一个java类,但它不应该包含任何业务逻辑,也不应该侵入到业务逻辑代码之中,通常会将JavaConfig放到单独的包中。
创建java config关键是使用@Configuration ,表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。
在JavaConfig中声明bean,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解。
我们新建一个config文件JavaConfig.java,是在BeanConfig.java基础上去掉@ComponentScan注解,并添加category()返回Category实例。
<code>public</code> <code>class</code> <code>JavaConfig {</code>
<code> </code><code>@Bean</code>
<code> </code><code>public</code> <code>Category category(){</code>
<code> </code><code>return</code> <code>new</code> <code>Category();</code>
<code>@ContextConfiguration</code><code>(classes = JavaConfig.</code><code>class</code><code>)</code>
<code>public</code> <code>class</code> <code>testJavaConfig {</code>
<code> </code><code>public</code> <code>void</code> <code>testCategoryBean(){</code>
①首先为Category添加构造函数:
<code> </code><code>public</code> <code>Category() {</code>
<code> </code><code>public</code> <code>Category(</code><code>int</code> <code>id) {</code>
<code> </code><code>cateId = id;</code>
<code> </code><code>this</code><code>.cateId = id;</code>
②applicationContext添加bean节点,为constructor-arg设置Id或者index。
<code><bean </code><code>class</code><code>=</code><code>"bean.Category"</code><code>></code>
<code> </code><code><constructor-arg name=</code><code>"id"</code> <code>value=</code><code>"100"</code><code>></constructor-arg></code>
<code></bean></code>
或
<code> <constructor-arg index=</code><code>"0"</code> <code>value=</code><code>"100"</code><code>></constructor-arg></code>
③单元测试:
<code>……</code>
<code> </code><code>public</code> <code>void</code> <code>testId(){</code>
<code> </code><code>Assert.assertEquals(</code><code>100</code><code>,category.getCateId());</code>
④c-命名空间
这种语法用起来简化一些。

调整②中的bean节点:
<code><bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>c:_0=</code><code>"100"</code><code>></bean></code>
<code><bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>c:id=</code><code>"100"</code><code>></bean></code>
①通过为bean设置property实现属性
<code><bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>></code>
<code> </code><code><property name=</code><code>"cateId"</code> <code>value=</code><code>"100"</code><code>></property></code>
②p-命名空间
前面的bean配置可以简化为:
<code><bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>p:cateId=</code><code>"100"</code><code>></bean></code>
Spring支持将属性定义到外部的属性的文件中,并使用占位符值将其插入到Spring bean中。在Spring装配中,占位符的形式为使用“${ ... }”包装的属性名称。
config.properties:
<code>cateid=</code><code>100</code>
spring-config.xml:
<code><bean id=</code><code>"propertyConfigurer"</code> <code>class</code><code>=</code><code>"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"</code><code>></code>
<code> </code><code><property name=</code><code>"locations"</code><code>></code>
<code> </code><code><list></code>
<code> </code><code><value>classpath:properties/config.properties</value></code>
<code> </code><code></list></code>
<code> </code><code></property></code>
<code> </code><code></bean></code>
<code> </code><code><bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>p:cateId=</code><code>"${cateid}"</code><code>></bean></code>
本文转自 陈敬(Cathy) 博客园博客,原文链接:http://www.cnblogs.com/janes/p/6868149.html,如需转载请自行联系原作者