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

SpringBoot中注冊Bean的方式總結(jié)

 更新時間:2024年04月10日 10:18:47   作者:程序員Forlan  
這篇文章主要介紹了SpringBoot中注冊Bean的方式總結(jié),@ComponentScan + @Componet相關(guān)注解,@Bean,@Import和spring.factories這四種方式,文中代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下

@ComponentScan + @Componet相關(guān)注解

@Componet相關(guān)注解有@Configuration、@Controller、@Service、@Repository,配合@ComponentScan就能被掃描注冊到Spring容器中。

定義我們需要注冊的類

@Configuration
public class ForlanConfig {

	@Bean
	public ForlanBean forlanBean1(){
		return new ForlanBean();
	}
}

@Component
// @Controller
// @Service
// @Repository
public class ForlanComponent {

	@Bean
	public ForlanBean forlanBean2(){
		return new ForlanBean();
	}
}

public class ForlanBean {
}

驗證如下:

public static void main(String[] args) {
	ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);
	System.out.println(applicationContext.getBean("forlanConfig"));
	System.out.println(applicationContext.getBean("forlanComponent"));
}

// 輸出如下:
cn.forlan.ForlanConfig$$EnhancerBySpringCGLIB$$e43dabb2@1305c126
cn.forlan.ForlanComponent@43af351a

@Bean

前面已經(jīng)定義好需要注冊的類,直接驗證即可

驗證如下:

public static void main(String[] args) {
	ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);
	System.out.println(applicationContext.getBean("forlanBean1"));
	System.out.println(applicationContext.getBean("forlanBean2"));
}

// 輸出如下:
cn.forlan.ForlanBean@64279ab
cn.forlan.ForlanBean@6650a6c

@Import

它可以導(dǎo)入的類有:Component, Configuration, ImportSelector, ImportBeanDefinitionRegistrar, ImportResource

定義我們需要注冊的類

public class CaffeineForlanCache {
}

public class RedisForlanCache {
}

public class ForlanCustomize {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

實現(xiàn)ImportSelector

public class ForlanImportSelector implements ImportSelector {
	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		Map<String, Object> annotationAttributes = importingClassMetadata.getAnnotationAttributes(EnableForlanCache.class.getName());
		//通過 不同type注入不同的緩存到容器中
		CacheType cacheType = (CacheType) annotationAttributes.get("cacheType");
		if(cacheType.equals(CacheType.CAFFEINE)){
			return new String[]{CaffeineForlanCache.class.getName()};
		}else{
			return new String[]{RedisForlanCache.class.getName()};
		}
	}
} 

實現(xiàn)ImportBeanDefinitionRegistrar

public class ForlanBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(ForlanCustomize.class)
				.addPropertyValue("name", "forlan").getBeanDefinition();
		registry.registerBeanDefinition("forlanCustomize", beanDefinition);
	}
} 

定義注解導(dǎo)入

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({ForlanImportSelector.class, ForlanBeanDefinitionRegistrar.class})
public @interface EnableForlanCache {
	CacheType cacheType() default CacheType.REDIS;
}

驗證如下:

@EnableForlanCache(cacheType = CacheType.CAFFEINE)
public class Application {

	public static void main(String[] args) {
		ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);
		System.out.println(applicationContext.getBean("forlanBean1"));
		System.out.println(applicationContext.getBean("forlanBean2"));
	}
}

// 輸出如下:
cn.forlan.ForlanCustomize@245cb8df
cn.forlan.CaffeineForlanCache@578c3fd9
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'cn.forlan.RedisForlanCache' available

spring.factories

定義我們需要注冊的類

public class ForlanAutoConfiguration {
}

在resources\META-INF下新建spring.factories,填寫內(nèi)容,SpringBoot在啟動時,就會自動注入

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.forlan.ForlanAutoConfiguration

驗證如下:

public static void main(String[] args) {
	ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);
	System.out.println(applicationContext.getBean(ForlanAutoConfiguration.class));
	System.out.println(applicationContext.getBean("cn.forlan.ForlanAutoConfiguration"));
}

// 輸出如下:
cn.forlan.ForlanAutoConfiguration@19d53ab4
cn.forlan.ForlanAutoConfiguration@19d53ab4

注:這種方式的注入的BeanName為路徑+類名

總結(jié)

總的來說,一共有如下幾種方式可以注冊bean:

  • @ComponentScan + @Componet相關(guān)注解
  • 使用@Bean注解
  • 使用@Import注解
  • spring.factories

@Configuration和@Component的主要區(qū)別?

使用場景:@Configuration主要用于定義配置類,其中包含了Bean的定義和配置;而@Component適用于任何需要被Spring管理的類。
功能:@Configuration主要用于配置類的定義和初始化Bean;而@Component主要用于組件的自動掃描和注冊。

