利用spring注解定义服务信息

来源:互联网 发布:python exec函数 编辑:程序博客网 时间:2024/05/23 01:21

项目中所有的服务都是通过spring的bean进行加载,第一个版本使用xml自定义bean,并以bean的id为服务名,随着项目服务的变多,导致配置的xml文件越来越多,最后决定使用注释进行服务的定义,定义服务时还需要定义一些服务的基本信息,所以没有直接使用spring 的bean注解。


1)自定注解AppServer。代码如下,服务定义包括服务名,服务类型,是否需要控制事务(服务需要在同一个事务里处理完毕)

@Retention(RetentionPolicy.RUNTIME)@Componentpublic @interface AppServer {/** * 设置服务的名字 * @return */String serviceName();/** * 服务类型:原子服务,组合服务,批次服务 * @return */ServerType type() default ServerType.ATOMIC;/** * 事务 * @return */boolean transaction() default false;}

@Component 参考spring 的注解说明


2)spring是加载bean时。重写spring加载的bean的ID的名称

public class BeanNameGenerator extends AnnotationBeanNameGenerator{protected String determineBeanNameFromAnnotation(AnnotatedBeanDefinition annotatedDef) {String beanName = super.determineBeanNameFromAnnotation(annotatedDef);//没有查找到beanName时if (beanName == null) {AnnotationMetadata amd = annotatedDef.getMetadata();Set<String> types = amd.getAnnotationTypes();for (String type : types) {Map<String, Object> attributes = amd.getAnnotationAttributes(type);if (type.equals(AppServer.class.getName())) {String value = (String) attributes.get("serviceName");if (StringUtils.hasLength(value)) {if (beanName != null && !value.equals(beanName)) {throw new IllegalStateException("Stereotype annotations suggest inconsistent " +"component names: '" + beanName + "' versus '" + value + "'");}beanName = value;}}}}return beanName;}}
定义spring扫注解的xml配置
<context:component-scan base-package="com.dld" name-generator="com.dld.platform.service.annotation.extend.BeanNameGenerator"/>

此时spring加载的bean的ID就是自定义的服务名.

0 0
原创粉丝点击