配Hessian

来源:互联网 发布:横扫千军算法术伤害吗 编辑:程序博客网 时间:2024/05/04 01:25
public class HessianBeanPostProcessor implements BeanPostProcessor, PriorityOrdered, ApplicationContextAware{
private ApplicationContext ctx;
protected Log logger = LogFactory.getLog(getClass());


@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {


if(bean.getClass().isAnnotationPresent(HessianService.class)){
Service svc = bean.getClass().getAnnotation(Service.class);
if(svc.value() == null || svc.value().trim().equals("")){
throw new RuntimeException(bean.getClass().getName() + "被申明为HessianService,则必须指定@Service的值");
}
if(bean.getClass().getInterfaces().length > 1 || bean.getClass().getInterfaces().length == 0){
throw new RuntimeException(bean.getClass().getName() + "被申明为HessianService,则必须指定一个且仅一个Interface");
}

DefaultListableBeanFactory factory = (DefaultListableBeanFactory)ctx.getAutowireCapableBeanFactory();

BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(HessianServiceExporter.class);
builder.addPropertyReference("service", svc.value());
builder.addPropertyValue("serviceInterface", bean.getClass().getInterfaces()[0].getName());
factory.registerBeanDefinition("/" + svc.value(), builder.getBeanDefinition()); 

if(logger.isDebugEnabled()){
logger.debug("HessianBeanPostProcessor装载Hessian服务" + svc.value() + "成功!");
}
}


return bean;
}


@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}


@Override
public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
}


@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
this.ctx = ctx;

}




public class HessianClientPostProcessor implements BeanPostProcessor, PriorityOrdered, ApplicationContextAware{


protected Log logger = LogFactory.getLog(getClass());
private ApplicationContext ctx;
private static HessianProxyFactory factory;     
private static String hessianURL;
private static Map<String, Object> proxies = new HashMap<String, Object>();;

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(factory == null){
factory = new HessianProxyFactory();
}
if(hessianURL == null){
PafaPropertyPlaceholderConfigurer props = (PafaPropertyPlaceholderConfigurer)ctx.getBean("propertyConfigurer");
hessianURL = (String)props.getConfigurer().get("hessian.server.url");
if(! hessianURL.endsWith("/")){
hessianURL = hessianURL + "/";
}
}

Field[] fields = bean.getClass().getDeclaredFields();
for(Field field : fields){
if( field.isAnnotationPresent(HessianClient.class)){
Class<?> clazz = field.getType();
String name = clazz.getSimpleName();
String url = hessianURL + name;

try {
Object proxy = proxies.get(url);
if(proxy == null){
proxy = factory.create(clazz, url);
proxies.put(url, proxy);


if(logger.isDebugEnabled()){
logger.debug("装载Hessian客户端" + url + "成功!");
}
}


field.setAccessible(true);
field.set(bean, proxy);
} catch (Exception e) {
logger.error("装载Hessian客户端" + url + "失败!", e);
}     
}
}


return bean;
}


@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}


@Override
public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
}


@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
this.ctx = ctx;
}

0 0
原创粉丝点击