我们如何告诉 Spring ServiceLocatorFactoryBean 提供服务的默认实例?我有这样的场景。
package strategy;
import model.Document;
public interface IPrintStrategy {
public void print(Document document);
}
和 2 种策略类
package strategy;
import model.Document;
import org.springframework.stereotype.Component;
@Component("A4Landscape")
public class PrintA4LandscapeStrategy implements IPrintStrategy{
@Override
public void print(Document document) {
System.out.println("Doing stuff to print an A4 landscape document");
}
}
package strategy;
import model.Document;
import org.springframework.stereotype.Component;
@Component("A5Landscape")
public class PrintA5LandscapeStrategy implements IPrintStrategy{
@Override
public void print(Document document) {
System.out.println("Doing stuff to print an A5 landscape document");
}
}
策略工厂接口如下
package strategy;
public interface PrintStrategyFactory {
IPrintStrategy getStrategy(String strategyName);
}
和Spring配置如下
<beans xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:component-scan base-package="strategy">
<bean class="org.springframework.beans.factory.config.ServiceLocatorFactoryBean" id="printStrategyFactory">
<property name="serviceLocatorInterface" value="strategy.PrintStrategyFactory">
</property></bean>
<alias alias="A4P" name="A4Portrait">
<alias alias="A4L" name="A4Landscape">
</alias></alias></context:component-scan></beans>
和我的测试班
import model.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;
import strategy.PrintStrategyFactory;
@ContextConfiguration(locations = {"classpath:/spring-config.xml"})
public class SpringFactoryPatternTest extends AbstractTestNGSpringContextTests{
@Autowired
private PrintStrategyFactory printStrategyFactory;
@Test
public void printStrategyFactoryTest(){
Document doc = new Document();
printStrategyFactory.getStrategy("A4L").print(doc);
printStrategyFactory.getStrategy("A5L").print(doc);
printStrategyFactory.getStrategy("Something").print(doc);
}
}
当我像上次通话一样向工厂传递一些文本时会发生什么
printStrategyFactory.getStrategy("Something").print(doc);
有没有办法配置 ServiceLocatorFactoryBean 来发回我的打印策略的默认实例,比如下面的类的实例。
package strategy;
import model.Document;
import org.springframework.stereotype.Component;
@Component("invalid")
public class InvalidLandscapeStrategy implements IPrintStrategy{
@Override
public void print(Document document) {
System.out.println("INVALID DOCUMENT STRATEGY");
}
}