Spring IOC容器Bean注解创建对象组件扫描

目录
  • Spring IOC Bean注解对象组件扫描
    • 一、spring 针对 bean 管理中创建对象提供注解
      • 1. 引入依赖
      • 2. 开启组件扫描
      • 3. 创建类,并添加注解来创建对象
      • 4. 测试一下
    • 二、组件扫描的其他过滤条件
      • 1. include-filter
      • 2. exclude-filter

Spring IOC Bean注解对象组件扫描

什么是注解?

注解是代码里的特殊标记,格式:

@注解名称(属性名称=属性值, 属性名称2=属性值...)

可以作用在:类、方法、属性上面。

使用注解的目的:简化 xml 配置,让使用配置更简洁优雅。

一、spring 针对 bean 管理中创建对象提供注解

  • @Component
  • @Service
  • @Controller
  • @Repository

这 4 个注解功能是一样的,都可以用来创建 bean 实例。

但是通常实际应用中,为了让开发人员更加清晰当前组件所扮演的角色,一般会让它们各自应用在不同的层。比如 @Service 用在逻辑层、@Service 用在web层等。

示例

1. 引入依赖

引入 AOP 依赖,可以在这里搜索下载需要的 jar 包。

2. 开启组件扫描

其实就是告诉 spring 你要在什么地方使用注解。通过在 xml 里配置,spring就会到对应位置扫描下面的类:

<?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="com.pingguo.spring5.dao"></context:component-scan>
</beans>

现在,我这里有多个包:

如果要扫描多个包,可以用逗号,隔开:

<context:component-scan base-package="com.pingguo.spring5.dao, com.pingguo.spring5.service"></context:component-scan>

如果所有下层的包都要扫描,那也可以之间写上层的目录:

<context:component-scan base-package="com.pingguo.spring5"></context:component-scan>

3. 创建类,并添加注解来创建对象

package com.pingguo.spring5.service;
import org.springframework.stereotype.Component;
@Component(value = "userService")
public class UserService {
    public void add() {
        System.out.println("service add() ... ...");
    }
}

现在终于不用去 xml 写 bean 标签了。

@Component(value = "userService"),这里 value 的值,等同于 <bean id="userService" ...里的 id 。@Component(value = "userService"),这里括号里的 value 可以不写,默认就是类名称的首字母小写。比如 类 UserService 就是 userService 。

4. 测试一下

package com.pingguo.spring5.testdemo;
import com.pingguo.spring5.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestService {
    @Test
    public void testService() {
        ApplicationContext context
                = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
        System.out.println(userService);
        userService.add();
    }
}

运行一下:

com.pingguo.spring5.service.UserService@60611244
service add() ... ...
Process finished with exit code 0

成功。

如果把注解换成其他几个,重新运行测试方法,结果也是一样的。

二、组件扫描的其他过滤条件

在上述的开启扫描配置:

<!--开启组件扫描-->
<context:component-scan base-package="com.pingguo.spring5"></context:component-scan>

意思就是说扫描包路径com.pingguo.spring5下的所有类。

其实这里有个属性 use-default-filters,默认情况下就是等于true,也就是使用默认过滤规则,会去扫描路径下的所有。

那如果use-default-filters="false",就是不使用默认过滤条件,我们可以自己配置过滤。

1. include-filter

在指定的包路径下,只扫描包含了某种注解的类。比如:

<context:component-scan base-package="com.pingguo.spring5" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>

这就是说,在路径com.pingguo.spring5下,只扫描Service注解的类。

2. exclude-filter

与上面相反,这里是除了xx之外,都去扫描。

<context:component-scan base-package="com.pingguo.spring5" use-default-filters="false">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>

做了改动之后,意思也变了。现在是说在路径com.pingguo.spring5下,除了Service注解的类,其他都扫描。

以上就是Spring IOC容器Bean注解创建对象组件扫描的详细内容,更多关于Spring IOC Bean注解对象组件扫描的资料请关注我们其它相关文章!

(0)

