不是吧,你还只会用@Service注册Bean吗?
前言
眾所周知,在我們平時的開發中,Spring這個框架已經環繞了整個項目,不是說我們不能不用Spring,而是這樣做的代價太大了。每次面試,總是會問道Spring IOC、AOP、事務等等,今天這篇的話是猛男我剛工作碰到的一個面試真題,可憐我那時只知道@Service。然后就回去等通知了,到現在還沒有給我通知。
另外的話,今天這篇會講幾種注入方式,至于原理好哥哥們就先別想了(別打我臉就行),這隨便拿一個出來都得講源碼講一遍,主要需要依賴的東西優點多,所以找個機會將Spring IOC 那一塊的源碼弄出來說說,這一篇的話主要是講個大概。
1.@Service、@Component、@Repository、@Controller
這種方式就很簡單,像@Service、@Repository其實還是用的@Component,在注解里面點擊去看就知道了,需要注意的點是這種方式需要用@ComponentScan配置一個一個掃包范圍。為什么不用@Component這一個呢,主要是Spring為了區分Bean的類型。@Repository作用于持久層,@Service 作用于業務邏輯層,@Controller作用于表現層(spring-mvc的注解)
@Component public class ApproveCenterServiceImpl implements ApproveCenterService { } @Service public class ApproveCenterServiceImpl implements ApproveCenterService { } @Repository public class ApproveCenterServiceImpl implements ApproveCenterService { }2.@Bean 和@Configuration
這種方式是不是很熟悉,常用于標注配置類,最簡單的一個例子就是我們使用SpringBoot 的時候需要手動注冊一個Bean``叫做RestTemplate`
@Configuration public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();} }3.使用@Import
@Import 注解可以注冊三種類型的Bean,第一種就是普通類,第二種DefinitionRegistrar類,第三種就是ImportSelector
3.1 普通類
/*** @author xiejianwei*/ @Import(MessageRecord.class) public @interface ImportBean { }3.2 DefinitionRegistrar
實現了
ImportBeanDefinitionRegistrar,這種方式在實現類中提供了一個注冊器,有一個很熟悉的注解@MapperScan好哥哥們點進去看看就明白了。
3.3 ImportSelector
很多想Springboot starter中要開啟某個功能時就會用到ImportSelector,比如像開啟服務注冊與發現的注解@EnableDiscoveryClient,主要原理是ImportSelector中的selectImports方法會返回一個字符串的數組,這里的字符串實際上是一個個我們需要注冊類的全路徑,類似于
com.xjw.entity.pojo.MessageRecord,Spring會根據全路徑反射生成Bean。源碼這一塊就先不講了(手動狗頭)。
4.FactoryBean
FactoryBean是一個特殊的Bean,是否很多好哥哥在面試時被問到過FactoryBean和BeanFactry的區別呢,說道這個我的眼眶濕潤了(講道理,這個在面所謂高級工程師的時候經常被問到)。FactoryBean是一個特殊Bean,當我們實現這個接口時,會生成兩個Bean對象,第一個就是實現類本身,需要用在Bean名稱前(正常是類名首字母小寫)加&來獲取Bean,第二個Bean的話實際上就是getObject方法返回的bean,需要注意的是這種方式需要配合@Component或者@Configuration來實現。BeanFactry簡單點來說就是Spring上下文的容器。
實例代碼如下:
@Component public class FactoryBeanLearn implements FactoryBean {@Overridepublic Object getObject() throws Exception {//這個Bean是我們自己new的,這里我們就可以控制Bean的創建過程了return new MessageRecord();}/*** bean的類型***/@Overridepublic Class<?> getObjectType() {return MessageRecord.class;}/*** 是否是單例的***/@Overridepublic boolean isSingleton() {return true;} }作者:?℡
鏈接:
https://juejin.cn/post/6917056982289989645
來源:掘金
總結
以上是生活随笔為你收集整理的不是吧,你还只会用@Service注册Bean吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读书笔记2014第4本:程序员修炼之道-
- 下一篇: onRequestPermissions