Lookup方法注入
package research.spring.beanfactory.ch2; public class UserDao { private String name = "" ; public UserDao(String name){ this .name = name; } public void create(){ System. out .println( " create user from - " + name); } }
package research.spring.beanfactory.ch2; public class UserManager { public UserDao getUserDao() { return new UserDao( " UserManager.getUserDao() " ); } public void createUser() { UserDao dao = getUserDao(); // 通过getUserDao获得userDao dao.create(); } }
context.xmlpackage research.spring.beanfactory.ch2; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class LookupMethodTest { public static void main(String[] args) { XmlBeanFactory factory = new XmlBeanFactory( new ClassPathResource( " research/spring/beanfactory/ch2/context.xml " )); UserManager manager = (UserManager) factory.getBean( " userManager " ); manager.createUser(); // create a User } }
xml version="1.0" encoding="UTF-8"?> DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean name="userManager" class="research.spring.beanfactory.ch2.UserManager"> bean> <bean name="userDao class="research.spring.beanfactory.ch2.UserDao" > bean> beans>
运行LookupMethodTest你会看到屏幕输入” create user from - UserManager.getUserDao()”。
在这个场景中我们就可以利用Spring提供的“Lookup方法”来替换原有的getUserDao方法,实现自动获取userDao的功能。修改context.xml:
xml version="1.0" encoding="UTF-8"?> DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean name="userManager" class="research.spring.beanfactory.ch2.UserManager"> <lookup-method name="getUserDao" bean="userDao" /> bean> <bean name="userDao" class="research.spring.beanfactory.ch2.UserDao" > <constructor-arg> <value>lookup methodvalue> constructor-arg> bean> <bean name="userDaoFactory" class="research.spring.beanfactory.ch2.UserDaoFactory"> bean> beans>
再次运行LookupMethodTest你会看到不同的输出结果“create user from - lookup method”。字符串“lookup method”是通过构造函数注入给userDao的。原来的userManager.java并没有作任何修改,仍然是通过UserDao dao = getUserDao();来获得userDao的。这说明Spring已经替换了原有的getUserDao方法的实现,当执行getUserDao时Spring会在容器中寻找指定的Bean,并返回这个Bean。
Lookup方法的工作机制
package research.spring.beanfactory.ch2; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class LookupMethodTest { public static void main(String[] args) { XmlBeanFactory factory = new XmlBeanFactory( new ClassPathResource(
" research/spring/beanfactory/ch2/context.xml " )); UserManager manager = (UserManager) factory.getBean( " userManager " ); System. out .println(manager.toString()); // 打印userManager的信息 manager.createUser(); // create a User } }
< bean name ="userManager" class ="research.spring.beanfactory.ch2.UserManager" > < lookup-method name ="getUserDao" bean ="userDao" /> < lookup-method name ="getOtherDao" bean ="otherDao" /> bean>
修改UserManager:
package research.spring.beanfactory.ch2; public class UserManager { private UserDao dao; public void setDao(UserDao dao) { this .dao = dao; } public UserDao getUserDao(String daoName) { return new UserDao( " UserManager.getUserDao() " ); } public void createUser() { UserDao dao = getUserDao(“userDao”); // 通过getUserDao获得userDao dao.create(); } }
- 方法不能是private的,但可以是protected的。
- 方法不能是静态的。
在抽象类和接口上应用Lookup方法
package research.spring.beanfactory.ch2; public abstract class Factory { public abstract UserDao getProduct(); }
package research.spring.beanfactory.ch2; public class UserDaoFactory extends Factory{ public UserDao getProduct(){ return new UserDao( " UserDaoFactory " ); } }
new UserDaoFactory().getProduce();
package research.spring.beanfactory.ch2; public abstract class Factory { public abstract Object getProduct(); }
xml version="1.0" encoding="UTF-8"?> DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean name="userManager" class="research.spring.beanfactory.ch2.UserManager"> <lookup-method name="getUserDao" bean="userDao" /> bean> <bean name="userDao" class="research.spring.beanfactory.ch2.UserDao" > <constructor-arg> <value>lookup methodvalue> constructor-arg> bean> <bean name="userDaoFactory" class="research.spring.beanfactory.ch2.Factory" singleton="false"> <lookup-method name="getProduct" bean="userDao" /> bean> beans>
package research.spring.beanfactory.ch2; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class LookupMethodTest { public static void main(String[] args) { XmlBeanFactory factory = new XmlBeanFactory( new ClassPathResource(
" research/spring/beanfactory/ch2/context.xml " )); // 获得抽象工厂 Factory abstractFactory = (Factory) factory.getBean( " userDaoFactory " ); UserDao userDao = (UserDao) abstractFactory.getProduct(); System. out .println(userDao.toString()); userDao.create(); } }
< bean name ="userDaoFactory" class ="research.spring.beanfactory.ch2.Factory" singleton ="false" > < lookup-method name ="getProduct" bean ="userDao" /> bean> <bean name="documentDaoFactory" class="research.spring.beanfactory.ch2.Factory" singleton="false"> <lookup-method name="getProduct" bean="documentDao" /> bean>