Springbean的幾種注入方式都了解嗎?

Spring注入方式可以分為三類,xml注入、注解注入、BeanDefinition注入;用法上可以分為三種,但是底層實現(xiàn)代碼都是統(tǒng)一BeanFactory,這三種也有聯(lián)系xml注入和annotation注入都是依賴BeanDefinition擴(kuò)展的接口,注解也是從xml過渡過來的,我們簡單的看下這三種的寫法。

XML注入

在springboot框架沒有出來之前,xml配置被大量的使用,配置過程比較繁瑣,但是對代碼的侵入性較小,配置和代碼分離操作。

實體定義

定義兩個屬性id,name,并實現(xiàn)get/set方法,重寫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文件,并填充對應(yīng)的bean配置,bean需要配置id或者name值,IOC容器唯一即可,class配置定義的實體路徑,對應(yīng)的property設(shè)置初始化屬性。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        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)建一個BeanFactory對象,用ClassPathXmlApplicationContext實例化,簡單說一下BeanFactory作為IOC容器的底層基礎(chǔ),可以說IOC容器就是BeanFactory,ClassPathXmlApplicationContext是IOC容器的功能擴(kuò)展;ClassPathXmlApplicationContext需要傳入資源文件的路徑,在通過getBean方法獲取具體的實體類,就是結(jié)果輸出。

 //xml注入
        BeanFactory classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath:/META-INF/spring-bean.xml");
        UserXml userXml = classPathXmlApplicationContext.getBean(UserXml.class);
        System.out.println("userXml XML注入對象:" + userXml);

注解注入

注解是在spring2.0.3之后才出現(xiàn)的,大量應(yīng)用也是在springboot的普及下,大家才慢慢接受。其主要好處就是操作簡單,通過簡單的注解就可以標(biāo)識成bean組件,而且擴(kuò)展了各種層次的注解,比如@Service、@Service、@Repository,都是基于@Component注解實現(xiàn)派生。

實體定義

實體通XML實體作用類似,這里新建一個類,用去區(qū)分不同的bean實現(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 + '\'' +
                '}';
    }

注解配置

正常情況下我們是通過標(biāo)準(zhǔn)注解@Configuration進(jìn)行掃描注入,我們這里直接配置類即可,在這個類里面實例化bean組件,并進(jìn)行初始化操作。

@Configuration
public class UserConfiguration {
    @Bean
    public UserAnnotation userAnnotation(){
        UserAnnotation userAnnotation = new UserAnnotation();
        userAnnotation.setId("11");
        userAnnotation.setName("java圈");
        return userAnnotation;
    }
}

輸出

AnnotationConfigApplicationContext也是BeanFactory的一種實現(xiàn),和ClassPathXmlApplicationContext功能類似,只是加載渠道不一樣,把定義的配置類注冊到IOC容器,調(diào)用register方法,這里需要注意,下一步需要調(diào)refresh方法就行bean的裝載工作,然后通過getBean獲取具體的實體,就行輸出。

 //注解注入
        AnnotationConfigApplicationContext  annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
        annotationConfigApplicationContext.register(UserConfiguration.class);
        annotationConfigApplicationContext.refresh();
        UserAnnotation userAnnotation = annotationConfigApplicationContext.getBean(UserAnnotation.class);
        System.out.println("UserAnnotation注解注入"+userAnnotation);

BeanDefinition注入

BeanDefinition是BeanFactory的底層實現(xiàn),包括上面提到的方式,底層也是基于BeanDefinition實現(xiàn)的,一個bean組件對應(yīng)一個BeanDefinition,但是實際操作過程中不會這個用,只是僅供參考。

實體定義

實體通XML實體作用類似,這里新建一個類,用去區(qū)分不同的bean實現(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 + '\'' +
                '}';
    }
}


輸出

通過BeanDefinitionBuilder的genericBeanDefinition實例化一個構(gòu)造器,傳入的參數(shù)就是實體類,構(gòu)建之后做初始化操作,之后BeanDefinition聲明調(diào)用getBeanDefinition方法,通過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注入對象UserBeanDefition{id=" + id+",name="+name+"}");

結(jié)果輸出

輸出結(jié)果分別是xml注入、annotation注入,BeanDefinition注入。

userXml XML注入對象:User{id='11', name='java圈'}
UserAnnotation注解注入User{id='11', name='java圈'}
BeanDefinition注入對象UserBeanDefition{id=11,name=java圈}

源代碼:https://github.com/itrickzhang/spring-demo

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容