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

SpringBoot Bean花式注解方法示例上篇

 更新時間:2023年02月10日 11:03:54   作者:零維展開智子  
這篇文章主要介紹了SpringBoot Bean花式注解方法,很多時候我們需要根據(jù)不同的條件在容器中加載不同的Bean,或者根據(jù)不同的條件來選擇是否在容器中加載某個Bean

1.XML方式聲明

這里我舉兩個例子,一個是自定義的bean,另一個是第三方bean,這樣會全面一些。

你還可以定義這個bean的模式,有單例模式和多例模式,prototype代表多例,singleton代表單例。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">
        <bean class="yi.beans.Cat" id="cat" scope="prototype"/>
        <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource" scope="singleton"/>
</beans>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        String[] names = context.getBeanDefinitionNames();  //獲取所有的beam名字
        for (String name : names) {
            System.out.println(name);
        }
    }
}

2.注解法@Component

第一種方式配置起來太復(fù)雜了,而且也不夠靈活。

同樣我也會拿自定義bean和第三方bean來舉例子。

import lombok.Data;
import org.springframework.stereotype.Component;
@Component("Tom")
@Data
public class Cat {
}

注解法也是可以指定id的。

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = true)   //默認(rèn)為true,代表從IOC容器中取對象
public class Dbconfig {
    @Bean
    public DruidDataSource source(){
        DruidDataSource dataSource=new DruidDataSource();
        return dataSource;
    }
}

對于第三方bean,我們沒有辦法直接給其加注解,就需要用配置類來書寫,其中@Configuration和@Component幾乎一模一樣,不過其可以通過參數(shù)來指定是否生成新的bean對象還是直接從IOC容器里面拿原先的。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">
        <context:component-scan base-package="yi.beans,yi.config"/>
</beans>

掃描的時候可以通過逗號來分割開多個包。

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        String[] names = context.getBeanDefinitionNames();  //獲取所有的beam名字
        for (String name : names) {
            System.out.println(name);
        }
    }
}

其中bean的name就是其id,沒有的話就是它的類名或者方法名首字母小寫。

中間那些我們暫時不做討論。

Tom就是自定義的bean,dbconfig就是配置類的bean,source就是第三方bean。

3.完全注解式

第二種其實還沒有完全做到全注解,其在掃描的時候還是需要書寫xml,還是不夠靈活。

我們需要在掃描的時候也由注解來安排。

