Spring將一個(gè)的類(lèi)配置成Bean的方式詳解
一、說(shuō)明
1.第三方的bean不能改寫(xiě)源碼,在類(lèi)上加@Component注解
2.只能引入該類(lèi)進(jìn)行反射創(chuàng)建,再更改其BeanDefinition信息
二、四種方式
1.@Bean方式,實(shí)例化過(guò)程可以更改
2.@Import導(dǎo)入類(lèi),實(shí)例化過(guò)程不能干預(yù)
3.@Import導(dǎo)入ImportBeanDefinitionRegistrar實(shí)現(xiàn)類(lèi),可以給BeanDefinition設(shè)置屬性等信息
4.beanDefinition注冊(cè)后置處理器(BeanDefinitionRegistryPostProcessor),不需要@Import引入,但順序在后面
三、代碼示例
3.1 @Bean方式
package com.learning.bean; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Author wangyouhui * @Description 配置類(lèi) **/ @Configuration public class BeanConfig { @Bean public DruidDataSource dataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setUsername("root"); return dataSource; } }
3.2 @Bean方式
package com.learning.bean; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; /** * @Author wangyouhui * @Description 配置類(lèi) **/ @Configuration @Import(DruidDataSource.class) public class BeanConfig2 { }
3.3 @Import導(dǎo)入ImportBeanDefinitionRegistrar實(shí)現(xiàn)類(lèi)
package com.learning.bean; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.core.type.AnnotationMetadata; /** * @Author wangyouhui * @Description 配置類(lèi) **/ @Configuration @Import(ImportBeanDefinitionRegistrar.class) public class BeanConfig3 { } class ImportBeanDefinitionRegistrar implements org.springframework.context.annotation.ImportBeanDefinitionRegistrar{ @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { // BeanDefinition存儲(chǔ)Bean的描述信息,決定Bean生產(chǎn)方式 RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(DruidDataSource.class); rootBeanDefinition.getPropertyValues().add("password", "root"); registry.registerBeanDefinition("dataSource", rootBeanDefinition); } }
3.4 BeanDefinitionRegistryPostProcessor
package com.learning.bean; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.stereotype.Component; /** * @Author wangyouhui * @Description beanDefinition注冊(cè)后置處理器 **/ @Component public class BeanDefinitionRegistryPostProcessor implements org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException { RootBeanDefinition beanDefinition = new RootBeanDefinition(); beanDefinition.getPropertyValues().add("password", "root"); beanDefinitionRegistry.registerBeanDefinition("dataSource", beanDefinition); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { } }
到此這篇關(guān)于Spring將一個(gè)的類(lèi)配置成Bean的方式詳解的文章就介紹到這了,更多相關(guān)Spring將類(lèi)配成Bean內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
細(xì)談java同步之JMM(Java Memory Model)
Java內(nèi)存模型是在硬件內(nèi)存模型上的更高層的抽象,它屏蔽了各種硬件和操作系統(tǒng)訪問(wèn)的差異性,保證了Java程序在各種平臺(tái)下對(duì)內(nèi)存的訪問(wèn)都能達(dá)到一致的效果。下面我們來(lái)一起學(xué)習(xí)下JMM2019-05-05SpringBoot中JPA更新時(shí)部分字段無(wú)效
本文主要介紹了SpringBoot中JPA更新時(shí)部分字段無(wú)效,在通過(guò)注解自動(dòng)更新時(shí),部分字段在調(diào)試時(shí)可以找到,卻沒(méi)有被自動(dòng)更新到數(shù)據(jù)庫(kù)中,下面就介紹一下解決方法2023-04-04Intellij IDEA使用restclient測(cè)試的教程圖解
這篇文章主要介紹了Intellij IDEA使用restclient測(cè)試的教程圖解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Java split函數(shù)拆分后變成null問(wèn)題解決方案
這篇文章主要介紹了Java split函數(shù)拆分后變成null問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Java 實(shí)現(xiàn)二叉搜索樹(shù)的查找、插入、刪除、遍歷
本文主要介紹了Java實(shí)現(xiàn)二叉搜索樹(shù)的查找、插入、刪除、遍歷等內(nèi)容。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02詳解Java如何實(shí)現(xiàn)一個(gè)像String一樣不可變的類(lèi)
說(shuō)到?String?大家都知道?String?是一個(gè)不可變的類(lèi);雖然用的很多,那不知道小伙伴們有沒(méi)有想過(guò)怎么樣創(chuàng)建一個(gè)自己的不可變的類(lèi)呢?這篇文章就帶大家來(lái)實(shí)踐一下,創(chuàng)建一個(gè)自己的不可變的類(lèi)2022-11-11SpringBoot系列教程JPA之基礎(chǔ)環(huán)境搭建的方法
這篇文章主要介紹了SpringBoot系列教程JPA之基礎(chǔ)環(huán)境搭建的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06springboot bean掃描路徑的實(shí)現(xiàn)
這篇文章主要介紹了springboot bean掃描路徑的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01