Spring journey -- JavaConfig 装配 Bean
2017-02-27 22:36
267 查看
自动化装配 Bean :
给你需要装配的 Bean 添加一个@Component 注解;
写一个 Config 类,给它添加一个@ComponentCan 注解,启用应用组件扫描,扫描到 JavaConfig 类所在的包及其所在包的子包中所有包含@Component 注解的类,还要在这个 Config 类的顶部加一个@Configuration 注解。
这是上一篇中提到的。
介绍另外一种装配 Bean 的方法:通过 Java 代码装配 Bean,和上面还有一些不太一样的地方,但是是会比上面的那种方法要笨一些。还是会有一些情景下会用得到,比如你想将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上面用@Component 和 @Autowired 注解的。这时候就会用到显式装配,有两种可选:Java 和 XML。 但是推荐的是 JavaConfig 的方式,因为它对重构更友好。
JavaConfig 是配置代码,不应该包含任何业务逻辑。通常会把它放到单独的包中。
配置类:
可以看到把@Component 注解注释掉了。
声明 Bean :
默认情况下,bean 的 ID 与还有@Bean 注解的方法名是一样。但是也可以通过 name 属性指定一个名字:
现在应该考虑怎么把一个 Bean 注入到另一个 Bean 中了:
从上面的两个 Bean 看,cdPlayer()并没有使用默认的构造器构建实例(即 new CDPlayer()),而是调用了需要传入 CompactDisc 对象的构造器来创建 CDPlayer 实例。看起来 CompactDisc 是通过调用 sgtPeppers()得到的,但情况并不是这样,sgtPeppers()方法上面添加了@Bean注解,Spring 将会拦截所有对它的调用,并确保直接返回该方法所创建的 Bean,而不是每次都对其进行实际的调用,因为在默认情况下,Spring 中的
Bean 都是单例的。
下面是最佳选择:
现在的 CDPlayerTest 类是这么写的:
运行之后就可以看到绿条了:
只是介绍多一种可选的装配 Bean 的方法,没有其他太多......
给你需要装配的 Bean 添加一个@Component 注解;
写一个 Config 类,给它添加一个@ComponentCan 注解,启用应用组件扫描,扫描到 JavaConfig 类所在的包及其所在包的子包中所有包含@Component 注解的类,还要在这个 Config 类的顶部加一个@Configuration 注解。
这是上一篇中提到的。
介绍另外一种装配 Bean 的方法:通过 Java 代码装配 Bean,和上面还有一些不太一样的地方,但是是会比上面的那种方法要笨一些。还是会有一些情景下会用得到,比如你想将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上面用@Component 和 @Autowired 注解的。这时候就会用到显式装配,有两种可选:Java 和 XML。 但是推荐的是 JavaConfig 的方式,因为它对重构更友好。
JavaConfig 是配置代码,不应该包含任何业务逻辑。通常会把它放到单独的包中。
配置类:
package com.springinaction.soundsystem; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /** * Created by user on 2/21/17. */ @Configuration //@ComponentScan(basePackageClasses = {CDPlayer.class, MediaPlayer.class}) public class CDPlayerConfig { }
可以看到把@Component 注解注释掉了。
声明 Bean :
@Bean public CompactDisc sgtPeppers(){ return new SgtPeppers(); }
默认情况下,bean 的 ID 与还有@Bean 注解的方法名是一样。但是也可以通过 name 属性指定一个名字:
@Bean(name = "stayFocus") public CompactDisc sgtPeppers(){ return new SgtPeppers(); }
现在应该考虑怎么把一个 Bean 注入到另一个 Bean 中了:
@Bean public CDPlayer cdPlayer(){ return new CDPlayer(sgtPeppers()); }
从上面的两个 Bean 看,cdPlayer()并没有使用默认的构造器构建实例(即 new CDPlayer()),而是调用了需要传入 CompactDisc 对象的构造器来创建 CDPlayer 实例。看起来 CompactDisc 是通过调用 sgtPeppers()得到的,但情况并不是这样,sgtPeppers()方法上面添加了@Bean注解,Spring 将会拦截所有对它的调用,并确保直接返回该方法所创建的 Bean,而不是每次都对其进行实际的调用,因为在默认情况下,Spring 中的
Bean 都是单例的。
下面是最佳选择:
@Bean public CDPlayer cdPlayer(CompactDisc compactDisc){ return new CDPlayer(compactDisc); }
现在的 CDPlayerTest 类是这么写的:
package com.springinaction.soundsystem;
import static org.junit.Assert.*;
import org.junit.Rule;
import org.junit.Test;
import org.junit.contrib.java.lang.system.StandardOutputStreamLog;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* Created by user on 2/21/17.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest {
// @Autowired
// private CompactDisc sgtPeppers;
// @Autowired
// private CDPlayer cdPlayer;
@Bean public CompactDisc sgtPeppers(){ return new SgtPeppers(); }
@Bean public CDPlayer cdPlayer(CompactDisc compactDisc){ return new CDPlayer(compactDisc); }
@Rule
public final StandardOutputStreamLog log = new StandardOutputStreamLog();
@Test
public void cdShouldNotBeNull(){
assertNotNull(new CDPlayerTest().sgtPeppers());
}
@Test
public void play(){
new CDPlayerTest().cdPlayer(new CDPlayerTest().sgtPeppers()).play();
assertEquals("Playing Sgt. Pepper's Lonly Hearts Club Band by The Beatles\n",log.getLog());
}
}
运行之后就可以看到绿条了:
只是介绍多一种可选的装配 Bean 的方法,没有其他太多......
相关文章推荐
- 装配Bean:JavaConfig@Component@ComponentScan@Configuration
- 第2章 装配Bean---xml和javaConfig混合使用装配---笔记5
- 装配Bean:XML与JavaConfig混合装配
- Spring Bean之JavaConfig自动化装配bean
- spring对于bean的javaconfig,xml,自动装配三种装配方式实现
- spring笔记:第二章(通过javaconfig类装配bean)
- 【Spring 核心】装配bean(二) JavaConfig装配
- spring实战-JavaConfig装配bean
- 从零开始的spring 之 脱离web下的spring 上 (javaconfig装配bean)
- 装配Bean:JavaConfig@Bean@Configuration
- Spring in action 02 -- 装配 Bean(JavaConfig)遇到的问题
- [Java] Spring 3.0 /id.vs.name/简单属性的注入/bean中的scope属性/集合注入/自动装配/生命周期/
- Axis2(7):将Spring的装配JavaBean发布成WebService
- 【Java.Spring.Core】【IoC】基于注解的Bean装配(非XML配置)
- WebService大讲堂之Axis2(7) 将Spring的装配JavaBean发布成WebService
- axis2开发webservice之将Spring的装配JavaBean发布成WebService
- java spring - 自动装配Bean 注解大全
- Java乔晓松-spring自动装配Bean的4种方式
- 11级_Java_曹建波 05.06 Spring的autowire自动装配bean的四种方式
- Spring学习(16)--- 基于Java类的配置Bean 之 基于泛型的自动装配(spring4新增)