LookUp方法查找注入是Spring容器覆盖Bean指定方法返回容器内另一个Bean的功能。这个功能在一个Scope为singleton的Bean需要返回Scope为protocol的Bean时很实用。首先我们看一下下面的这个类。
public class User {
private static Integer id = 1;
private String userName;
private String password;
public User() {
id++;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName + "-" + id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password + "-" + id;
}
}
public abstract class UserManage {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
采用下面的xml作为元数据
<bean id="user" class="top.lakakala.User" scope="prototype" p:userName="kexin" p:password="123"/>
<bean id="userManage" class="top.lakakala.UserManage" p:user="user"/>
ApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
UserManage userManage = context.getBean("userManage", UserManage.class);
System.out.println(userManage.getUser());
System.out.println(userManage.getUser());
执行上面的代码后的结果为
User{userName=‘kexin-1’, password=‘123-1’}
User{userName=‘kexin-1’, password=‘123-1’}
但是按照我们的预期,返回值应该为
User{userName=‘kexin-1’, password=‘123-1’}
User{userName=‘kexin-2’, password=‘123-2’}
这时有两种方法可以实现这种功能。
- 目标类实现ApplicationContextAware,每次获取user时使用applicationContext对象获取。
public class UserManage implements ApplicationContextAware {
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
private User user;
public User getUser() {
return context.getBean("user", User.class);
}
}
- 使用方法注入功能,可以使用注解或者xml配置的方式。
- 使用xml配置
public abstract class UserManage { public abstract User getUser(); }
<bean id="user" class="top.lakakala.User" scope="prototype" p:userName="kexin" p:password="123"/> <bean class="top.lakakala.UserManage" id="userManage"> <lookup-method name="getUser" bean="user"/> </bean>
- 使用注解方式
这里需要注意到的是,由于UserManage是个抽象类,所以UserManage类只能通过注解扫描的方式进入到容器中,而不能通过java config的方式。@Component public abstract class UserManage { @Lookup( "user") public abstract User getUser(); }
- 使用xml配置