BuffaloとSpringもアンノテーションをプレイできます.


1.それはもうすぐ私から遠ざかります.
私のajaxクラスのライブラリとしてのbuffaloの歴史もあります.ほとんどSpringと同時に接触し始めました.
公式の方式でバッファローとSpringの統合は簡単です.
    SpringにBuffaloServiceConfigure beanを配置して、springを管理するサービスをその中で声明すればいいです.BuffaloはServletConteetを通じてSpringのWebApplication Contextを得ることができます.さらに必要なサービスを得ることができます.
<bean name="buffaloConfigBean" 
                class="net.buffalo.service.BuffaloServiceConfigurer"> 
                <property name="services"> 
                        <map> 
                                <entry key="springSimpleService"> 
                                        <ref bean="systemService" /> 
                                </entry> 
                                <entry key="springSimpleService2"> 
                                        <ref bean="systemService2" /> 
                                </entry> 
                        </map> 
                </property> 
 </bean> 

 
     簡単なようですが、馬鹿みたいな感じがしますか?Springに配置されているbeanをもう一度引用するだけです.
共同開発に直面すると、すべてのグローバルプロファイルと同じように、BuffaloServiceConfigure beanの下には数十個以上のservice refが含まれています.大勢の人がこの配置ファイルを取り囲んで回転します.CVSの衝突は日常茶飯事になり、悩みます.もちろん、私達の長年の開発経験では、このような低級なエラーは発生しません.早くプロジェクトの設計段階でモジュールによって複数の配置ファイルを分けています.一人で使う必要がありません.他の人と一緒に配置しなくてもいいです.簡単に衝突問題に直面して、持ってきた局面はどのカバンにも一つのブffalo.xmlが詰まっています.一つのプロジェクトには配置ファイルがあちこちにあります.
     もちろん、Spring自体も2.5年前にXML配置が煩雑で非難されました.Guice才能が突起しました.その時SpringはBuffaloの配置より多くなりました.だからBuffaloの問題も問題ではありませんでした.でも、ある日、私はついにSpring 2.5に正式にアップグレードします.
     世界は静かになりましたannotationを使って、どのように多くの配置ファイルが消えていくのかを見て、簡潔なBean/MVC配置を見て、ほほほ、本当に気持ちがいいです.
     えっと、待ってください.どうしてXMLがたくさんありますか?えっとバッファローですか
     Buffaloはとげのように、ぼーっとしています.XMLの中にあります.
 
2.それでバッファローもAnnotation化し始めました.
 
ところでSpringの拡張力はまだganggangのです.一日で成果が出ます.
先に注釈を書きます
package cn.tohot.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * buffalo    ,         buffalo  .
 * @author tedeyang
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Buffalo {
	/**
	 * @return          .
	 */ 
	String value();
}
 
次にSpringの拡張を書きます.
 
/**
 * 
 */
package cn.tohot.common.annotation;

import java.util.HashMap;

import net.buffalo.service.BuffaloServiceConfigurer;

import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
 *     FactoryBean      buffalo 2.0      ,   annotation    .
 * @author tedeyang
 *
 */
@SuppressWarnings("unchecked")
public class BuffaloAnnotationServiceFactoryBean implements FactoryBean, InitializingBean, DisposableBean, BeanPostProcessor {
	private static final Logger log = Logger.getLogger(BuffaloAnnotationServiceFactoryBean.class);

	private BuffaloServiceConfigurer buffaloConfigurer = null;

	public BuffaloAnnotationServiceFactoryBean() {
		buffaloConfigurer = new BuffaloServiceConfigurer();
		buffaloConfigurer.setServices(new HashMap());
	}

	private void addBuffaloBean(String buffaloServiceName,Object bean) {
		buffaloConfigurer.getServices().put(buffaloServiceName, bean);
		log.info("Add a buffalo service :"+buffaloServiceName);
	}

	public Object getObject() throws Exception {
		return this.buffaloConfigurer;
	}

	public Class getObjectType() {
		return BuffaloServiceConfigurer.class;
	}

	public boolean isSingleton() {
		return true;
	}

	public void afterPropertiesSet() throws Exception {
 	}

	public void destroy() throws Exception {
		if (buffaloConfigurer != null)
			buffaloConfigurer.setServices(null);
		buffaloConfigurer = null;
	}
 
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		log.debug("find a bean:"+beanName);
		if (bean.getClass().isAnnotationPresent(Buffalo.class)) {
			Buffalo buffalo = bean.getClass().getAnnotation(Buffalo.class);
			addBuffaloBean(buffalo.value(), bean); 
		}
		return bean;
	}

}
 
 主な考えはFactoryBenで元のBuffaloServiceConfigrerを交替して、BenPostProcessorのフックを掛けて、annotationを検査して、buffaloサービスが元のBuffaloServiceConfigurに追加されることを発見します.
 
3.今日はこうやってバッファローを配置します.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

	<!-- Spring Annotation  ,        -->
	<context:component-scan base-package="cn.tohot.demo"/> 
  	<bean id="buffalo"	class="cn.tohot.common.annotation.BuffaloAnnotationServiceFactoryBean" /> 
</beans>
 
 サービスのBuffalo bean類:
package cn.tohot.demo;

import org.springframework.stereotype.Service;

import cn.tohot.common.annotation.Buffalo;

@Service     //  Spring bean,
@Buffalo("testbean") //      "testbean" Buffalo service
public class BuffaloBeanTestService {
	public String run() {
		System.out.println("run");
		return "run";
	}
}
 簡潔ですね