1、生成一个标识,自定义如下注解;
@Target({ java.lang.annotation.ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface HessianService {
public abstract String value() default "";
}
2、定义扫描类;
@Component
public class HessianServiceScanner implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
String[] beanNames = beanFactory.getBeanDefinitionNames();
for (String beanName : beanNames) {
String className = beanFactory.getBeanDefinition(beanName)
.getBeanClassName();
Class<?> clazz = null;
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new BeanInitializationException(e.getMessage(), e);
}
HessianService an = clazz.getAnnotation(HessianService.class);
if (null == an)
continue;
String hessianServiceBeanName = "/" + beanName;
// 关键一步 : 发布到HessianServiceExporter服务
BeanDefinitionBuilder builder = BeanDefinitionBuilder
.rootBeanDefinition(HessianServiceExporter.class);
builder.addPropertyReference("service", beanName);
builder.addPropertyValue("serviceInterface",
clazz.getInterfaces()[0].getName());
((BeanDefinitionRegistry) beanFactory).registerBeanDefinition(
hessianServiceBeanName, builder.getBeanDefinition());
}
}
}
3、给服务类添加标识;
@HessianService("/hessian")
public class HessianImpl implements IHessian {
@Override
public String hessianMethod() {
return "Hessian";
}
}
That's OK!