相关推荐

  • Spring为IOC容器注入Bean的五种方式详解

    这篇文章主要介绍了Spring为IOC容器注入Bean的五种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一 @Import导入组件,id默认是组件的全类名 //类中组件统一设置.满足当前条件,这个类中配置的所有bean注册才能生效: @Conditional({WindowsCondition.class}) @Configuration @Import({Color.class,Red.class,MyImportSelector

  • Spring IOC容器基于XML外部属性文件的Bean管理

    目录 Spring IOC Bean管理XML 一.常规配置方法 1. 引入依赖 2. xml 文件配置数据库连接池 二.引入外部属性文件来配置数据库连接池 1. 创建外部文件 2. 引入外部文件到xml配置文件中 3. 引用外部文件里的属性 Spring IOC Bean管理XML 有时候,为了灵活方便,我们会把某些固定的数据存放到文件里,然后去读取里面的内容来使用. 比如数据库的连接信息,这些内容就可以放到 properties 文件中,然后使用 xml 配置文件去读取里面的内容,完成需要的

  • Spring IOC容器的Bean管理基于注解属性注入方式

    目录 基于注解方式进行属性注入 一.@Autowired 1. 添加对象注解 2. 在service中注入dao对象 3. 创建测试函数测试效果 二.@Qualifier 三.@Resource 1. 替代 @Autowired 2. 替换 @Qualifier 四.@Value 基于注解方式进行属性注入 涉及到 4 个注解 @Autowired:根据属性类型,进行自动装配 @Qualifier:根据属性名称进行注入,跟 @Autowired 一起使用 @Resource:既可以根据类型注入,也

  • Spring IOC容器Bean管理的完全注解开发放弃配置文件

    目录 IOC容器基于Bean管理的完全注解开发放弃配置文件 创建配置类 测试一下 IOC容器基于Bean管理的完全注解开发放弃配置文件 通过注解的方式,我们不需要在xml配置文件里进行各种注入配置,只需要开启扫描即可. 那如果开启扫描也能通过注解方式,那不就完全不需要配置文件了么? 创建配置类 创建配置类,替代 xml 配置文件. package com.pingguo.spring5.config; import org.springframework.context.annotation.C

  • Spring-IOC容器-Bean管理-基于XML方式超详解

    目录 Spring-IOC容器-Bean管理-基于XML方式 Spring框架概述 IOC概念和原理 IOC 操作 Bean 管理(set方式注入&&使用有参构造进行注入) IOC 操作 Bean 管理(xml注入其他类型属性) IOC 操作 Bean 管理(xml注入集合属性) IOC 操作 Bean 管理(FactoryBean) IOC 操作 Bean 管理(bean 作用域) IOC 操作 Bean 管理(bean 生命周期) IOC 操作 Bean 管理(XML自动装配) IOC

  • Spring IOC原理补充说明(循环依赖、Bean作用域等)

    前言 通过之前的几篇文章将Spring基于XML配置的IOC原理分析完成,但其中还有一些比较重要的细节没有分析总结,比如循环依赖的解决.作用域的实现原理.BeanPostProcessor的执行时机以及SpringBoot零配置实现原理(@ComponentScan.@Import.@ImportSource.@Bean注解的使用和解析)等等.下面就先来看看循环依赖是怎么解决的,在此之前一定要熟悉整个Bean的实例化过程,本篇只会贴出关键性代码. 正文 循环依赖 首先来看几个问题: 什么是循环依

  • Spring IOC容器Bean注解创建对象组件扫描

    目录 Spring IOC Bean注解对象组件扫描 一.spring 针对 bean 管理中创建对象提供注解 1. 引入依赖 2. 开启组件扫描 3. 创建类,并添加注解来创建对象 4. 测试一下 二.组件扫描的其他过滤条件 1. include-filter 2. exclude-filter Spring IOC Bean注解对象组件扫描 什么是注解? 注解是代码里的特殊标记,格式: @注解名称(属性名称=属性值, 属性名称2=属性值...) 可以作用在:类.方法.属性上面. 使用注解的目

  • Spring IOC容器Bean管理XML注入集合类型属性

    目录 一.定义数组.list.map.set类型属性 二.配置文件中进行对应配置 三.注入对象集合类型 四.提取注入集合的部分 1. 引入名称空间 util 2. 使用 util 标签完成集合注入的提取 一.定义数组.list.map.set类型属性 创建类.定义数组.list.map.set类型属性,生成对应set方法. package com.pingguo.spring5.collectiontype; import java.util.Arrays; import java.util.L

  • 使用Java注解模拟spring ioc容器过程解析

    使用注解,简单模拟spring ioc容器.通过注解给对象属性注入值. 项目结构 annotation 包,用于存放自定义注解 Component 注解表示该类为组件类,并需要声明名字 package priv.haidnor.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy;

  • spring IOC容器的Bean管理XML自动装配过程

    目录 什么是自动装配? 自动装配过程 1. 创建 2 个类 2. 配置文件 3. 测试方法 什么是自动装配? 在之前的内容中,每给属性注入值都要一个个的用 property 标签来完成,比如: <bean id="book" class="com.pingguo.spring5.collectiontype.Book" scope="prototype"> <property name="list" ref=

  • 向Spring IOC 容器动态注册bean实现方式

    目录 本文的大纲 从一个需求谈起 Spring Bean的生命周期再完善 BeanDefinition Bean 加入IOC容器的几种方式 从spring容器中动态添加或移除bean 本文的大纲 从一个需求谈起 这周遇到了这样一个需求,从第三方的数据库中获取值,只是一个简单的分页查询,处理这种问题,我一般都是在配置文件中配置数据库的地址等相关信息,然后在Spring Configuration 注册数据量连接池的bean,然后再将数据库连接池给JdbcTemplate, 但是这种的缺陷是,假设填

  • Spring IOC容器FactoryBean工厂Bean实例

    目录 前言 工厂 bean 前言 之前提到的 bean 是我们自己创建的,属于普通类型的 bean.还有一种是工厂 bean,属于 spring 中内置的一种类型. 区别是什么?以此配置为例: <bean id="course2" class="com.pingguo.spring5.collectiontype.Course"> <property name="course_name" value="毛氏面点课&qu

  • 详解Spring IOC 容器启动流程分析

    使用 Spring 时,XML 和注解是使用得最多的两种配置方式,虽然是两种完全不同的配置方式,但对于 IOC 容器来说,两种方式的不同主要是在 BeanDefinition 的解析上.而对于核心的容器启动流程,仍然是一致的. AbstractApplicationContext 的 refresh 方法实现了 IOC 容器启动的主要逻辑,启动流程中的关键步骤在源码中也可以对应到独立的方法.接下来以  AbstractApplicationContext 的实现类  ClassPathXmlAp

随机推荐