LookUp实现非单例注入实例
承接上文(https://blog.csdn.net/qq_36328413/article/details/100526288)的AsyncCommandManager
首先创建一个lookup包然后创建一个CommandManager抽象类
package lookup;
import pojo.Command;
public abstract class CommandManager {
//模拟业务处理的方法
public Object process(){
Command command=createCommand();
return command.execute();
}
protected abstract Command createCommand();
}
配置文件:beans-lookup.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 通过scope="prototype"界定该bean是多例的 -->
<bean id="asyncCommand" class="pojo.AsyncCommand"
scope="prototype"></bean>
<bean id="commandManager" class="lookup.CommandManager">
<lookup-method name="createCommand" bean="asyncCommand"/>
</bean>
</beans>
标签中的name属性就是commandManager Bean的获取Command实例(AsyncCommand)的方法,也就createCommand方法,bean属性是要返回哪种类型的Command的,这里是AsyncCommand。Spring自动帮我们实现了createCommand
创建测试类:testlookup
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import lookup.CommandManager;
public class testlookup {
public static void main(String args[]){
ApplicationContext context1 = new ClassPathXmlApplicationContext("beans-lookup.xml");
CommandManager manager=(CommandManager)context1.getBean("commandManager",CommandManager.class);
System.out.println("第一执行process,Command的地址是:" + manager.process());
System.out.println("第二执行process,Command的地址是:" + manager.process());
}
}
结果如下:
Lookup易于扩展,更符合Ioc规则,所以尽量采用这种方式实现非单例注入。