欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年02月10日 11:03:54   作者:零維展開智子  
這篇文章主要介紹了SpringBoot Bean花式注解方法,很多時(shí)候我們需要根據(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>

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

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,沒有的話就是它的類名或者方法名首字母小寫。

中間那些我們暫時(shí)不做討論。

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

3.完全注解式

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

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

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)古的項(xiàng)目以前是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類型不是方法的返回值類型,而是實(shí)際工廠類造出來的bean類型。因?yàn)楣S類不會自己造自己的。

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é)碼文件時(shí)沒有路徑,注意導(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)文章

  • JVM指令的使用深入詳解

    JVM指令的使用深入詳解

    這篇文章主要給大家介紹了關(guān)于JVM指令使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • redisson特性及優(yōu)雅實(shí)現(xiàn)示例

    redisson特性及優(yōu)雅實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了redisson特性及優(yōu)雅實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • spring @Profiles和@PropertySource實(shí)現(xiàn)根據(jù)環(huán)境切換配置文件

    spring @Profiles和@PropertySource實(shí)現(xiàn)根據(jù)環(huán)境切換配置文件

    這篇文章主要介紹了spring @Profiles和@PropertySource根據(jù)環(huán)境切換配置文件,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring Boot 3.x 集成 Eureka Server/Client的詳細(xì)過程

    Spring Boot 3.x 集成 Eureka Server/Cl

    隨著SpringBoot 3.x版本的開發(fā)嘗試,本文記錄了在集成Eureka Server/Client時(shí)所遇到的問題和解決方案,文中詳細(xì)介紹了搭建服務(wù)、配置文件和測試步驟,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 查找native方法的本地實(shí)現(xiàn)函數(shù)native_function詳解

    查找native方法的本地實(shí)現(xiàn)函數(shù)native_function詳解

    JDK開放給用戶的源碼中隨處可見Native方法,被Native關(guān)鍵字聲明的方法說明該方法不是以Java語言實(shí)現(xiàn)的,而是以本地語言實(shí)現(xiàn)的,Java可以直接拿來用。這里介紹下查找native方法的本地實(shí)現(xiàn)函數(shù)native_function,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • 如何徹底刪除SVN中的文件和文件夾(附恢復(fù)方法)

    如何徹底刪除SVN中的文件和文件夾(附恢復(fù)方法)

    在SVN中如果刪除某個文件或文件夾也可以在歷史記錄中進(jìn)行找回,有的時(shí)候需要徹底刪除某些文件,即不希望通過歷史記錄進(jìn)行恢復(fù),需要在服務(wù)器上對SVN的數(shù)據(jù)進(jìn)行重新整理
    2014-08-08
  • Jmeter固定定時(shí)器的使用詳解

    Jmeter固定定時(shí)器的使用詳解

    jmeter提供了多種定時(shí)器以便于我們進(jìn)行接口的測試,你知道jmeter提供的定時(shí)器有哪些嗎,本文就詳細(xì)的介紹了Jmeter固定定時(shí)器的使用,感興趣的可以了解一下
    2021-11-11
  • 解決Spring導(dǎo)出可以運(yùn)行的jar包問題

    解決Spring導(dǎo)出可以運(yùn)行的jar包問題

    最近需要解決Maven項(xiàng)目導(dǎo)入可執(zhí)行的jar包的問題,如果項(xiàng)目不包含Spring,那么使用mvn assembly:assembly即可,這篇文章主要介紹了Spring導(dǎo)出可以運(yùn)行的jar包,需要的朋友可以參考下
    2023-03-03
  • Java中內(nèi)核線程理論及實(shí)例詳解

    Java中內(nèi)核線程理論及實(shí)例詳解

    在本篇文章里小編給大家整理了一篇關(guān)于Java中內(nèi)核線程理論及實(shí)例詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • Java中的Set集合簡單匯總解析

    Java中的Set集合簡單匯總解析

    這篇文章主要介紹了Java中的Set集合簡單匯總解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評論