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

Spring?component-scan?XML配置與@ComponentScan注解配置

 更新時間:2022年09月01日 14:43:12   作者:藍黑2020  
這篇文章主要介紹了Spring?component-scan?XML配置與@ComponentScan注解配置,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

前言

無論Spring的XML配置或者Java配置,都可以配置自動掃描,也就是在指定包及其子包下的component,都會被自動掃描并被Spring容器管理。

注:component指的是被 @Component 注解及其變種(如 @Controller 、 @Service@Repository 、 @Configuration 等)所修飾的類。

環(huán)境:

  • Ubuntu 22.04
  • IntelliJ IDEA 2022.1.3
  • JDK 17.0.3
  • Spring 5.3.21

準備

創(chuàng)建Maven項目 test0831 。

修改 pom.xml 文件,添加依賴:

        ......
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.21</version>
        </dependency>
        ......

src/test/java 目錄下創(chuàng)建測試:

public class MyTest {}

創(chuàng)建如下POJO:

  • Axe :Axe接口;
  • StoneAxe :Axe實現(xiàn)類;
  • SteelAxe :Axe實現(xiàn)類;
  • Person :Person持有Axe
package pojo;

public interface Axe {
    public void chop();
}
package pojo;
import org.springframework.stereotype.Component;
@Component
public class StoneAxe implements Axe{
    @Override
    public void chop() {
        System.out.println("Stone axe!");
    }
}
package pojo;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
@Component
@Primary
public class SteelAxe implements Axe{
    @Override
    public void chop() {
        System.out.println("Steel axe!");
    }
}
package pojo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Person {
    private String name;
    private Axe axe;

    public void setAxe(Axe axe) {
        this.axe = axe;
    }
    public void setName(String name) {
        this.name = name;
    }

    public void useAxe() {
        System.out.println("I am " + name);
        axe.chop();
    }
    @Autowired
    public Person(@Value("Tom") String name, Axe axe) {
        this.name = name;
        this.axe = axe;
    }
}

注:本例使用了 @Autowired 注解來自動裝配注入,默認是 byType ,當有多個類都滿足條件時Spring會報錯,所以使用了 @Primary 注解來指定優(yōu)先選擇該類。

@Component的bean

XML配置

配置:

src/main/resources 目錄下創(chuàng)建 applicationContext.xml 文件:

<?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
        http://www.springframework.org/schema/context/spring-context.xsd">

   <context:component-scan base-package="pojo"/>

</beans>

測試:

創(chuàng)建測試如下:

    @Test
    public void test1() {
        var ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        var person = ctx.getBean("person", Person.class);
        person.useAxe();
    }

運行測試,結果如下:

I am Tom
Steel axe!

Java配置 配置

創(chuàng)建Java配置類 MyConfig.java 如下:

package config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = {"pojo"})
public class MyConfig {

}

測試:

創(chuàng)建測試如下:

    @Test
    public void test2() {
        var ctx = new AnnotationConfigApplicationContext(MyConfig.class);

        var person = ctx.getBean("person", Person.class);

        person.useAxe();
    }

運行測試,結果如下:

I am Tom
Steel axe!

@Configuration的bean

自動掃描時,如果遇到Java配置類,也會加載其配置。

pojo 包下添加Java配置類 MyConfig2

package pojo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfig2 {
    @Bean
    public String xxx() {
        return "xxx";
    }
}

本例中, MyConfig2 是一個配置類,其中配置了ID為 xxx 的bean。

XML配置 配置

前面已經(jīng)配置了:

   <context:component-scan base-package="pojo"/>

MyConfig2pojo 包下,所以無需額外的配置。

測試

創(chuàng)建測試如下:

    @Test
    public void test3() {
        var ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        var xxx = ctx.getBean("xxx", String.class);

        System.out.println(xxx);
    }

運行測試,結果如下:

xxx

Java配置 配置

前面已經(jīng)配置了:

@ComponentScan(basePackages = {"pojo"})

MyConfig2pojo 包下,所以無需額外的配置。

測試

創(chuàng)建測試如下:

    @Test
    public void test4() {
        var ctx = new AnnotationConfigApplicationContext(MyConfig.class);

        var xxx = ctx.getBean("xxx", String.class);

        System.out.println(xxx);
    }

運行測試,結果如下:

xxx

小結

@Configuration@Component 的變種,因此也會被自動掃描并加載。

如果Java配置類不是在自動掃描的路徑里,則需要顯式加載:

通過XML配置加載:

   <context:annotation-config/>

   <bean class="config.MyConfig3"/>

通過Java配置加載:

@Import({MyConfig3.class})

總結

  • 在類上添加 @Component (或者其變種)注解。
  • 配置自動掃描,以下兩種方式都可以:

XML配置:

   <context:component-scan base-package="pojo"/>

Java配置:

@Configuration
@ComponentScan(basePackages = {"pojo"})
public class MyConfig {

}