@Bean是不是必須和@Configuration一起使用?

不是的,盡管@Bean注解常常出現(xiàn)在帶有@Configuration注解的配置類中,用于定義和初始化Spring容器中的Bean,但它也可以單獨使用。@Bean注解的主要作用是告訴Spring框架,被該注解標(biāo)注的方法將返回一個對象,這個對象需要被注冊到Spring容器中。在非配置類中使用@Bean注解,只需要確保該方法能夠被Spring掃描到即可。

@Import導(dǎo)入配置類有意義?

總結(jié)來說,@Import導(dǎo)入的類本身不是Bean,而是用于擴展Spring容器配置的工具。它可以定義或注冊其他的Bean,但你不能直接通過applicationContext.getBean()獲取這些導(dǎo)入類的實例。相反,你應(yīng)該獲取它們定義或注冊的Bean的實例。它的主要價值在于動態(tài)注入Bean。

出現(xiàn)異常:java.lang.NoClassDefFoundError: Could not initialize class org.springframework.beans.factory.BeanDefinitionStoreException

原因是這個類寫的有問題,F(xiàn)orlanImportSelector根本就沒有初始化,不是是當(dāng)前類

在這里插入圖片描述

以上就是SpringBoot中注冊Bean的方式總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot注冊Bean的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 舉例講解Java中的Stream流概念

    舉例講解Java中的Stream流概念

    這篇文章主要介紹了舉例講解Java中的Stream流概念,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • Mybatis之a(chǎn)ssociation和collection用法

    Mybatis之a(chǎn)ssociation和collection用法

    這篇文章主要介紹了Mybatis之a(chǎn)ssociation和collection用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java遍歷文件夾及子目錄代碼實例

    Java遍歷文件夾及子目錄代碼實例

    這篇文章主要介紹了Java遍歷文件夾及子目錄代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot使用freemarker導(dǎo)出word文件方法詳解

    SpringBoot使用freemarker導(dǎo)出word文件方法詳解

    這篇文章主要介紹了SpringBoot使用freemarker導(dǎo)出word文件方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • Spring Boot 實現(xiàn)圖片上傳并回顯功能

    Spring Boot 實現(xiàn)圖片上傳并回顯功能

    本篇文章給大家分享Spring Boot 實現(xiàn)圖片上傳并回顯功能,文中通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • Struts2中Action中是否需要實現(xiàn)Execute方法

    Struts2中Action中是否需要實現(xiàn)Execute方法

    這篇文章主要介紹了Struts2中Action中是否需要實現(xiàn)Execute方法的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • 支付寶二面:使用?try-catch?捕獲異常會影響性能嗎(推薦)

    支付寶二面:使用?try-catch?捕獲異常會影響性能嗎(推薦)

    這篇文章主要介紹了支付寶二面:使用?try-catch?捕獲異常會影響性能嗎,需要注意的是,JVM?中?異常處理的catch語句不再由字節(jié)碼指令來實現(xiàn)(很早之前通過?jsr和?ret指令來完成,需要的朋友可以參考下
    2023-03-03
  • Java編程復(fù)用類代碼詳解

    Java編程復(fù)用類代碼詳解

    這篇文章主要介紹了Java編程復(fù)用類代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Springboot詳解整合SpringSecurity實現(xiàn)全過程

    Springboot詳解整合SpringSecurity實現(xiàn)全過程

    Spring Security基于Spring開發(fā),項目中如果使用Springboot作為基礎(chǔ),配合Spring Security做權(quán)限更加方便,而Shiro需要和Spring進行整合開發(fā)。因此作為spring全家桶中的Spring Security在java領(lǐng)域很常用
    2022-07-07
  • CGLIB代理的使用與原理解析

    CGLIB代理的使用與原理解析

    這篇文章主要介紹了CGLIB代理的使用與原理解析,靜態(tài)代理和JDK 代理模式都要求目標(biāo)對象是實現(xiàn)一個接口,但是有時候目標(biāo)對象只是一個單獨的對象,并沒有實現(xiàn)任何的接口,這個時候可使用目標(biāo)對象子類來實現(xiàn)代理,這就是Cglib代理,需要的朋友可以參考下
    2023-09-09

最新評論

仁化县| 资溪县| 增城市| 铅山县| 辉南县| 元朗区| 安溪县| 夏河县| 方山县| 法库县| 盘锦市| 宁城县| 二连浩特市| 灵宝市| 茌平县| 鱼台县| 内丘县| 澳门| 丽水市| 平凉市| 广平县| 渭源县| 禹城市| 河津市| 巴南区| 抚顺市| 嘉峪关市| 普安县| 宁波市| 延吉市| 苗栗县| 吴旗县| 淮北市| 黔南| 龙南县| 离岛区| 无棣县| 隆子县| 遵化市| 齐齐哈尔市| 满城县|