上一篇講了@Autowired和@Resource註解的聯絡區別(十分詳細,不看後悔),今天繼續講@Component和@Bean註解的區別和聯絡
同樣的,先說聯絡
@Component
和@Bean
註解的目的一樣,都是註冊bean到IOC容器中
@Component
註解作用於類,而@Bean
註解作用於方法@Component
註解是通過類路徑掃描來自動裝配到IOC容器中的,而@Bean
註解是將方法返回值作為bean裝載到IOC容器中@Bean
註解比@Component
註解的自定義性更強,而且很多地方我們只能通過@Bean
註解來註冊bean。比如當我們參照第三方庫中的類需要裝配到Spring
容器時,則只能通過@Bean
來實現而不能通過@Component
註解來實現(其實很好理解:你總不能在第三方類上加@Component
註解吧)。當然,還有一個註解@Import
也可以用來把第三方類匯入到IOC容器中,有興趣的可以自行了解一下:spring註解之@Import註解的三種使用方式直接加在類上,再通過掃描該類所在路徑,在容器初始化時就把該類作為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
註解通常是寫在宣告了@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
如有錯誤,歡迎評論區糾錯~