今天就跟大家聊聊有關(guān)Springbean的注入方式什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
成都創(chuàng)新互聯(lián)公司長(zhǎng)期為近千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為綏中企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè),綏中網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。Spring注入方式可以分為三類,xml注入、注解注入、BeanDefinition注入;用法上可以分為三種,但是底層實(shí)現(xiàn)代碼都是統(tǒng)一BeanFactory,這三種也有聯(lián)系xml注入和annotation注入都是依賴BeanDefinition擴(kuò)展的接口,注解也是從xml過(guò)渡過(guò)來(lái)的,我們簡(jiǎn)單的看下這三種的寫(xiě)法。
XML注入
在springboot框架沒(méi)有出來(lái)之前,xml配置被大量的使用,配置過(guò)程比較繁瑣,但是對(duì)代碼的侵入性較小,配置和代碼分離操作。
實(shí)體定義
定義兩個(gè)屬性id,name,并實(shí)現(xiàn)get/set方法,重寫(xiě)toString方法,方便看打印結(jié)果。
public class UserXml { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" "id='" id '\'' ", name='" name '\'' '}'; }}
xml定義
在resources下新建目錄META-INF下建spring-bean.xml文件,并填充對(duì)應(yīng)的bean配置,bean需要配置id或者name值,IOC容器即可,class配置定義的實(shí)體路徑,對(duì)應(yīng)的property設(shè)置初始化屬性。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/tupian/20230522/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="/tupian/20230522/ https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="user" class="cn.cnzcb.spring.bean.UserXml"> <property name="id" value="11"/> <property name="name" value="java圈"/> </bean></beans>
輸出
創(chuàng)建一個(gè)BeanFactory對(duì)象,用ClassPathXmlApplicationContext實(shí)例化,簡(jiǎn)單說(shuō)一下BeanFactory作為IOC容器的底層基礎(chǔ),可以說(shuō)IOC容器就是BeanFactory,ClassPathXmlApplicationContext是IOC容器的功能擴(kuò)展;ClassPathXmlApplicationContext需要傳入資源文件的路徑,在通過(guò)getBean方法獲取具體的實(shí)體類,就是結(jié)果輸出。
//xml注入 BeanFactory classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath:/META-INF/spring-bean.xml"); UserXml userXml = classPathXmlApplicationContext.getBean(UserXml.class); System.out.println("userXml XML注入對(duì)象:" userXml);
注解注入
注解是在spring2.0.3之后才出現(xiàn)的,大量應(yīng)用也是在springboot的普及下,大家才慢慢接受。其主要好處就是操作簡(jiǎn)單,通過(guò)簡(jiǎn)單的注解就可以標(biāo)識(shí)成bean組件,而且擴(kuò)展了各種層次的注解,比如@Service、@Service、@Repository,都是基于@Component注解實(shí)現(xiàn)派生。
實(shí)體定義
實(shí)體通XML實(shí)體作用類似,這里新建一個(gè)類,用去區(qū)分不同的bean實(shí)現(xiàn)方式。
public class UserAnnotation { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" "id='" id '\'' ", name='" name '\'' '}'; }
注解配置
正常情況下我們是通過(guò)標(biāo)準(zhǔn)注解@Configuration進(jìn)行掃描注入,我們這里直接配置類即可,在這個(gè)類里面實(shí)例化bean組件,并進(jìn)行初始化操作。
@Configurationpublic class UserConfiguration { @Bean public UserAnnotation userAnnotation(){ UserAnnotation userAnnotation = new UserAnnotation(); userAnnotation.setId("11"); userAnnotation.setName("java圈"); return userAnnotation; }}
輸出
AnnotationConfigApplicationContext也是BeanFactory的一種實(shí)現(xiàn),和ClassPathXmlApplicationContext功能類似,只是加載渠道不一樣,把定義的配置類注冊(cè)到IOC容器,調(diào)用register方法,這里需要注意,下一步需要調(diào)refresh方法就行bean的裝載工作,然后通過(guò)getBean獲取具體的實(shí)體,就行輸出。
//注解注入 AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(); annotationConfigApplicationContext.register(UserConfiguration.class); annotationConfigApplicationContext.refresh(); UserAnnotation userAnnotation = annotationConfigApplicationContext.getBean(UserAnnotation.class); System.out.println("UserAnnotation注解注入" userAnnotation);
BeanDefinition注入
BeanDefinition是BeanFactory的底層實(shí)現(xiàn),包括上面提到的方式,底層也是基于BeanDefinition實(shí)現(xiàn)的,一個(gè)bean組件對(duì)應(yīng)一個(gè)BeanDefinition,但是實(shí)際操作過(guò)程中不會(huì)這個(gè)用,只是僅供參考。
實(shí)體定義
實(shí)體通XML實(shí)體作用類似,這里新建一個(gè)類,用去區(qū)分不同的bean實(shí)現(xiàn)方式。
public class UserBeanDefinition { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" "id='" id '\'' ", name='" name '\'' '}'; }}
輸出
通過(guò)BeanDefinitionBuilder的genericBeanDefinition實(shí)例化一個(gè)構(gòu)造器,傳入的參數(shù)就是實(shí)體類,構(gòu)建之后做初始化操作,之后BeanDefinition聲明調(diào)用getBeanDefinition方法,通過(guò)getPropertyValues回去bean的具體參數(shù)進(jìn)行結(jié)束輸出。
//BeanDefinition注入 BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserBeanDefinition.class); definitionBuilder.addPropertyValue("id", "11"); definitionBuilder.addPropertyValue("name", "java圈"); BeanDefinition beanDefinition = definitionBuilder.getBeanDefinition(); String beanClassName = beanDefinition.getBeanClassName(); MutablePropertyValues mutablePropertyValues = beanDefinition.getPropertyValues(); String id = mutablePropertyValues.getPropertyValue("id").getValue().toString(); String name = mutablePropertyValues.getPropertyValue("name").getValue().toString(); System.out.println("BeanDefinition注入對(duì)象UserBeanDefition{id=" id ",name=" name "}");
結(jié)果輸出
輸出結(jié)果分別是xml注入、annotation注入,BeanDefinition注入。
userXml XML注入對(duì)象:User{id='11', name='java圈'}UserAnnotation注解注入U(xiǎn)ser{id='11', name='java圈'}BeanDefinition注入對(duì)象UserBeanDefition{id=11,name=java圈}
看完上述內(nèi)容,你們對(duì)Springbean的注入方式什么有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
分享標(biāo)題:Springbean的注入方式什么-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)路徑:http://m.rwnh.cn/article14/cecoge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、面包屑導(dǎo)航、關(guān)鍵詞優(yōu)化、網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站設(shè)計(jì)、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容