Spring component-scan XML配置与@ComponentScan注解配置

作者:蓝黑2020 时间:2023-07-04 03:37:12 

前言

无论Spring的XML配置或者Java配置,都可以配置自动扫描,也就是在指定包及其子包下的component,都会被自动扫描并被Spring容器管理。

注:component指的是被 @Component 注解及其变种(如 @Controller@Service@Repository@Configuration 等)所修饰的类。

环境:

  • Ubuntu 22.04

  • IntelliJ IDEA 2022.1.3

  • JDK 17.0.3

  • Spring 5.3.21

准备

创建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 目录下创建测试:

public class MyTest {}

创建如下POJO:

  • Axe :Axe接口;

  • StoneAxe :Axe实现类;

  • SteelAxe :Axe实现类;

  • 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 注解来指定优先选择该类。

@Component的bean

XML配置

配置:

src/main/resources 目录下创建 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>

测试:

创建测试如下:

@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配置 配置

创建Java配置类 MyConfig.java 如下:

package config;

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

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

}

测试:

创建测试如下:

@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配置 配置

前面已经配置了:

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

MyConfig2pojo 包下,所以无需额外的配置。

测试

创建测试如下:

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

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

System.out.println(xxx);
   }

运行测试,结果如下:

xxx

Java配置 配置

前面已经配置了:

@ComponentScan(basePackages = {"pojo"})

MyConfig2pojo 包下,所以无需额外的配置。

测试

创建测试如下:

@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})

来源:https://blog.csdn.net/duke_ding2/article/details/126617024

标签:Spring,XML,@ComponentScan
0
投稿

猜你喜欢

  • springboot自定义异常视图过程解析

    2023-06-29 09:44:36
  • Java监听器ActionListener与MouseListener的执行顺序说明

    2022-02-04 20:08:23
  • Android string.xml中的替换方法

    2021-11-10 11:47:56
  • JavaApi实现更新删除及读取节点

    2023-11-10 07:30:33
  • C#中WebBroeser控件用法实例教程

    2021-09-14 18:11:05
  • MybatisPlus整合Flowable出现的坑及解决

    2022-03-28 22:56:35
  • Spring Boot将项目打包成war包的操作方法

    2022-01-02 22:30:50
  • Android天气预报之基于HttpGet对象解析天气数据的方法

    2021-11-01 08:00:13
  • Java NIO深入分析

    2022-12-29 03:50:27
  • java 学习笔记(入门篇)_java程序helloWorld

    2023-02-28 02:53:44
  • SpringBootTest单元测试报错的解决方案

    2021-09-08 23:25:47
  • Android实现从底部弹出的Dialog示例(一)

    2021-09-12 13:33:09
  • Java代理模式与动态代理之间的关系以及概念

    2022-03-15 18:05:34
  • java实现Xml与json之间的相互转换操作示例

    2023-06-21 13:30:39
  • 最最常用的 100 个 Java类分享

    2023-08-21 08:45:05
  • C#实现生成所有不重复的组合功能示例

    2023-04-18 15:49:43
  • 10分钟带你理解Java中的弱引用

    2023-02-09 10:35:55
  • OpenGL Shader实现阴影遮罩效果

    2022-04-23 19:38:02
  • Android自定义ViewPagerIndicator实现炫酷导航栏指示器(ViewPager+Fragment)

    2021-11-05 13:16:12
  • MyBatis-Plus代码生成器的使用详解

    2022-09-04 23:14:40
  • asp之家 软件编程 m.aspxhome.com