最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring創(chuàng)建Bean的6種方式詳解

 更新時間:2019年06月21日 09:45:11   作者:冬眠的山谷  
這篇文章主要介紹了Spring創(chuàng)建Bean的6種方式詳解,本文講解了在Spring 應用中創(chuàng)建Bean的多種方式,包括自動創(chuàng)建,以及手動創(chuàng)建注入方式,實際開發(fā)中可以根據(jù)業(yè)務場景選擇合適的方案。,需要的朋友可以參考下

前言
本文講解了在Spring 應用中創(chuàng)建Bean的多種方式,包括自動創(chuàng)建,以及手動創(chuàng)建注入方式,實際開發(fā)中可以根據(jù)業(yè)務場景選擇合適的方案。

方式1:
使用Spring XML方式配置,該方式用于在純Spring 應用中,適用于簡單的小應用,當應用變得復雜,將會導致XMl配置文件膨脹 ,不利于對象管理。

<bean id="xxxx" class="xxxx.xxxx"/>

方式2:

使用@Component,@Service,@Controler,@Repository注解

這幾個注解都是同樣的功能,被注解的類將會被Spring 容器創(chuàng)建單例對象。

  • @Component : 側重于通用的Bean類
  • @Service:標識該類用于業(yè)務邏輯
  • @Controler:標識該類為Spring MVC的控制器類
  • @Repository: 標識該類是一個實體類,只有屬性和Setter,Getter
@Component
public class User{
}

當用于Spring Boot應用時,被注解的類必須在啟動類的根路徑或者子路徑下,否則不會生效。

如果不在,可以使用@ComponentScan標注掃描的路徑。

spring xml 也有相關的標簽<component-scan />

@ComponentScan(value={"com.microblog.blog","com.microblog.common"})
public class MicroblogBlogApplication {
public static void main(String args[]){
SpringApplication.run(MicroblogBlogApplication.class,args);
}
}

方式3:

使用@Bean注解,這種方式用在Spring Boot 應用中。

@Configuration 標識這是一個Spring Boot 配置類,其將會掃描該類中是否存在@Bean 注解的方法,比如如下代碼,將會創(chuàng)建User對象并放入容器中。

@ConditionalOnBean 用于判斷存在某個Bean時才會創(chuàng)建User Bean.

這里創(chuàng)建的Bean名稱默認為方法的名稱user。也可以@Bean("xxxx")定義。

@Configuration
public class UserConfiguration{
@Bean
@ConditionalOnBean(Location.class)
public User user(){
return new User();
}
} 

Spring boot 還為我們提供了更多類似的注解。

也和方式2一樣,也會存在掃描路徑的問題,除了以上的解決方式,還有使用Spring boot starter 的解決方式

在resources下創(chuàng)建如下文件。META-INF/spring.factories.

Spring Boot 在啟動的時候將會掃描該文件,從何獲取到配置類UserConfiguration。

spring.factories.

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.log.config.UserConfiguration

如果不成功,請引入該依賴

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency> 

這個方式也是創(chuàng)建SpringBoot-starter的方式。

方式4:

使用注解@Import,也會創(chuàng)建對象并注入容器中

@Import(User.class)
public class MicroblogUserWebApplication {
public static void main(String args[]) {
SpringApplication.run(MicroblogUserWebApplication.class, args);
}
}

方式5:

使用ImportSelector或者ImportBeanDefinitionRegistrar接口,配合@Import實現(xiàn)。

在使用一些Spring Boot第三方組件時,經(jīng)常會看到@EnableXXX來使能相關的服務,這里以一個例子來實現(xiàn)。

創(chuàng)建測試類

@Slf4j
public class House {
public void run(){
log.info("House run ....");
}
}
@Slf4j
public class User {
public void run(){
log.info("User run ....");
}
}
@Slf4j
public class Student {
public void run(){
log.info("Student run ....");
}
}

實現(xiàn)ImportSelector接口

selectImports方法的返回值為需要創(chuàng)建Bean的類名稱。這里創(chuàng)建User類。

@Slf4j
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
log.info("MyImportSelector selectImports ...");
return new String[]{
User.class.getName()};
}
}

實現(xiàn)ImportBeanDefinitionRegistrar接口

beanDefinitionRegistry.registerBeanDefinition用于設置需要創(chuàng)建Bean的類名稱。這里創(chuàng)建House類。

@Slf4j
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
log.info("MyImportBeanDefinitionRegistrar registerBeanDefinitions .....");
BeanDefinition beanDefinition = new RootBeanDefinition(House.class.getName());
beanDefinitionRegistry.registerBeanDefinition(House.class.getName(),beanDefinition);
}
}

創(chuàng)建一個配置類

這里創(chuàng)建Student類。

@Configuration
public class ImportAutoconfiguration {
@Bean
public Student student(){
return new Student();
}
}

創(chuàng)建EnableImportSelector注解

EnableImportSelector注解上使用@Import,引入以上的三個類。

@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
@Import({MyImportSelector.class,ImportAutoconfiguration.class,MyImportBeanDefinitionRegistrar.class})
public @interface EnableImportSelector {
String value();
}

測試

@EnableImportSelector(value = "xxx")
@SpringBootApplication
public class ImportDemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(ImportDemoApplication.class, args);
User user = context.getBean(User.class);
user.run();
Student student = context.getBean(Student.class);
student.run();
House house = context.getBean(House.class);
house.run();
}
}

