目前了解的springboot中IOC注解主要分為兩類:
1. 注冊bean:@Component和@Repository、@Service、@Controller 、@Configuration
共同之處:這些注解都使用在類上,將類標識為Bean,由Spring掃描到后會生成一個單例bean放到容器中。
不同之處在於:
- @Component是一個泛化的概念,僅僅表示一個組件 (Bean) ,可以作用在任何層;
- @Repository、@Service、@Controller 都包含@Component注解
@Repository | 一般修飾持久層——Dao層 |
@Service | 一般修飾服務層(或業務層)——Service層 |
@Controller | 通常作用在控制層——Controller層 |
- @Configuration,在@Component的基礎上,會對修飾的類做一個增強(利用CGLIB動態代理)。它一般用來修飾配置類——Configuration文件夾。
注:在類上使用以上注解后,還可以用@Bean注解修飾方法,它很明確地告訴被注釋的方法產生一個Bean,然后交給Spring容器
!!!注意坑:
當你使用@Bean注冊的bean給SpringBoot框架使用時,方法名必須要與接口名或者類名一致才可以生效。如果是自己注冊的bean給自己用的話就可以隨便起
// 自動裝配到SpringBoot中 @Bean public LocaleResolver localeResolver() { return new MyLocaleResolver(); }
// 這里 LocaleResolver 是springboot中的接口,所以方法名必須是localeResolver 不然注冊不了
spring-boot推薦的編程思想是約定優於配置,這些固定名字的bean名字,就是這種編程思想的體理。必須叫這些約定俗成的名字。如果你改成別的名字,程序就無法成功運行。
1、如果是給框架使用的就要用約定的名字,但如果寫出來的bean是給自己使用的,就可以隨便寫,
就比如說這里的redis2Template名字,就是因為這個bean僅僅是用來給我自己在controller調用,所以並不需要按照約定的名字寫
@Bean(name = "redis2Template") public RedisTemplate<String, Object> redis2Template() throws Exception {}
2、但是像這個dataSource就是為了給框架使用的,所以不能隨便寫名字
@Bean(initMethod = "init", destroyMethod = "close") @Primary public DataSource dataSource() throws SQLException {}
3. 使用bean:@Autowired、@Resource
- @Autowired與@Resource都可以用來裝配bean, 都可以寫在字段上,或寫在setter方法上
- @Autowired默認以Type方式注入
- @Resource默認以Name方式注入,但它可以指定為Type方式(傳Type值即可),也可以指定為Name和Type同時皆有的方式(那么必須找到一個Bean,它的Name和Type同時滿足才可以注入)