StrategyPattern
ApplicationContextAwareを使わないStrategyPatternの実装例。
もとねた:http://seasarproject.g.hatena.ne.jp/abhrsh/comment?date=20040822
ストラテジ
public interface Strategy {
public String getMessage();
}
ストラテジの実装クラス
@Component
public class StrategyImpl1 implements Strategy{
public String getMessage() {
return "1";
}
}
ストラテジのファクトリー
@Component
public class StrategyFactory {@Autowired
//Stragetyを実装したすべてのbeanがmapに登録される
private Mapmap = new HashMap (); public Strategy get(String key){
return map.get(key);
}
}
ストラテジを使用するサービスクラス
@Component
public class Service {@Autowired
private StrategyFactory factory;public void execute(String key){
System.out.println(factory.get(key).getMessage());
}public static void main(String args[]) throws Exception{
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("SpringHelloWorld.xml");
Service service = context.getBean(Service.class);
service.execute("strategyImpl1");
service.execute("strategyImpl2");
service.execute("strategyImpl3");
}
}
うーん。ここまでしてApplicationContextAwareを避けるかなぁ…。ちなみにmapに登録する際に@Qualifierで複数の名前を指定はできなかったですね。ストラテジ使うのにすら悩むと実用できないので、ノウハウメモまで。