项目中所有的服务都是通过spring的bean进行加载,第一个版本使用xml自定义bean,并以bean的id为服务名,随着项目服务的变多,导致配置的xml文件越来越多,最后决定使用注释进行服务的定义,定义服务时还需要定义一些服务的基本信息,所以没有直接使用spring 的bean注解。
1)自定注解AppServer。代码如下,服务定义包括服务名,服务类型,是否需要控制事务(服务需要在同一个事务里处理完毕)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @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就是自定义的服务名.