輸出,可以看到,三個類User Student House都創(chuàng)建成功,都可從Spring 容器中獲取到。

2019-06-20 17:53:39.528 INFO 27255 --- [ main] com.springboot.importselector.pojo.User : User run ....
2019-06-20 17:53:39.530 INFO 27255 --- [ main] c.s.importselector.pojo.Student : Student run ....
2019-06-20 17:53:39.531 INFO 27255 --- [ main] c.springboot.importselector.pojo.House : House run ....

方式6

手動注入Bean容器,有些場景下需要代碼動態(tài)注入,以上方式都不適用。這時就需要創(chuàng)建 對象手動注入。

通過DefaultListableBeanFactory注入。

registerSingleton(String beanName,Object object);

這里手動使用new創(chuàng)建了一個Location對象。并注入容器中。

@Component
public class LocationRegister implements BeanFactoryAware {
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
DefaultListableBeanFactory listableBeanFactory = (DefaultListableBeanFactory)beanFactory;
Location location = new Location();
listableBeanFactory.registerSingleton("location1",location);
}
}

這種方式的應用場景是為接口創(chuàng)建動態(tài)代理對象,并向SPRING容器注冊。

比如MyBatis中的Mapper接口,Mapper沒有實現(xiàn)類,啟動時創(chuàng)建動態(tài)代理對象,將該對象注冊到容器中,使用時只要@Autowired注入即可使用,調(diào)用接口方法將會被代理攔截,進而調(diào)用相關的SqlSession執(zhí)行相關的SQL業(yè)務邏輯。

可以看以下它的繼承體系

DefaultListableBeanFactory 是ConfigurableListableBeanFactory的實現(xiàn)類。是對BeanFactory功能的擴展。

測試代碼和以上一樣

Location location = context.getBean(Location.class);
location.run();

本文的相關代碼位于 實例代碼 測試類

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java實現(xiàn)Floyd算法的示例代碼

    Java實現(xiàn)Floyd算法的示例代碼

    Floyd算法又稱為插點法,是一種利用動態(tài)規(guī)劃的思想尋找給定的加權圖中多源點之間最短路徑的算法。本文將用Java語言實現(xiàn)Floyd算法,需要的可以參考一下
    2022-07-07
  • Spring中的接口重試機制spring-retry之listeners參數(shù)解析

    Spring中的接口重試機制spring-retry之listeners參數(shù)解析

    這篇文章主要介紹了Spring中的接口重試機制spring-retry之listeners參數(shù)解析,注解@Retryable有一個參數(shù)listeners沒有說明,那么本篇文章我們詳細介紹一個這個參數(shù)的用,需要的朋友可以參考下
    2024-01-01
  • springboot+element-ui實現(xiàn)多文件一次上傳功能

    springboot+element-ui實現(xiàn)多文件一次上傳功能

    這篇文章主要介紹了springboot+element-ui多文件一次上傳功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • 詳解Java Ajax jsonp 跨域請求

    詳解Java Ajax jsonp 跨域請求

    本篇文章主要介紹了詳解Java Ajax jsonp 跨域請求,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 詳談Spring框架之事務管理

    詳談Spring框架之事務管理

    下面小編就為大家?guī)硪黄斦凷pring框架之事務管理。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 聊聊Spring?Cloud?Gateway過濾器精確控制異常返回問題

    聊聊Spring?Cloud?Gateway過濾器精確控制異常返回問題

    這篇文章主要介紹了Spring?Cloud?Gateway過濾器精確控制異常返回問題,本篇任務就是分析上述現(xiàn)象的原因,通過閱讀源碼搞清楚返回碼和響應body生成的具體邏輯,需要的朋友可以參考下
    2021-11-11
  • Spring Boot郵箱鏈接注冊驗證及注冊流程

    Spring Boot郵箱鏈接注冊驗證及注冊流程

    這篇文章給大家介紹Spring Boot郵箱鏈接注冊驗證問題及注冊流程分析,通過實例代碼給大家分享實現(xiàn)過程,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • Mybatis參數(shù)傳遞示例代碼

    Mybatis參數(shù)傳遞示例代碼

    這篇文章主要給大家介紹了關于Mybatis參數(shù)傳遞的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • spring?boot?3使用?elasticsearch?提供搜索建議的實例詳解

    spring?boot?3使用?elasticsearch?提供搜索建議的實例詳解

    這篇文章主要介紹了spring?boot3使用elasticsearch提供搜索建議,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 詳解SpringBoot時間參數(shù)處理完整解決方案

    詳解SpringBoot時間參數(shù)處理完整解決方案

    這篇文章主要介紹了詳解SpringBoot時間參數(shù)處理完整解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12

最新評論

辽宁省| 连江县| 车险| 化隆| 航空| 长白| 田阳县| 卢龙县| 莫力| 岑溪市| 三门县| 和龙市| 务川| 天台县| 澄城县| 永定县| 隆化县| 许昌县| 佛教| 济南市| 甘肃省| 南通市| 华蓥市| 屏东市| 东乌珠穆沁旗| 常宁市| 德惠市| 郑州市| 谢通门县| 平泉县| 乳源| 温泉县| 洪洞县| 抚松县| 昌黎县| 乃东县| 新乡县| 阜南县| 缙云县| 措美县| 溧水县|