<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 报错:元素 "context:component-scan" 的前缀 "context" 未绑定的问题解决的相关资料,需要的朋友可以参考下
NULL 博文链接:https://gaozzsoft.iteye.com/blog/1523898
<context:component-scan base-package="Mode"></context:component-scan> //表示在包mode下面的类将扫描带有@Component,@Controller,@Service,@Repository标识符的类并为之注入对象。 据说是因为XML配置太烦锁而...
<context:component-scan base-package="com.bbs"/> <!--注解支持--> <mvc:annotation-driven/> <!--视图解析--> ...
配置使用注解的Handler和Service等等使用<context:component-scan> 不过springBoot已经省略了这些配置 常用注解:@Controller @RestController(Controller+ResponseBody) @Service @Transactional @Mapper @...
<context:component-scan base-package="org.whvcse"></context:component-scan> <tx:annotation-driven transaction-manager="txManager" /> <!-- <aop:config> <aop:pointcut id="defaultServiceOperation" ...
//applicationContext.xml文件中添加 ... xmlns:xsi=... <context:component-scan base-package="com.haijian" />
<context:component-scan base-package="com.createnets.springmvc.web" /> (2)新建一个Student类 用于测试注解 (3)配置注解 @Controller @RequestMapping("/list") (3)配置视图名称 <!-- 配置视图名称 -...
<context:component-scan base-package="com.jxy.java.service" /> <!-- 导入数据库配置文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置数据库连接池 --> ...
<context:component-scan base-package="com.spring.*"/> <aop:config> <aop:aspect id="aspect" ref="logIntercepter"> <aop:pointcut expression="execution(* com.spring.service..*(..))" id="pointCut"/> ...
<context:component-scan base-package="cn.ly.quartz.service" /> <!-- job --> class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- trigger触发器 --> ...
维生药业小项目 SSH简单学习项目 <?xml version="1.0" encoding="UTF-8"?> ... xmlns:context="http://www.springframework.org/schema/context" ... <context:component-scan base-package="com.sixth" /> </beans>
学习spring组件扫描(Component Scanning)的代码 使用方法:直接把工程导入,直接Run ...<context:component-scan base-package="com.test"></context:component-scan> 2.在需要装配的类的上面全部加上@Component
1.26 context:component-scan扫描使用上的容易忽略的use-default-filters 1.27 idea内嵌jetty运行springmvc项目报ConversionFailedException 1.28 springmvc 3.2 @MatrixVariable注解 1.29 spring3.2 带matrix变量的...
context:component-scan:作用是可以使用@ Component,@ Controller,@ Service等等来省略xml配置文件中的bean元素,简化配置 context:component-scan是上下文:annotation-config的超集,配置了前者则不需要配置...
spring配置文件中唯一需要配置的bean是WeixinConfigurer类,<context:component-scan base-package="com.github.jweixin.jwx.weixin.service" />是可选配置,但里面封装了微信接口服务类,建议一定要配置进spring...
<context:component-scan base-package="com.mvc" /> <mvc:annotation-driven /> <mvc:resources mapping="/resources/**" location="/resources/" /> <mvc:default-servlet-handler /> <aop:config proxy-...
<context:component-scan base-package="com.itheima.service"/> <!--aop面向切面编程,切面就是切入点和通知的组合--> <!--配置事务管理器--> <!--配置事务的通知--> <tx:advice id="advice"> <tx:...
<context:component-scan base-package="com.baobaotao.web"/> <!-- ②:启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> AnnotationMethodHandlerAdapter"/> <!-- ③:对模型视图名称的解析,即在...