Lookup方法注入
Lookup方法注射指容器能够重写容器中bean的抽象或具体方法,返回查找容器中其他bean的结果。 被查找的bean在上面描述的场景中通常是一个non-singleton bean (尽管也可以是一个singleton的)。Spring通过使用CGLIB库在客户端的类之上修改二进制码, 从而实现上述的场景要求。
包含方法注入的客户端类,必须按下面的形式的抽象(具体)定义方法:
protected abstract SingleShotHelper createSingleShotHelper();
如果方法不是抽象的,Spring就会直接重写已有的实现。在XmlBeanFactory的情况下,你可以使用bean定义中的lookup-method 属性来指示Spring去注入/重写这个方法,以便从容器返回一个特定的bean。举个例子说明:
<!-- a stateful bean deployed as a protype (non-singleton) -->
<bean id="singleShotHelper singleton="false">
</bean>
<!-- myBean uses singleShotHelper -->
<bean id="myBean" name="code">public class UserDao {public UserDao(){}private String name = "";public UserDao(String name) {this.name = name;}public void create() {System.out.println("create user from - " + name);}}public abstract class UserManager {public UserDao getUserDao() {return new UserDao("UserManager.getUserDao()");}public void createUserDao() {UserDao dao = getUserDao();dao.create();}//方法注入所需要的方法,由spring提供实现public abstract UserDao getSingleUserDao();}
<bean name="userManager" bean="userDao"/></bean><bean name="userDao" class="com.yoyousfot.spring.lookup.UserDao"><constructor-arg><value>lookup method</value></constructor-arg></bean>