0%

spring | @Configuration @Bean

这两个可以理解为人为主动向 spring IOC 中注册对象。

一般来说,spring IOC 的注册和使用流程如下。

但是,借助 @Configuration @Bean 可以进行人为注册,具体看下面例子。

编写一个接口类

1
2
3
public interface ArticleService {
void listArticle();
}

实现接口类

实现两个接口类。

第一个

1
2
3
4
5
6
7
public class ArticleServiceImpl implements ArticleService {

@Override
public void listArticle() {
System.out.println(1);
}
}

第二个

1
2
3
4
5
6
7
public class ArticleService2Impl implements ArticleService {

@Override
public void listArticle() {
System.out.println(2);
}
}

注意,这两个接口类,都没有用 @component @Repository @Service @Controller 修饰

人为注册 Bean

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class ArtImpl {

@Bean
public ArticleService articleServiceImpl() {
return new ArticleServiceImpl();
}

@Bean
public ArticleService articleService2Impl() {
return new ArticleService2Impl();
}
}

使用 Bean

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
@RequestMapping("/articles")
public class ArticleController {

@Resource(name = "articleServiceImpl")
public ArticleService articleService;

@GetMapping("/hello")
public int listArticle(@RequestParam(value = "id") int id) {
articleService.listArticle();
return id;
}
}

上面的 @Resource(name = "articleServiceImpl") 中的 articleServiceImpl,就是 人为注册 bean 中的第一个 Bean

Bean 和 @component @Repository @Service @Controller 区别

位置上

  • @Component: 作用于类上,告知Spring,为这个类创建Bean。通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。(@Controller、@Service、@Repository)。
  • @Bean:主要作用于方法或者注解上,告知Spring,这个方法会返回一个对象,且要注册在Spring的上下文中。通常方法体中包含产生Bean的逻辑。

使用

  • 作用都是一样的,都是注册beanSpring容器中。
  • 引用第三方库中的类需要装配到 Spring容器 时,则只能通过 @Bean 来实现。
请我喝杯咖啡吧~