對于自動掃描路徑里面的Java配置類( @Configuration 注解所修飾的類),也會被加載生效。

注:關于Spring的XML配置和Java配置,詳見我另一篇文檔 https://blog.csdn.net/duke_ding2/article/details/125605817 。

關于SpringBoot

SpringBoot的入口程序一般如下:

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

即,調(diào)用 SpringApplication.run() 方法來啟動程序,第一個參數(shù)是一個類,該類需要被 @SpringBootApplication 注解所修飾。

@SpringBootApplication 該注解包含了以下3個注解:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

也就是說, @SpringBootApplication 包含了上面提到的Java配置的兩個注解 @Configuration
@ComponentScan 。

換句話說, @SpringBootApplication 所修飾的類就是程序的主配置類。

有一點需要注意的是,在默認情況下(沒有指定包掃描路徑),會自動掃描主配置類所在的包(及其子包)。因此,該包及子包下的組件類和配置類都會被掃描。

當然也可以顯式指定包掃描路徑,需要注意的是,其屬性名是 scanBasePakcages ,而不是 basePackages 。

對比下面兩個注解:

  • @ComponentScan(basePackages = "com.example.demo.pojo")
  • @SpringBootApplication(scanBasePackages = "com.example.demo.pojo")

若顯式指定了包掃描路徑,則會覆蓋默認設置(主配置類所在的包及子包不會被掃描)。

到此這篇關于Spring component-scan XML配置與@ComponentScan注解配置的文章就介紹到這了,更多相關Spring XML配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決@Autowired注入static接口的問題

    解決@Autowired注入static接口的問題

    這篇文章主要介紹了解決@Autowired注入static接口的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 深入講解Java 9中的九個新特性

    深入講解Java 9中的九個新特性

    Java 8 發(fā)布三年多之后,即將快到2017年7月下一個版本發(fā)布的日期了。 你可能已經(jīng)聽說過 Java 9 的模塊系統(tǒng),但是這個新版本還有許多其它的更新。 這里有九個令人興奮的新功能將與 Java 9 一起發(fā)布。需要的朋友可以參考學習,下面來一起看看吧。
    2017-05-05
  • SpringBoot整合Mybatis與MybatisPlus方法詳細講解

    SpringBoot整合Mybatis與MybatisPlus方法詳細講解

    這篇文章主要介紹了SpringBoot整合Mybatis與MybatisPlus方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • Java觀察者模式例子

    Java觀察者模式例子

    這篇文章主要介紹了Java觀察者模式例子的相關資料,需要的朋友可以參考下
    2015-12-12
  • Java?Bean?作用域及它的幾種類型介紹

    Java?Bean?作用域及它的幾種類型介紹

    這篇文章主要介紹了Java?Bean作用域及它的幾種類型介紹,Spring框架作為一個管理Bean的IoC容器,那么Bean自然是Spring中的重要資源了,那Bean的作用域又是什么,接下來我們一起進入文章詳細學習吧
    2022-09-09
  • java split結果去除空字符串的方法實現(xiàn)

    java split結果去除空字符串的方法實現(xiàn)

    在Java開發(fā)中,我們經(jīng)常需要對字符串進行分割操作,本文主要介紹了java split結果去除空字符串的方法實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • SpringBoot集成itext實現(xiàn)html轉(zhuǎn)PDF

    SpringBoot集成itext實現(xiàn)html轉(zhuǎn)PDF

    iText是著名的開放源碼的站點sourceforge一個項目,是用于生成PDF文檔的一個java類庫,本文主要介紹了如何利用itext實現(xiàn)html轉(zhuǎn)PDF,需要的可以參考下
    2024-03-03
  • Java中類的加載順序剖析(常用于面試題)

    Java中類的加載順序剖析(常用于面試題)

    這篇文章主要介紹了Java中類的加載順序剖析(常用于面試題),本文直接給出代碼實例和運行結果,給后給出了加載過程總結,需要的朋友可以參考下
    2015-03-03
  • 深入理解JVM自動內(nèi)存管理

    深入理解JVM自動內(nèi)存管理

    對于Java虛擬機在內(nèi)存分配與回收的學習,本文主要介紹了JVM自動內(nèi)存管理,文中通過圖文示例介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • java處理日期的工具類DateUtil

    java處理日期的工具類DateUtil

    這篇文章主要為大家詳細介紹了java處理日期的工具類DateUtil,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10

最新評論

舒城县| 通化县| 宁波市| 辛集市| 平阳县| 循化| 蓝山县| 会昌县| 北安市| 涪陵区| 福建省| 邛崃市| 扬中市| 响水县| 林州市| 河池市| 咸宁市| 四会市| 思茅市| 荔波县| 武乡县| 商都县| 旅游| 和政县| 伊金霍洛旗| 微山县| 普格县| 石屏县| 德化县| 阳春市| 通河县| 土默特左旗| 樟树市| 南和县| 兴海县| 金山区| 清苑县| 文昌市| 临洮县| 宜春市| 从化市|