日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

不是吧,你还只会用@Service注册Bean吗?

發布時間:2024/1/1 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不是吧,你还只会用@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好哥哥們點進去看看就明白了。

@Import(MapperScannerRegistrar.class) public @interface MapperScan { }public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware {/*** 主要是這個方法,在參數中提供了BeanDefinitionRegistry這個注冊器,可以手動向容器中注入bean*/@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {AnnotationAttributes mapperScanAttrs = AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName()));if (mapperScanAttrs != null) {registerBeanDefinitions(mapperScanAttrs, registry);}} }

3.3 ImportSelector

很多想Springboot starter中要開啟某個功能時就會用到ImportSelector,比如像開啟服務注冊與發現的注解@EnableDiscoveryClient,主要原理是ImportSelector中的selectImports方法會返回一個字符串的數組,這里的字符串實際上是一個個我們需要注冊類的全路徑,類似于
com.xjw.entity.pojo.MessageRecord,Spring會根據全路徑反射生成Bean。源碼這一塊就先不講了(手動狗頭)。

public class CommonModelSelector implements ImportSelector {public CommonModelSelector() {}public String[] selectImports(AnnotationMetadata annotationMetadata) {return new String[]{MessageRecord.class.getName()};} }

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吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。