Spring注解驱动开发(二)--组件注入

一、前言

  上一篇我们搭建了一个简单的Spring项目,并简单的使用了 组件注册。这一篇中,我们来详细的讲解组件注入。

二、组件注入

1. @ComponentScan

  在上一篇中,我们使用了@Configuration和@Bean实现了组件注入。但是如果需要注入的组件很多的情况下,每个组件都需要通过一个@Bean注解进行注入,这样就会很麻烦。所以Spring提供了@ComponentScan注解。

  @ComponentScan可以指定需要扫描的包,在这些包下,@Component注解标注的组件都会注入到Spring容器中。

  注意,@Controller、@Service、@Repository这些注解包含@Component注解的功能。

@Controller
public class PersonController {
}
@Service
public class PersonService {
}
@Repository
public class PersonDao {
}
@ComponentScan(basePackages = "indi.zqc")
@Configuration
public class MainConfig {

    @Bean(name = "person")
    public Person person() {
        return new Person("张三", 13);
    }

}
public class MainConfigTest {

    @Test
    public void test() {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        // 获取容器中的所有Bean描述
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String name : beanDefinitionNames) {
            System.out.println(name);
        }
    }
}

2. 自定义TypeFilter

  在使用@ComponentScan注解时,会将扫描包下所有@Component标注的组件都注入到Spring容器中。但有时候我们不需要注入某个或某些组件,可能你会想把@Component注解去掉就好了。但有这么个场景,如果你想注入的包是第三方的包,这时你就不能修改第三方包中的代码。@ComponentScan注解有一个excludeFilters属性可以排除组件。如下图中,将PersonController排除在外。

@ComponentScan(basePackages = "indi.zqc",
        excludeFilters = {
                @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = PersonController.class)
        })
@Configuration
public class MainConfig {

    @Bean(name = "person")
    public Person person() {
        return new Person("张三", 13);
    }

}

  @ComponentScan.Filter的类型有多种

  • FilterType.ANNOTATION    通过注解匹配,配合参数classes指定注解类型
  • FilterType.ASSIGNABLE_TYPE    通过类匹配,配合参数classes指定类类型
  • FilterType.ASPECTJ    通过AspectJ类型的表达式匹配,配合参数pattern指定表达式
  • FilterType.REGEX    通过正则表达式匹配类名,配合参数pattern指定表达式
  • FilterType.CUSTOM 通过自定义,配合参数classes指定类,自定义类需要实现接口org.springframework.core.type.filter.TypeFilter

  可以通过属性excludeFilters将指定的组件排除在外,当然也可以通过includeFilters导入指定的组件。

  注意我们先通过userDefaultFilters=false关闭了@CompenentScan默认的功能。然后通过属性includeFilters导入了指定的组件。

@ComponentScan(basePackages = "indi.zqc",
        includeFilters = {
                @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = PersonController.class)
        },
        useDefaultFilters = false)
@Configuration
public class MainConfig {

    @Bean(name = "person")
    public Person person() {
        return new Person("张三", 13);
    }

}

3. @Scope

4. @Lazy

5. @Conditional

三、链接

《Spring注解驱动开发(一)--项目搭建》

《Spring注解驱动开发(二)--组件注入》

原文地址:https://www.cnblogs.com/zhuqianchang/p/11407642.html

时间: 2024-10-12 20:19:43

Spring注解驱动开发(二)--组件注入的相关文章

Spring注解驱动开发(一)-----组件注册

注册bean xml方式 1.beans.xml-----很简单,里面注册了一个person bean <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xm

【spring 注解驱动开发】组件注册

组件注册 1.@Configuration&@Bean给容器中注册组件 2.@ComponentScan-自动扫描组件&指定扫描规则 3.自定义TypeFilter指定过滤规则 4.@Scope-设置组件作用域 5.@Lazy-bean懒加载 6.@Conditional-按照条件注册bean 7.@Import-给容器中快速导入一个组件 8.@Import-使用ImportSelector 9.@Import-使用ImportBeanDefinitionRegistrar 10.使用Fa

Spring 注解驱动(二)WEB 注解开发

Spring 注解驱动(二)WEB 注解开发 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 一.基本使用 在 Servlet 3.0 时支持注解启动,不再需要 web.xml 配制文件. 1.1 Servlet 3.0 注解 Servlet 3.0 常用注解: @WebServlet @WebFilter @WebInitParam @WebListener @WebServlet("/hello") pu

Spring注解驱动开发(一)--项目搭建

一. 前言 <Spring注解驱动开发>系列文章是基于Spring的4.3.11.RELEASE版本,通过注解的方式进行开发演示. 二. 项目搭建 1.依赖包引用 创建一个maven工程,引入相关的依赖包.我们以依赖最少的原则只引用spring-context和junit包. <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>s

Spring注解驱动开发(五)-----扩展原理

扩展原理 1.BeanPostProcessor-----bean后置处理器,bean创建对象初始化前后进行拦截工作的 2.BeanFactoryPostProcessor-----beanFactory的后置处理器在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容:所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建. 注:首先spring容器会创建beanDefinition,此时bean并没有初始化. 示例: ExtConfi

Spring注解驱动开发(四)-----aop、声明式事务

AOP 概念 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式:-----基于动态代理 一个aop示例 1.导入aop模块:Spring AOP:(spring-aspects)-----导入相关jar包 2.MathCalculator-----一个业务逻辑的类-----在业务逻辑运行的时候将日志进行打印(方法之前.方法运行结束.方法出现异常,xxx) package com.atguigu.aop; public class MathCalculator { publ

Spring注解驱动开发(六)-----spring容器创建【源码】

Spring容器的refresh()[创建刷新] 1.prepareRefresh()刷新前的预处理 1).initPropertySources()初始化一些属性设置;子类自定义个性化的属性设置方法: 2).getEnvironment().validateRequiredProperties();检验属性的合法等 3).earlyApplicationEvents= new LinkedHashSet<ApplicationEvent>();保存容器中的一些早期的事件: 2.obtainF

Spring注解驱动开发(七)-----servlet3.0、springmvc

ServletContainerInitializer Shared libraries(共享库) / runtimes pluggability(运行时插件能力) 1.Servlet容器启动会扫描,当前应用里面每一个jar包的 ServletContainerInitializer的实现2.提供ServletContainerInitializer的实现类: 必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer 文件

Spring注解驱动开发--属性赋值

前言 在实际开发当中,Spring中bean的属性直接赋值用的不是太多,整理这方面的资料,做一个小结,以备后续更深入的学习. 通过配置文件的方式 以配置文件的方式启动spring容器时,可以使用property标签的value给bean的属性赋值,赋值的形式有以下几种: <--通过context:property-placeholder将properties文件中的值加载的环境变量中(properties中的属性值最终是以环境变量的形式存储的)><context:property-pla