`
yunzhongxia
  • 浏览: 638500 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义Spring注解bean的命名策略

阅读更多

       由于项目的需要spring的业务相关的bean不是写在xml文件中,因为项目是一个模块一个模块提交的,提交的时候不想修改xml文件,因此就用到了spring的注解Service。

       例如:

      

@Service("TestService")
public class TestService {

}

 

 

   这等同于:

 

<bean id="TestService" class="TestService"/>

 

   spring会在classpath里面扫描标记有TestService等标签的类,扫描组件的配置如下:

  

  

  <!-- sdp-service主要是注入服务类 -->
  <context:component-scan base-package="org.sdp" />

 

 

 加上以上的配置后,spring会自动的扫描org.sdp文件下的标记有注释的类。

 以上的配置看似很“完美”,其实如果项目稍微大时就会出现问题,大家都知道spring的bean的id必须唯一,如果两个人同事写代码就有可以造成写同样的bean名称。

解决这个问题的一个思路是把bean的名称修改为 类的全路径,例如org.sdp.A 和com.bey.A 。

只要修改spring默认的bean命名策略就可以了。

AnnotationBeanNameGenerator是bean的默认命名策略,他实现了BeanNameGenerator接口。在Service里面,如果不写bean的名称,那么默认的名曾是类名,但是第一个字母是小写的。

例如:

 

com.xyz.FooServiceImpl -> fooServiceImpl

 

观察spring的源代码发现,buildDefaultBeanName方法首先了bean名称小写的作用。

protected String buildDefaultBeanName(BeanDefinition definition) {
		String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());
		return Introspector.decapitalize(shortClassName);
	}

 

因此,可以写一个类继承自AnnotationBeanNameGenerator,重写buildDefaultBeanName方法。

 

public class SdpAnnotationBeanNameGenerator extends AnnotationBeanNameGenerator {

	@Override
	protected String buildDefaultBeanName(BeanDefinition definition) {
		return definition.getBeanClassName();
	}

}

 

在扫描配置中需要添加自己的命名策略类:

 <!-- sdp-service主要是注入服务类 -->
<context:component-scan base-package="org.sdp" name-generator="org.sdp.spring.SdpAnnotationBeanNameGenerator" />

 

通过以上配置,业务相关的bean不用写bean的名称了,ApplicationContext.getBean("类的全路径")就可以得到类的实例了。

如果是spring2.5则就结束了,但是spring3.0为完美提供了getBean(name,requiredType);使用了泛型,因此只要传入一个业务类的Class,getBean就返回此类的实例,而不用在

强制转换类型了。

 

public static <T>T getService(String classFullName) throws ClassNotFoundException,BeansException{
		Class<T> requiredType=(Class<T>) Class.forName(classFullName);
		return SdpContext.getContext().getBean(classFullName,requiredType);
	}

 

 

强制转换类型代码:

  

TestService testService2=(TestService ) SdpContext.getContext().getBean("TestService ");
System.out.println(testService2);

改进后的代码:

 

  

@Service
public class TestService {

}

 

 

TestService testService=SdpContext.getService("org.sdp.context.TestService");
System.out.println(testService);

 

 

 

 

 

  • 大小: 3.3 MB
3
0
分享到:
评论
3 楼 yunzhongxia 2011-08-17  
所有实现类配置到spring有什
gu_sofia 写道
我想问一下讲service的所有实现类配置到spring有什么用吗 ,初学者,希望得到您的回答 谢谢

主要是为flex提交接口调用的
2 楼 gu_sofia 2011-08-17  
我想问一下讲service的所有实现类配置到spring有什么用吗 ,初学者,希望得到您的回答 谢谢
1 楼 gu_sofia 2011-08-17  
非常感谢您的讲解

相关推荐

    Spring中文帮助文档

    2.3.3. 对bean命名pointcut( bean name pointcut element)的支持 2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere ...

    Spring.3.x企业应用开发实战(完整版).part2

    4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命过程方法 4.11 基于Java类的配置 4.11.1 使用Java类提供Bean定义信息 4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 ...

    Spring API

    2.3.3. 对bean命名pointcut( bean name pointcut element)的支持 2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere ...

    Spring 3 Reference中文

    4.3.1 命名bean .. 34 4.3.1.1 在bean 定义外面起别名 35 4.3.2 实例化bean . 36 4.3.2.1 使用构造方法实例化 36 4.3.2.2 使用静态工厂方法来实例化.. 36 4.3.2.3 使用实例工厂方法来实例...

    Spring-Reference_zh_CN(Spring中文参考手册)

    命名bean 3.2.3.2. 实例化bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入依赖 3.3.1.1. Setter注入 3.3.1.2. 构造器注入 3.3.1.3. 一些例子 3.3.2. 构造器参数的解析 3.3.2.1. 构造器参数类型匹配 3.3.2.2. 构造器...

    Spring攻略(第二版 中文高清版).part1

    1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 解决构造程序歧义 17 ...

    Spring攻略(第二版 中文高清版).part2

    1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 解决构造程序歧义 17 ...

    Spring3.x企业应用开发实战(完整版) part1

    4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命过程方法 4.11 基于Java类的配置 4.11.1 使用Java类提供Bean定义信息 4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 ...

    SpringSecurity 3.0.1.RELEASE.CHM

    Spring Bean配置 18.4.6. LDAP属性和自定义UserDetails 19. JSP标签库 19.1. 声明Taglib 19.2. authorize标签 19.3. authentication 标签 19.4. accesscontrollist 标签 20. Java认证和授权服务(JAAS)供应...

    Spring Security-3.0.1中文官方文档(翻译版)

    Spring Bean 配置 19.4.6. LDAP 属性和自定义UserDetails 20. JSP 标签库 20.1. 声明Taglib 20.2. authorize 标签 20.3. authentication 标签 20.4. accesscontrollist 标签 21. Java 认证和授权服务...

    Spring Security 中文教程.pdf

    Spring Bean配置 19.4.6. LDAP属性和自定义UserDetails 20. JSP标签库 20.1. 声明Taglib 20.2. authorize 标签 20.3. authentication 标签 20.4. accesscontrollist 标签 21. Java认证和授权服务...

    spring3.1中文参考文档

    1.3.1 依赖管理和命名规约 ................................................................................................................. 13 1.3.1.1 Spring依赖和基于Spring ..............................

    Java EE常用框架.xmind

    在Shiro配置文件上配置在web.xml对应的bean 配置安全管理器 配置自定义的realm Shiro过滤器 anon:例子/admins/**=anon 没有参数,表示可以匿名使用。 authc:例如/admins/user/**=authc表示需要...

    乐优商城.xmind

    自定义异常、LyException 接口RuntimeException @Getter @NoArgsConstructor @AllArgsConstructor vo 异常结果处理对象、ExceptionResult @Data 构造方法ExceptionResult ly-item-service CategoryQuery ...

    cms后台管理

    Jeecms是基于Spring注解,在自定义标签时对于实体类和dao service等注意注解的问题。 五 自定义标签及使用自己创建的表的实现过程 下面是我自己定义的标签mycontent_list 首先,在数据库里创建了一个jc_...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................

    Javashop开发规范V2.2

    在实合格bean和数据库对照过程中,数据库机制需要识别主键,所以需要我们在主键的对应属性的Geter方法中加上@PrimaryKeyFiled注解,如: private Integer brand_id @PrimaryKeyField public Integer getBrand_id() ...

    Activiti5用户指南(中文版)

    2.7 数据库表的命名说明 ................................................................................................................................................ 7 第三章、配置 ...................

Global site tag (gtag.js) - Google Analytics