关于spring的扫描

简介: 1、扫描声明bean.在spring项目中要用到bean就得先在配置文件中声明,声明后spring才能实现ioc和aop。 在一个稍大的项目中,通常会有上百个组件,如果这些组件采用XML的bean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。

1、扫描声明bean.

在spring项目中要用到bean就得先在配置文件中声明,声明后spring才能实现ioc和aop。

<!-- 配置Handler -->
    <bean id="itemsController1" name="/queryItems_test.action" class="cn.itcast.ssm.controller.ItemsController1" />
    <!-- 配置另外一个Handler -->
    <bean id="itemsController2" class="cn.itcast.ssm.controller.ItemsController2" />

在一个稍大的项目中,通常会有上百个组件,如果这些组件采用XML的bean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。Spring为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在XML文件中使用bean节点配置组件是一样的。要使用自动扫描机制,我们只要在配置文件中加入下面这一句代码就够了。

<context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>

其中spring会扫描base-package是引用的包,这样一句代码相当于配置了该包下的所以bean。
base-package=”cn.itcast.ssm.*”则表示扫描cn.itcast.ssm的所有子包,用逗号隔开不同包名即可扫描不同的包,如:base-package=”cn.itcast.ssm1.controller1,cn.itcast.ssm2.controller2”。在实际开发中基本都是用扫描包来实现的声明bean的。

2、注解处理器适配器和注解的处理器映射器。

使用spring注解需要配置注解处理器适配器和注解的处理器映射器。这项配置可以用简单的一句代码来实现:,甚至如果使用了上面的包扫描还可以把这句代码都省略。

注解映射器
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    注解适配器
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> -->

    <!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置
    mvc:annotation-driven默认加载很多的参数绑定方法,
    比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
    实际开发时使用mvc:annotation-driven
     -->
<mvc:annotation-driven></mvc:annotation-driven>

还可以在这里配置一些其他的内容,如

<mvc:annotation-driven conversion-service="conversionService">
</mvc:annotation-driven>
<!-- conversionService -->
    <bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <!-- 转换器 -->
        <property name="converters">
            <list>
                <bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
            </list>
        </property>
    </bean>

这里conversion-service=”conversionService”是用来配置自定义参数的。

3、扫描实体类

spring和mybatis整合使用就必须为每个实体类定义别名,如下代码,可以针对单个别名定义,也可以指定包名批量定义。批量别名定义时,指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)。定义别名是为了在mapper中用到这个类的时候可以不用写全路径。

<!-- 别名定义 -->
    <typeAliases>

        <!-- 针对单个别名定义
        type:类型的路径
        alias:别名
         -->
        <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->
        <!-- 批量别名定义 
        指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)
        -->
        <package name="cn.itcast.mybatis.po"/>

    </typeAliases>

定义完每个类的别名后,每个为实体类操作数据库的mapper都要通过配置文件声明。加载映射文件是为了可以serviceImpl中直接调用mapper.java中的接口,不用通过sqlSession来调用mapper里面的接口操作数据库。

<!-- 加载 映射文件 -->
    <mappers>
        <mapper resource="sqlmap/User.xml"/>

        <!--通过resource方法一次加载一个映射文件 -->
        <!-- <mapper resource="mapper/UserMapper.xml"/> -->

        <!-- 通过mapper接口加载单个 映射文件
        遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
        上边规范的前提是:使用的是mapper代理方法
         -->
        <!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> -->

        <!-- 批量加载mapper
        指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
        遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
        上边规范的前提是:使用的是mapper代理方法
         -->
        <package name="cn.itcast.mybatis.mapper"/>

    </mappers>

当spring和mybatis整合时,由于使用spring和mybatis的整合包进行mapper扫描,在spring容器里配置了,这里就不需要配置,但必须遵循:mapper.xml和mapper.java文件同名且在一个目录。在spring容器配置mapper:

<!-- mapper扫描器 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开 -->
        <property name="basePackage" value="cn.itcast.ssm.mapper"></property>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>
目录
相关文章
|
1月前
|
Java Spring 容器
【Java】Spring如何扫描自定义的注解?
【Java】Spring如何扫描自定义的注解?
30 0
|
4月前
|
Java 编译器 Spring
[Spring 企业应用加速小技巧]将bean扫描提前到编译器,加快应用启动速度
[Spring 企业应用加速小技巧]将bean扫描提前到编译器,加快应用启动速度
|
5月前
|
Java Spring
spring 类扫描功能使用
spring 类扫描功能使用
21 0
|
7月前
|
XML Java 数据格式
Spring基础教程—Classpath扫描和管理的组件
Spring基础教程—Classpath扫描和管理的组件
65 0
|
9月前
|
安全 IDE Java
Spring高手之路10——解锁Spring组件扫描的新视角
这篇文章详细讲解了Spring包扫描的各种特性和策略,包括基础的包扫描路径设置,按注解过滤,正则表达式过滤,Assignable类型过滤,以及自定义过滤等多种过滤策略。同时,文章还深入分析了Spring是如何生成默认bean名称的源码,并介绍了Java的内省机制在生成默认bean名称中的应用。这篇文章为你成为Spring高手打下坚实的基础。
115 1
Spring高手之路10——解锁Spring组件扫描的新视角
|
9月前
|
XML 开发框架 JSON
Spring注解扫描:ComponentScan使用及原理详解
当下`Spring Boot`之所以能成为主流首选开发框架,得益于其核心思想:**约定大于配置**和`Spring`提供的基于注解配置式开发,解决了繁琐的`XML`文件配置问题,大大提高了开发效率。基于`Spring MVC`三层架构框架开发的项目中大量用到`@Controller, @Service...`等注解,即使这些类在不同包路径下,都能被注入到`Spring`容器中,然后可以相互之间进行依赖注入、使用。这时候就有一个问题了:`Spring`是如何将声明了`@Component`注解的Bean注入到`Spring`容器当中的呢?怎么做到bean的类定义可以随意写在不同包路径下?
250 0
|
9月前
|
Java Spring
Spring扫描逻辑原码解析(带图好理解)
Spring扫描逻辑原码解析(带图好理解)
|
11月前
|
XML 前端开发 Java
Spring-基于注解的配置[01定义Bean+扫描Bean]
Spring-基于注解的配置[01定义Bean+扫描Bean]
93 0
|
XML 消息中间件 SpringCloudAlibaba
Spring——2、使用@ComponentScan自动扫描组件并指定扫描规则
在实际项目中,我们更多的是使用Spring的包扫描功能对项目中的包进行扫描,凡是在指定的包或其子包中的类上标注了@Repository、@Service、@Controller、@Component注解的类都会被扫描到,并将这个类注入到Spring容器中。 Spring包扫描功能可以使用XML配置文件进行配置,也可以直接使用@ComponentScan注解进行设置,使用@ComponentScan注解进行设置比使用XML配置文件来配置要简单的多。
338 0
Spring——2、使用@ComponentScan自动扫描组件并指定扫描规则
|
XML 设计模式 Java
最新最全面的Spring详解(二)——classpath扫描和组件管理(下)
最新最全面的Spring详解(二)——classpath扫描和组件管理(下)
最新最全面的Spring详解(二)——classpath扫描和组件管理(下)