@Component和@Bean註解的區別和聯絡

2021-03-09 12:01:30

上一篇講了@Autowired和@Resource註解的聯絡區別(十分詳細,不看後悔),今天繼續講@Component和@Bean註解的區別和聯絡

同樣的,先說聯絡

聯絡

@Component@Bean註解的目的一樣,都是註冊bean到IOC容器中

區別

  1. @Component 註解作用於類,而@Bean註解作用於方法
  2. @Component 註解是通過類路徑掃描來自動裝配到IOC容器中的,而@Bean註解是將方法返回值作為bean裝載到IOC容器中
  3. @Bean註解比@Component註解的自定義性更強,而且很多地方我們只能通過@Bean註解來註冊bean。比如當我們參照第三方庫中的類需要裝配到Spring容器時,則只能通過@Bean來實現而不能通過@Component註解來實現(其實很好理解:你總不能在第三方類上加@Component註解吧)。當然,還有一個註解@Import也可以用來把第三方類匯入到IOC容器中,有興趣的可以自行了解一下:spring註解之@Import註解的三種使用方式

@Component註解的使用

直接加在類上,再通過掃描該類所在路徑,在容器初始化時就把該類作為bean新增到IOC容器中了

很多時候其實你看到的並不是@Component,而有可能是@Controller@Service@Reporsitory,其實本質上都是一樣的,你點進這些註解,會發現其實還是@Component,如下:
在這裡插入圖片描述
拆分成@Controller@Service@Reporsitory的原因是為了方便區分MVC三層架構,分別代表controller層、service和dao層,一般當一個類都不屬於其中一層的時候才採用@Component註解

上面已經說到,是通過掃描加了@Component註解的類所在的包來將其加入IOC容器的,在很多SSM(Spring+SpringMVC+Mybatis)的專案中,Spring是通過xml來設定的,通過在xml設定中加入<context:component-scan base-package=」」>來掃描該類所在的包;而在SpringBoot中則是通過@ComponentScan註解來掃描包的,只要加了@Component註解的類所在的包在加了@ComponentScan註解的類所在包及其子包路徑下就可以了,而@ComponentScan則是通過啟動類上的@SpringBootApplication註解來實現的
在這裡插入圖片描述

@Bean註解的使用

@Bean註解通常是寫在宣告了@Configuration註解的類中的方法上,這其實就是替換xml組態檔的另一種寫法:設定類,關於@Configuration註解不太清楚的可以看這裡:@Configuration的使用和作用

舉例:

@Configuration
public class TestConfig {
    @Bean
    public UserService userService() {
        return new UserServiceImpl();
    }
}

就相當於:

<beans>
	<bean id="userService" class="com.test.UserServiceImpl">
	</bean>
</beans>

方法名就相當於id,當然也可以加上name或value屬性顯式指定其id

參考:大白話講解Spring的@bean註解

如有錯誤,歡迎評論區糾錯~