`
喧嚣求静
  • 浏览: 572895 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

context:component-scan

阅读更多
<context:component-scan/> 配置项不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。

<context:component-scan/> 的 base-package 属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。
相关阅读:spring组件扫描<context:component-scan/>使用详解
name-generator:指定产生规则
当一个 Bean 被自动检测到时,会根据那个扫描器的 BeanNameGenerator 策略生成它的 bean 名称。默认情况下,对于包含 name 属性的 @Component、@Repository、 @Service 和 @Controller,会把 name 取值作为 Bean 的名字。如果这个注解不包含 name 值或是其他被自定义过滤器发现的组件,默认 Bean 名称会是小写开头的非限定类名。如果你不想使用默认 bean 命名策略,可以提供一个自定义的命名策略。

If you do not want to rely on the default bean-naming strategy, you can provide a custom
bean-naming strategy. First, implement the BeanNameGenerator interface, and be sure to
include a default no-arg constructor. Then, provide the fully-qualified class name when
configuring the scanner:
<beans>
<context:component-scan base-package="org.example"
name-generator="org.example.MyNameGenerator" />
</beans>
实行示例
package pub.spring;

import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
import org.springframework.core.type.AnnotationMetadata;


public class BeanNameGenerator extends AnnotationBeanNameGenerator {

	private String BASE_PACKAGE_NAME;

	private String convertJavaNameToUrlName(String name) {
		StringBuilder sb = new StringBuilder();
		for (int n = 0; n < name.length(); n++) {
			char c = name.charAt(n);
			if (Character.isUpperCase(c)) {
				if (n > 0) {
					sb.append('_');
				}
				c = Character.toLowerCase(c);
			}
			sb.append(c);
		}
		return sb.toString();
	}

	@Override
	public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
		String name;
		String className = definition.getBeanClassName();

		final String CONTROLLER_POSTFIX = "Action";
		if (className.endsWith(CONTROLLER_POSTFIX)) {

			String suffix = null;

			AnnotatedBeanDefinition annotatedDef = (AnnotatedBeanDefinition) definition;
			AnnotationMetadata amd = annotatedDef.getMetadata();

			final String controllerAnnotation = "org.springframework.stereotype.Controller";
			String controllerName = (String) amd.getAnnotationAttributes(controllerAnnotation).get("value");
			if (controllerName != null && controllerName.length() > 0) {
				// explicit specified postfix
				if (controllerName.charAt(0) == '.') {
					suffix = controllerName;
				}
				// for backword compatible
				// explicit specified struts uri
				else if (controllerName.indexOf('.') == -1) {
					return controllerName + ".do";
				}
				// explicit specified uri
				else {
					return controllerName;
				}
			}

			if (BASE_PACKAGE_NAME == null) {
				BASE_PACKAGE_NAME = className.substring(0,
					className.indexOf(".web.") + ".web".length());
			}

			int pos = className.lastIndexOf('.');
			String namePart = className.substring(pos + 1,
				className.length() - CONTROLLER_POSTFIX.length());
			namePart = convertJavaNameToUrlName(namePart);

			String packagePart = className.substring(BASE_PACKAGE_NAME.length(), pos);
			if (packagePart.indexOf('_') != -1) {
				packagePart = packagePart.replace("_.", ".");
			}
			assert packagePart.endsWith(".action");
			packagePart = packagePart.substring(0, packagePart.length() - ".action".length());

			name = packagePart + '.' + namePart;

			if (name.startsWith(".app.")) {
				name = name.substring(".app".length());
			}

			// postfix specified
			if (suffix != null) {
				// do nothing
			}
			// common .do actions
			else if (name.endsWith(".operate") ||
				name.endsWith(".functions")) {
				suffix = ".do";
			}
			//fall back to html
			else {
				suffix = ".html";
			}
			name = name.replace('.', '/') + suffix;
		}
		else {
			name = super.generateBeanName(definition, registry);
		}
		return name;
	}

}


分享到:
评论

相关推荐

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

    在Spring框架中,`&lt;context:component-scan/&gt;`元素是核心组件扫描的基石,它允许我们自动检测和注册beans,极大地简化了配置工作。这篇博客将深入探讨这个功能强大的特性,以及如何在实际开发中有效利用它。 一、...

    Spring 报错:元素 "context:component-scan" 的前缀 "context" 未绑定的问题解决

    然而,在配置过程中,如果遇到“元素 'context:component-scan' 的前缀 'context' 未绑定”的错误,这意味着Spring无法识别和解析这个元素,因为缺少了对应的命名空间定义。 这个问题的根源在于XML配置文件中没有...

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

    Spring 组件扫描&lt;context:component-scan/&gt;使用详解 在 Spring 框架中,组件扫描是指通过注解和 XML 配置来自动检测和加载Bean的过程。下面将详细介绍&lt;context:component-scan/&gt;标签的使用方式和原理。 一、...

    Spring注解详解

    &lt;/context:component-scan&gt; ``` 使用注解过滤某些类: ```xml &lt;context:component-scan base-package="com.example"&gt; &lt;context:include-filter type="annotation" expression="org.springframework.stereotype....

    spring3零配置注解实现Bean定义(包括JSR-250、JSR-330)

    通过使用`&lt;context:component-scan&gt;`标签配合特定的注解(如`@Component`、`@Service`等),可以完全避免XML配置的使用,从而让开发者能够更加专注于业务逻辑的实现。同时,Spring对JSR-250和JSR-330等标准的支持也...

    详解 Spring 3.0 基于 Annotation 的依赖注入实现

    - 通过 `&lt;context:component-scan&gt;` 标签,可以在 XML 配置文件中指定基础包,让 Spring 自动扫描这些包及其子包下的类,寻找带有特定注解的类,将它们注册为 Bean。例如: ```xml &lt;context:component-scan ...

    使用Spring2.5的Autowired实现注释型的IOC

    `&lt;context:annotation-config/&gt;` 用于启用注释型的 IOC,而 `&lt;context:component-scan base-package="testspring.main"/&gt;` 用于扫描指定包下的所有组件。 最后,我们可以编写主类测试: ```java @Service public ...

    集成springmvc spring hibernate的配置

    &lt;/context:component-scan&gt; ``` 2. **数据库连接配置**:我们需要从`jdbc.properties`文件中读取数据库连接信息。使用`context:property-placeholder`标签将属性文件加载到Spring上下文中。然后,配置数据源`...

    15、spring 配置以及使用 1

    在这个主题中,我们将深入探讨`&lt;context:annotation-config&gt;`与`&lt;context:component-scan&gt;`的区别,事务管理器的配置,以及Spring开发环境的选择和数据源的配置。 1. `&lt;context:annotation-config&gt;`和`&lt;context:...

    spring mvc

    在Spring中,`&lt;context:component-scan/&gt;`标签用于自动发现和加载带有特定注解的类,如`@Controller`, `@Service`, `@Repository`和`@Component`。这一过程称为组件扫描,它简化了Bean的配置,使开发者能够以更简洁...

    Spring注释 注入方式源码示例,Annotation

    &lt;context:component-scan base-package="Mode"&gt;&lt;/context:component-scan&gt; //表示在包mode下面的类将扫描带有@Component,@Controller,@Service,@Repository标识符的类并为之注入对象。 据说是因为XML配置太烦锁而...

    学习ssm整理的xml配置笔记

    在本节中,我们将探讨 SSM 框架中 XML 配置的使用,特别是事务配置和 `&lt;context:component-scan&gt;` 的使用。 一、事务配置 在 SSM 框架中,事务配置是非常重要的,用于确保数据的一致性和安全性。在 XML 配置文件中...

    spring annotation 入门

    - **组件扫描**:使用`&lt;context:component-scan&gt;`标签来指定要扫描的包路径,从而自动发现和注册带有`@Component`、`@Service`、`@Repository`、`@Controller`等注解的类。 - **示例**: ```xml &lt;context:...

    spring 的Annotation方式

    本文旨在深入探讨Spring框架中基于注解的依赖注入机制,特别是`@Repository`、`@Service`、`@Controller`和`@Component`等核心注解的使用方法,以及如何利用`&lt;context:component-scan&gt;`自动扫描功能,实现类级别的...

    SpringMVC+Hibernate实例

    &lt;context:component-scan base-package="com.bbs"/&gt; &lt;!--注解支持--&gt; &lt;mvc:annotation-driven/&gt; &lt;!--视图解析--&gt; ...

    spring3.0依赖注入详解

    本文将深入探讨Spring 3.0中依赖注入的新特性,特别是如何使用`@Repository`、`@Service`、`@Controller`和`@Component`注解来标记类为Bean,以及如何利用`&lt;context:component-scan/&gt;`元素自动扫描和注册这些Bean。...

    jeecg3.6.5/3.6.6(非maven)MyEclipse配置方法

    &lt;/context:component-scan&gt; ``` - 复制这段配置,并粘贴在其下方,修改`base-package`的值为自己的表所在包名,例如`com.test.de.*`或`com.test.*`。 - 同样地,在`/jeecg-3.6.5/src/spring-mvc.xml`文件中,找到...

    springMVC技术概述

    配置使用注解的Handler和Service等等使用&lt;context:component-scan&gt; 不过springBoot已经省略了这些配置 常用注解:@Controller @RestController(Controller+ResponseBody) @Service @Transactional @Mapper @...

Global site tag (gtag.js) - Google Analytics