`

Spring:@ComponentScan 使用

阅读更多

 

编写不易,转载请注明(http://shihlei.iteye.com/blog/2405675)!

 

一 @ComponentScan 概述

扫描指定表下的Component(@Componment,@Configuration,@Service 等等)

 

存在于:org.springframework.context.annotation 包中

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version${spring.version}</version>
</dependency>

 

二 使用Demo


 

(1)数据准备

package:x.demo.spring.context.scan.pack1

package x.demo.spring.context.scan.pack1;

import org.springframework.stereotype.Component;

@Component
public class Component1 {
    
}

package x.demo.spring.context.scan.pack1;

import org.springframework.stereotype.Component;

@Component
public class Component2 {

}

 

package:x.demo.spring.context.scan.pack3

 

package x.demo.spring.context.scan.pack3;

import org.springframework.stereotype.Component;

@Component
public class Component3 {

}

 

(2)触发Demo

方法1 :代码方式集成:通过AnnotationConfigApplicationContext 触发@ComponentScan使用

 

package x.demo.spring.context.scan;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import x.demo.spring.context.scan.pack1.Component2;
import x.demo.spring.context.scan.pack3.Component3;

@ComponentScan(basePackages = {"x.demo.spring.context.scan.pack1"},
        basePackageClasses = {Component3.class},
        excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Component2.class))
public class ComponentScanAnnotationDemo {

    //打印相关信息
    private static void show(ApplicationContext context) {
        String[] beans = {"component1", "component2", "component3"};

        for (String b : beans) {
            boolean isContains = context.containsBean(b);
            System.out.println(b + " is exist : " + isContains);
            if (isContains) {
                System.out.println(b + " : " + context.getBean(b));
            }
        }
    }

    /**
     * 通过AnnotationConfigApplicationContext 触发@ComponentScan使用
     */
    public static void triggerViaAnnotationConfigApplicationContext() {
        //加载@ComponentScan 的包扫描
        try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();) {
            context.register(ComponentScanAnnotationDemo.class);
            context.refresh();

            show(context);
        }
    }

    public static void main(String[] args) {
        ComponentScanAnnotationDemo.triggerViaAnnotationConfigApplicationContext();
    }
}

 

方法2:xml 方式触发@ComponentScan使用

(a)xml路径:classpath:x.demo.spring.context.scan/spring-scan.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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-3.1.xsd">
    <context:annotation-config/>
    <bean class="x.demo.spring.context.scan.ComponentScanAnnotationDemo"/>
</beans>

 (b)程序:

 

package x.demo.spring.context.scan;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import x.demo.spring.context.scan.pack1.Component2;
import x.demo.spring.context.scan.pack3.Component3;

@ComponentScan(basePackages = {"x.demo.spring.context.scan.pack1"},
        basePackageClasses = {Component3.class},
        excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Component2.class))
public class ComponentScanAnnotationDemo {

    //打印相关信息
    private static void show(ApplicationContext context) {
        String[] beans = {"component1", "component2", "component3"};

        for (String b : beans) {
            boolean isContains = context.containsBean(b);
            System.out.println(b + " is exist : " + isContains);
            if (isContains) {
                System.out.println(b + " : " + context.getBean(b));
            }
        }
    }

    /**
     * xml 方式触发@ComponentScan使用
     */
    public static void triggerViaXml() {

        try (ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext
                ("classpath:x.demo.spring.context.scan/spring-scan.xml");) {
            show(context);
        }
    }

    public static void main(String[] args) {
        ComponentScanAnnotationDemo.triggerViaXml();
    }
}

 

(3)结果

component1 is exist : true
component1 : x.demo.spring.context.scan.pack1.Component1@17baae6e
component2 is exist : false
component3 is exist : true
component3 : x.demo.spring.context.scan.pack3.Component3@69379752

 

三 常用注解属性设置

     (1)basePackages:指定扫描的包,basePackageClasses:指定扫描的类

 

     (2)useDefaultFilters:取消默认filter设置

      默认Filter自动扫描包下的Component,取消相当于禁用某个扫描

 

     (3)@ComponentScan.Filter:

      指定Filter 规则,可用于excludeFilters 排除Filters ,includeFilters 包含Filters(包含的Filters 在禁用默认Filter使用,否则没有意义) 

 

  • 大小: 177 KB
分享到:
评论

相关推荐

    Spring Boot中的@ComponentScan注解:深入理解组件扫描机制

    本文将详细探讨@ComponentScan注解的作用、工作原理以及如何使用它来优化Spring Boot应用程序的组件管理。 @ComponentScan注解是Spring Boot中实现组件自动装配的核心机制。通过合理配置组件扫描,可以提高应用程序...

    springboot @ComponentScan注解原理解析

    当我们使用@ComponentScan注解时,Spring Boot框架会自动扫描指定的包中的Bean,并将其注册到Spring容器中。 在扫描过程中,Spring Boot框架会使用AnnotationConfigApplicationContext类来创建一个应用程序上下文...

    sonar-JAVA检查规则指南.docx

    在 Spring 框架中,使用“@ComponentScan”注解来确定哪些 Spring Bean 在应用程序上下文中可用。但是,如果在默认包中使用“@ComponentScan”,可能会导致应用程序启动速度变慢,并且可能会导致 ...

    spring启动componentscan类扫描加载过程

    首先,`@ComponentScan`注解用于指示Spring容器在指定的包及其子包下搜索带有特定注解(如`@Component`、`@Service`、`@Repository`和`@Controller`)的类,将这些类注册为Bean。在启动过程中,Spring会执行以下步骤...

    Spring注解 - 52注解 - 原稿笔记

    注解包含: 拦截器 , 过滤器 , 序列化 , @After , @AfterReturning , @AfterThrowing , @annotation , @Around , @Aspect , @Autowired , @Bean , @Before , @Component , @ComponentScan , @ComponentScans , @...

    springDemo.zip

    在Spring Boot项目中,通常会有一个主配置类,使用`@SpringBootApplication`注解,它集成了`@Configuration`、`@EnableAutoConfiguration`和`@ComponentScan`的功能。 在Spring Cloud项目中,这些注解同样发挥着...

    Spring Boot:启动原理解析.docx

    @SpringBootApplication 注解是 Spring Boot 的核心注解,它是一个组合注解,实际上是三个 Annotation 的组合:@Configuration、@EnableAutoConfiguration 和 @ComponentScan。这些注解的结合使用,使得 Spring Boot ...

    Spring中 Configuration的使用.docx

    @Configuration 类可以配合 @ComponentScan 使用,自动扫描指定包及其子包下的所有使用了 @Component、@Service、@Repository、@Controller 注解的类,将它们注册为 Spring 容器中的 Bean。例如: ```java @...

    Spring Boot 注解

    一 、注解列表 @SpringBootApplication: 包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。...@ComponentScan: 组件扫描,可自动发现和配置一些Bean。 @Component: 可配合CommandLineRu

    Spring @compenent注解详解

    Spring可以通过`&lt;context:component-scan&gt;` XML标签或`@ComponentScan`注解来自动扫描并注册带有`@Component`及其派生注解的类。扫描范围可以通过指定包名来控制。 5. **别名(Aliases)** 可以通过`@Component(...

    Spring通过在classpath自动扫描方式把组件纳入spring容器中管理

    7. **配置类和@ComponentScan**: 在Spring 3.0引入的@Configuration注解的类中,可以结合@ComponentScan一起使用,这样就不再需要XML配置文件,实现了全注解配置。 8. **工具支持**: 使用IDE如IntelliJ IDEA或...

    Spring笔记(第一次)1

    本笔记将介绍如何从传统的XML配置方式转换为使用注解进行开发,以及Spring的@ComponentScan扫描规则和bean的scope属性。 首先,创建一个Spring项目通常是从构建Maven工程开始的。在`pom.xml`中引入`spring-context`...

    Spring注解开发组件扫描器.zip

    当在Spring配置中启用@ComponentScan注解时,Spring会遍历指定的包及其子包,寻找带有上述组件注解的类,并将它们注册为bean。例如: ```java @Configuration @ComponentScan("com.example.myapp") public class ...

    使用Spring的注解方式实现AOP实例

    使用Spring的注解方式实现AOP实例 使用Spring的注解方式实现AOP实例是指通过使用Spring框架提供的注解方式来实现Aspect-Oriented Programming(面向方面编程)的功能。AOP是面向对象编程的一种补充,能够将跨越多个...

    SpringBoot 44道面试题和答案.docx

    4. 组件扫描:@ComponentScan用于扫描Spring组件,确保所有bean都能被正确加载。 5. 日志框架支持:SpringBoot默认使用Logback,但同时也支持Java Util Logging、Log4j2等,可以通过配置文件选择输出到控制台或文件...

    spring配置基于注解1

    本文将深入探讨在Spring配置类中使用注解的一些关键知识点,包括`includeFilters`、`useDefaultFilters`、`@ComponentScans`、`@Conditional`以及`FactoryBean`。 首先,`includeFilters`和`useDefaultFilters`属性...

    41. Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】

    这些注解都是Spring的@ComponentScan所识别的,它们告诉Spring容器这个类应该被当作一个Bean处理。例如: ```java @Service public class HelloWorldService { public String sayHello() { return "Hello, Spring...

    Spring 自定义注解的解析

    在Spring配置类或者XML配置文件中,使用`@ComponentScan`并添加`@ComponentScan annonation`属性,指定自定义注解的名称。这样,Spring在扫描过程中会识别并处理标记了这个注解的类。 ```java import org.spring...

    Spring IoC源码分析1

    - **XML方式**:传统的Spring配置使用XML文件来定义bean。例如: ```xml ``` 使用`ClassPathXmlApplicationContext`来加载XML配置并创建容器。 ```java ApplicationContext context = new ...

    通过Java配置实现的Spring Boot中大量的自动化配置.docx

    创建Spring MVC的配置文件,同样使用`@Configuration`注解,但这里的`@ComponentScan`需进行调整,`useDefaultFilters`设置为false,并通过`includeFilters`包含`@Controller`注解的类,以确保Spring MVC能够识别并...

Global site tag (gtag.js) - Google Analytics