在Spring中,使用 @Component@Bean 来创建Bean实例,并让Spring容器管理其生命周期。

@Component是对应某一个类,表明该类作为组件类,配合 @ComponentScan 使用,然后让 Spring IOC 容器实例化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Slf4j
@Component
public class MsgProducer {
@Autowired
private RabbitTemplate rabbitTemplate;

public void sendMsg(String msg) {
log.info("发送消息:{}", msg);
rabbitTemplate.convertAndSend(EXCHANGE_IM_NAME,
QUEUE_IM_NAME,
msg,
message -> {
message.getMessageProperties().setDelay(10000);
return message;
}
);
}
}

@Component(@Controller、@Service、@Repository)通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。SpringBoot中,默认扫描全包,如果显式使用 @ComponentScan 的话需要注意

@Bean 对应一个返回对象的方法,表明该对象要注册为Spring上下文中的bean, 配合 @Confiuration使用,在配置文件中,返回的是某个对象的实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Configuration
public class RestTemplateConfig {

@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
return new RestTemplate(factory);
}

@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(5000);//ms
factory.setConnectTimeout(15000);//ms
return factory;
}

}

使用@Component@Bean 配置的类,都可以通过@Autowired装配

1
2
3
4
5
6
7
8


@Autowired
private MsgProducer sender;

@Autowired
private RestTemplate restTemplate;

@Bean@Component 的自定义性更强,可以实现一些 @Component 实现不了的自定义加载类(例如想让第三方类变成组件,没有源码就不能用@Component的形式。这时候使用@Bean就比较合适)。