来源:http://blog.163.com/qqabc20082006@126/blog/static/2292852520091128103316534/
Spring的组件自动扫描机制
2009-12-2810:33:16|分类:Spring|字号订阅
Spring将所有的bean都纳入到IOC中创建、管理和维护。对于大型的项目而言,项目中会有成百上千个bean,如果我们都在配置文件中配置,那么我们就会增加配置文件的体积,显得过于臃肿,过于庞大,查找维护起来也不太方便。
在Spring2.5中引入了组件自动扫描机制,通过在classpath自动扫描的方式把组件纳入到Spring容器中。这大大减少了程序员在配置XML文件上的时间,使得配置文件显得干净,整洁,便于维护。
这种机制的工作步骤是:
1.配置需要扫描的类;
2.在需要被纳入Spring容器的类上加上相应的注解;
3.Spring在类路径下寻找标注了注解的类,并把这些类纳入Spring容器中管理。
它的作用是和在XML文件中使用<bean>节点配置组件是一样的。
自动扫描组件的使用
第一步:配置applicationContext.xml文件;如下:
<?xmlversion="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-scanbase-package="com.springtest"></context:component-scan>
</beans>
注:<context:component-scan>节点用于通知Spring容器扫描组件,base-package属性用于指定将要被扫描的组件所在的包名称。
第二步:为需要被扫描的类添加相应的注解;注解的类型有以下几种:
·@Service用于标注业务层组件;
·@Repository用于标注数据访问层组件;
·@Controller用于标注控制层组件(如:Struts中的action)
·@Component表示泛型组件,当组件不好归类的时候,我们可以使用这个组件进行注解。
第三步:当为类添加完成注解后,我们需要测试相应的组件是否被纳入Spring容器,所以我们需要测试组件是否被扫描;如下:
@Test
publicvoidtestAddUser()
{
UserBizuserBiz=(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")
publicclassUserBizImplimplementsUserBiz{
……
}
当我们在获取该组件时,为context.getBean("userBiz);
2.在配置文件中我们可以对组件(bean)的作用域范围进行设置,它的默认值是单例模式,那么在添加注解的情况下,我们怎样设置组件的作用域范围呢?
我们可以直接在为类添加注解的同时,运用另一个注解@Scope("prototype")来设置,如下
@Service("userBiz")@Scope("prototype")
publicclassUserBizImplimplementsUserBiz{
……
}
3.在使用注解时,为组件设置初始化和销毁方法:
在添加注解的相应的类中,如果想初始化或销毁某个方法,我们可以直接在方法上添加注解,如下:
@PostConstruct
publicvoidaddItem(){
System.out.println("初始化方法");
}
@PreDestroy
publicvoidtestItem(){
System.out.println("释放资源");
}
4.在使用Spring自动扫描组件后,怎样进行依赖注入?
运用注解@Resource和@Autowired,并为依赖对象设置名称,例如:
@Resource(name="userDao")
privateUserDAOuserDao=null;
首先它会根据名称去找Spring自动扫描的并加入到Spring容器的组件(bean),如果有相同的名称,则进行依赖注入,如果没有相同的名称。则会根据类型区寻找组件。
<context:component-scanbase-package="com.mycompany">
<context:include-filtertype="regex"expression="com\..mycompany\..service\...*"/>
<context:exclude-filtertype="aspectj"expression="com.mycompany.util..*"/>
</context:component-scan>
当有<context:component-scan/>后,就可以将<context:annotaion-config/>移除了。
相关推荐
总而言之,Spring组件自动扫描机制极大地简化了Spring项目的配置,提高了开发效率。通过理解和应用@Component、@Repository、@Service和@Controller等注解,开发者可以让Spring自动地管理应用程序中的各种组件,从而...
在 Spring 2.5 中,引入了组件自动扫描机制,该机制可以在类路径下寻找标注了 @Component、@Service、@Controller、@Repository 注解的类,并将这些类纳入 Spring 容器中管理。 @Component、@Repository、@Service...
Spring自动扫描机制主要涉及以下几个关键概念: 1. **@Component**: 这是最基本的组件注解,可以标记在任何业务逻辑类上。Spring会将这些类视为bean并纳入管理。如果你需要更具体地表示某种类型的组件,可以使用它...
Spring组件扫描的原理基于Java的注解处理和反射机制。它会遍历指定包及其子包下的所有类,寻找带有特定注解(如@Service、@Component、@Repository、@Controller等)的类,并将这些类实例化为Spring容器中的bean。...
@ComponentScan注解是Spring Boot中实现组件自动装配的核心机制。通过合理配置组件扫描,可以提高应用程序的模块化程度、可维护性和启动性能。 本文通过深入分析@ComponentScan注解的工作原理和使用场景,为读者...
改变自动扫描的包【从零开始学Spring Boot】”涉及到的是Spring Boot框架中的组件扫描机制。在Spring Boot中,自动配置是其核心特性之一,它能够根据项目依赖来自动配置相应的Bean。默认情况下,Spring Boot会扫描...
在 Spring 框架中,组件扫描是指通过注解和 XML 配置来自动检测和加载Bean的过程。下面将详细介绍标签的使用方式和原理。 一、标签的作用 标签是 Spring 框架中用于组件扫描的核心标签。该标签可以自动检测和加载...
首先,我们来看`@Component`注解,它是所有Spring组件的基础注解。你可以将其放在任何类上,表示这个类是一个Spring管理的bean。如果需要对bean进行更具体的分类,可以使用它的衍生注解,如`@Service`(用于业务层)...
这个问题通常出现在使用Spring自动扫描机制来查找并加载JPA实体类时,如果这些实体类位于外部的jar包中,Spring可能无法正确识别和处理。 Spring通过`@EntityScan`或`<jpa:entity-manager-factory>`等配置元素来...
Spring框架中自动扫描包的机制是从Spring 2.5版本引入的,这个机制可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进Spring容器中管理。这个机制的作用和在XML...
### Spring自动扫描详解 #### 一、背景介绍 在Spring框架的发展过程中,为了更好地管理和配置Bean,Spring2.5引入了一种更为灵活便捷的方式——自动扫描(Auto Scan)。这一特性使得开发者无需在XML配置文件中显式...
在实际开发中,除了上述解决方法,还可以考虑使用其他策略,例如使用`@Import`注解导入特定的配置类,或者在主配置中显式声明Bean,以确保即使在自动扫描失败的情况下也能正常加载必要的组件。同时,持续关注Spring...
2. **创建Spring配置文件**:定义Bean,包括数据源、SqlSessionFactory、MapperScannerConfigurer(用于自动扫描Mapper接口)等。例如,可以配置`context.xml`来管理Spring的Bean,`servlet-context.xml`来配置...
7. **组件扫描**:Spring的`@Component`、`@Service`、`@Repository`和`@Controller`等注解用于标记组件类,配合`@ComponentScan`可以自动检测并注册这些类到IoC容器,从而实现bean的自动创建和依赖注入。...
除了依赖注入,Spring的自动扫描功能也是其核心特性之一。通过指定包扫描路径,Spring可以自动发现并管理所有标记为组件的类。在XML配置中,我们使用`<context:component-scan>`标签来实现: ```xml ``` 这将扫描...
整体来看,AnnotationAwareAspectJAutoProxyCreator作为Spring AOP的核心组件,通过后置处理器机制和代理模式,实现了AOP的动态代理功能。开发者无需手动编写代理类,Spring的AOP框架自动识别和应用配置中的AOP规则...