import lombok.Data;
import org.springframework.stereotype.Component;
@Component("miao")
@Data
public class Cat {
}
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = true)   //默認(rèn)為true,代表從IOC容器中取對象
public class Dbconfig {
    @Bean
    public DruidDataSource source(){
        DruidDataSource dataSource=new DruidDataSource();
        return dataSource;
    }
}
import org.springframework.context.annotation.ComponentScan;
@ComponentScan({"yi.config","yi.beans"})
public class ZConfig {
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App1 {
    public static void main(String[] args) {
        ApplicationContext context=new AnnotationConfigApplicationContext(ZConfig.class);
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

可以看到我們現(xiàn)在已經(jīng)完全不需要xml文件了耶。

不過還有個問題,如果就是說我們想把一個比較遠(yuǎn)古的項目以前是xml配置的,現(xiàn)在要改為注解式怎末辦呢?這里有一個注解。

可以建一個總的配置類。

import org.springframework.context.annotation.ImportResource;
@ImportResource("spring-config.xml")
public class ZConfig {
}

小插曲-工廠式定義

這種方式可以在bean被加載前對其進(jìn)行一些操作。

import lombok.Data;
@Data
public class Dog {
}
import org.springframework.beans.factory.FactoryBean;
import yi.beans.Dog;
public class DogFactory implements FactoryBean<Dog> {
    @Override
    public Dog getObject() throws Exception {
        Dog dog=new Dog();
        //可以進(jìn)行一些setter操作
        return dog;
    }
    @Override
    public Class<?> getObjectType() {
        return Dog.class;
    }
    @Override
    public boolean isSingleton() {    //是否為單例模式
        return true;
    }
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import yi.beans.factory.DogFactory;
@Configuration(proxyBeanMethods = true)   //默認(rèn)為true,代表從IOC容器中取對象
public class Dbconfig {
    @Bean
    public DogFactory dog(){
        DogFactory dogFactory = new DogFactory();
        return dogFactory;
    }
}

這種算是比較像第三方bean的加載了,不過也不完全一樣,它的bean類型不是方法的返回值類型,而是實際工廠類造出來的bean類型。因為工廠類不會自己造自己的。

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import yi.beans.Dog;
import yi.config.Dbconfig;
public class App1 {
    public static void main(String[] args) {
        ApplicationContext context=new AnnotationConfigApplicationContext(Dbconfig.class);
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
        Dog dog = context.getBean("dog", Dog.class);
        System.out.println(dog.getClass());
    }
}

4.簡化注解@Import

這種方式也是在我們讀源代碼是最常見的一種bean定義方式。

自定義bean,這里無需使用@Component來聲明了。

import lombok.Data;
@Data
public class Dog {
}

第三方定義的bean,我們也不需要使用@Configuration來聲明了。

import org.springframework.context.annotation.Import;
@Import({Dbconfig.class,Dog.class})
public class ZConfig {
}

這里再導(dǎo)入字節(jié)碼文件時沒有路徑,注意導(dǎo)包不要導(dǎo)錯。

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App1 {
    public static void main(String[] args) {
        ApplicationContext context=new AnnotationConfigApplicationContext(ZConfig.class);
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

可以看到最后面的那兩個就是,前兩個是類對象,他們也被定義為bean加載進(jìn)IOC容器了,不過一般不會使用。

到此這篇關(guān)于SpringBoot Bean花式注解方法示例上篇的文章就介紹到這了,更多相關(guān)SpringBoot Bean注解方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • @RequestBody的使用詳解

    @RequestBody的使用詳解

    這篇文章主要介紹了@RequestBody的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • java模擬post請求發(fā)送json的例子

    java模擬post請求發(fā)送json的例子

    本篇文章主要介紹了java模擬post請求發(fā)送json的例子,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • SpringCloud_Eureka服務(wù)注冊與發(fā)現(xiàn)基礎(chǔ)及構(gòu)建步驟

    SpringCloud_Eureka服務(wù)注冊與發(fā)現(xiàn)基礎(chǔ)及構(gòu)建步驟

    Eureka服務(wù)注冊中心,主要用于提供服務(wù)注冊功能,當(dāng)微服務(wù)啟動時,會將自己的服務(wù)注冊到Eureka Server,這篇文章主要介紹了SpringCloud中Eureka的配置及詳細(xì)使用,需要的朋友可以參考下
    2023-01-01
  • Java結(jié)構(gòu)型模式之橋接模式詳解

    Java結(jié)構(gòu)型模式之橋接模式詳解

    橋接模式是一種很實用的結(jié)構(gòu)型模式,如果系統(tǒng)中某個類存在兩個獨立變化的維度,通過橋接模式將這兩個維度分離出來,使兩者可以獨立擴展
    2023-02-02
  • Java隨機生成驗證碼的實現(xiàn)示例

    Java隨機生成驗證碼的實現(xiàn)示例

    這篇文章主要介紹Java隨機生成驗證碼的實現(xiàn)方法,文中有相關(guān)的實現(xiàn)代碼供大家參考,具有一定的參考價值,需要的朋友可以參考下
    2023-08-08
  • Java延遲隊列原理與用法實例詳解

    Java延遲隊列原理與用法實例詳解

    這篇文章主要介紹了Java延遲隊列原理與用法,結(jié)合實例形式詳細(xì)分析了延遲隊列的概念、原理、功能及具體使用方法,需要的朋友可以參考下
    2018-09-09
  • Java利用openoffice將doc、docx轉(zhuǎn)為pdf實例代碼

    Java利用openoffice將doc、docx轉(zhuǎn)為pdf實例代碼

    這篇文章主要介紹了Java利用openoffice將doc、docx轉(zhuǎn)為pdf實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 關(guān)于java中線程安全問題詳解

    關(guān)于java中線程安全問題詳解

    最近工作中遇到不少多線程問題,但自己一直對多線程的理解比較表層,所以深入研究了一番,下面這篇文章主要給大家介紹了關(guān)于java中線程安全問題的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • 使用Jackson來實現(xiàn)Java對象與JSON的相互轉(zhuǎn)換的教程

    使用Jackson來實現(xiàn)Java對象與JSON的相互轉(zhuǎn)換的教程

    這篇文章主要介紹了使用Jackson來實現(xiàn)Java對象與JSON的互相轉(zhuǎn)換的教程,文中羅列了3中Jackson的使用方式,需要的朋友可以參考下
    2016-01-01
  • Java中的Semaphore如何使用

    Java中的Semaphore如何使用

    Semaphore實際上是一種共享鎖,因為它允許多個線程并發(fā)獲取共享的資源,在Semaphore對象創(chuàng)建時必須設(shè)置可用令牌的初始數(shù)量permits,用于控制并發(fā)時同時獲取資源權(quán)限的線程數(shù)量,這篇文章主要介紹了Java中的Semaphore如何使用,需要的朋友可以參考下
    2022-06-06

最新評論

阜康市| 冕宁县| 仁化县| 忻州市| 于都县| 耒阳市| 武宁县| 崇阳县| 淮南市| 漳州市| 林西县| 建水县| 普陀区| 图木舒克市| 蚌埠市| 乌拉特后旗| 盐亭县| 泾阳县| 铜梁县| 黑龙江省| 武邑县| 山阴县| 隆安县| 永顺县| 文安县| 十堰市| 湟中县| 西平县| 伊金霍洛旗| 赤峰市| 六枝特区| 泸州市| 特克斯县| 荆州市| 彭山县| 中西区| 永济市| 南京市| 全椒县| 虞城县| 平谷区|