`
newleague
  • 浏览: 1492230 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

Spring的组件自动扫描机制

 
阅读更多

Spring将所有的bean都纳入到IOC中创建、管理和维护。对于大型的项目而言,项目中会有成百上千个bean,如果我们都在配置文件中配置,那么我们就会增加配置文件的体积,显得过于臃肿,过于庞大,查找维护起来也不太方便。

在Spring2.5中引入了组件自动扫描机制,通过在classpath自动扫描的方式把组件纳入到Spring容器中。这大大减少了程序员在配置XML文件上的时间,使得配置文件显得干净,整洁,便于维护。

这种机制的工作步骤是:

1.配置需要扫描的类;

2.在需要被纳入Spring容器的类上加上相应的注解;

3.Spring在类路径下寻找标注了注解的类,并把这些类纳入Spring容器中管理。

它的作用是和在XML文件中使用<bean>节点配置组件是一样的。

 

自动扫描组件的使用

第一步:配置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"

xmlns:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans 

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-2.5.xsd

">

<!-- 打开Spring组件自动扫面,并配置要扫描的基本包 -->

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

</beans>

注:<context:component-scan>节点用于通知Spring容器扫描组件,base-package属性用于指定将要被扫描的组件所在的包名称。

第二步:为需要被扫描的类添加相应的注解;注解的类型有以下几种:

· @Service 用于标注业务层组件;

· @Repository 用于标注数据访问层组件;

· @Controller 用于标注控制层组件(如:Struts中的action)

· @Component 表示泛型组件,当组件不好归类的时候,我们可以使用这个组件进行注解。

第三步:当为类添加完成注解后,我们需要测试相应的组件是否被纳入Spring容器,所以我们需要测试组件是否被扫描;如下:

@Test

public void testAddUser()

{

UserBiz userBiz = (UserBiz)context.getBean("userBizImpl");

System.out.println(userBiz);

}

如果输出不为空,则说明测试类已经被扫描并且纳入了Spring容器。

细节问题总结:

1.当我们进行测试时,用ApplicationContext对象的getBean()方法寻找组件。在之前的配置文件中我们会用<bean>标签的id属性去定义,在使用注解后怎样获得组建的id呢?

在这种情况下,Spring会将被标注注解的类名拿到,然后再将该类名的第一个字母变为小写,放到getBean()方法中。如:UserBizImpl类的组件Id就会是userBizImpl,获取时为context.getBean("userBizImpl");

那么,我们在使用注解时可以自定义组件的Id吗?

当然可以。我们需要在为相应的类添加注解时,在注解之后添加自定义的类名,例如:

@Service("userBiz")

public class UserBizImpl implements UserBiz {

……

}

当我们在获取该组件时,为context.getBean("userBiz);

2.在配置文件中我们可以对组件(bean)的作用域范围进行设置,它的默认值是单例模式,那么在添加注解的情况下,我们怎样设置组件的作用域范围呢?

我们可以直接在为类添加注解的同时,运用另一个注解@Scope("prototype")来设置,如下

@Service("userBiz")@Scope("prototype")

public class UserBizImpl implements UserBiz {

……

}

3.在使用注解时,为组件设置初始化和销毁方法:

在添加注解的相应的类中,如果想初始化或销毁某个方法,我们可以直接在方法上添加注解,如下:

@PostConstruct

public void addItem() {

System.out.println("初始化方法");

}

@PreDestroy

public void testItem() {

System.out.println("释放资源");

}

4.在使用Spring自动扫描组件后,怎样进行依赖注入?

运用注解@Resource和@Autowired,并为依赖对象设置名称,例如:

@Resource(name="userDao")

private UserDAO userDao = null;

首先它会根据名称去找Spring自动扫描的并加入到Spring容器的组件(bean),如果有相同的名称,则进行依赖注入,如果没有相同的名称。则会根据类型区寻找组件。

分享到:
评论

相关推荐

    Spring组件自动扫描详解及实例代码

    总而言之,Spring组件自动扫描机制极大地简化了Spring项目的配置,提高了开发效率。通过理解和应用@Component、@Repository、@Service和@Controller等注解,开发者可以让Spring自动地管理应用程序中的各种组件,从而...

    Spring的自动扫描注入.docx

    在 Spring 2.5 中,引入了组件自动扫描机制,该机制可以在类路径下寻找标注了 @Component、@Service、@Controller、@Repository 注解的类,并将这些类纳入 Spring 容器中管理。 @Component、@Repository、@Service...

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

    Spring自动扫描机制主要涉及以下几个关键概念: 1. **@Component**: 这是最基本的组件注解,可以标记在任何业务逻辑类上。Spring会将这些类视为bean并纳入管理。如果你需要更具体地表示某种类型的组件,可以使用它...

    Spring扫描器—spring组件扫描使用详解

    Spring组件扫描的原理基于Java的注解处理和反射机制。它会遍历指定包及其子包下的所有类,寻找带有特定注解(如@Service、@Component、@Repository、@Controller等)的类,并将这些类实例化为Spring容器中的bean。...

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

    @ComponentScan注解是Spring Boot中实现组件自动装配的核心机制。通过合理配置组件扫描,可以提高应用程序的模块化程度、可维护性和启动性能。 本文通过深入分析@ComponentScan注解的工作原理和使用场景,为读者...

    26. 改变自动扫描的包【从零开始学Spring Boot】

    改变自动扫描的包【从零开始学Spring Boot】”涉及到的是Spring Boot框架中的组件扫描机制。在Spring Boot中,自动配置是其核心特性之一,它能够根据项目依赖来自动配置相应的Bean。默认情况下,Spring Boot会扫描...

    spring组件扫描contextcomponent-scan使用详解.pdf

    在 Spring 框架中,组件扫描是指通过注解和 XML 配置来自动检测和加载Bean的过程。下面将详细介绍标签的使用方式和原理。 一、标签的作用 标签是 Spring 框架中用于组件扫描的核心标签。该标签可以自动检测和加载...

    spring包扫描配置的项目

    首先,我们来看`@Component`注解,它是所有Spring组件的基础注解。你可以将其放在任何类上,表示这个类是一个Spring管理的bean。如果需要对bean进行更具体的分类,可以使用它的衍生注解,如`@Service`(用于业务层)...

    Spring EntityManager 不能扫描jar 中的class文件

    这个问题通常出现在使用Spring自动扫描机制来查找并加载JPA实体类时,如果这些实体类位于外部的jar包中,Spring可能无法正确识别和处理。 Spring通过`@EntityScan`或`&lt;jpa:entity-manager-factory&gt;`等配置元素来...

    详解spring自动扫描包

    Spring框架中自动扫描包的机制是从Spring 2.5版本引入的,这个机制可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进Spring容器中管理。这个机制的作用和在XML...

    Spring自动扫描

    ### Spring自动扫描详解 #### 一、背景介绍 在Spring框架的发展过程中,为了更好地管理和配置Bean,Spring2.5引入了一种更为灵活便捷的方式——自动扫描(Auto Scan)。这一特性使得开发者无需在XML配置文件中显式...

    Spring自动扫描无法扫描jar包中bean的解决方法

    在实际开发中,除了上述解决方法,还可以考虑使用其他策略,例如使用`@Import`注解导入特定的配置类,或者在主配置中显式声明Bean,以确保即使在自动扫描失败的情况下也能正常加载必要的组件。同时,持续关注Spring...

    springmvc+spring4+mybatis3整合,自动扫描

    2. **创建Spring配置文件**:定义Bean,包括数据源、SqlSessionFactory、MapperScannerConfigurer(用于自动扫描Mapper接口)等。例如,可以配置`context.xml`来管理Spring的Bean,`servlet-context.xml`来配置...

    Spring demo 自动检测注解

    7. **组件扫描**:Spring的`@Component`、`@Service`、`@Repository`和`@Controller`等注解用于标记组件类,配合`@ComponentScan`可以自动检测并注册这些类到IoC容器,从而实现bean的自动创建和依赖注入。...

    使用xml和annotation实现类似spring依赖注入和自动扫描类的功能

    除了依赖注入,Spring的自动扫描功能也是其核心特性之一。通过指定包扫描路径,Spring可以自动发现并管理所有标记为组件的类。在XML配置中,我们使用`&lt;context:component-scan&gt;`标签来实现: ```xml ``` 这将扫描...

    使用Spring事件机制实现异步的方法

    使用@EventListener注解也可以轻松地实现事件监听器,Spring框架将自动扫描带有该注解的类,并将其添加到ApplicationContext中。在上面的代码中,使用@EventListener注解的MyEventHandler类将被Spring框架自动添加到...

Global site tag (gtag.js) - Google Analytics