Spring查找方法注入方法注入

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’}
这时有两种方法可以实现这种功能。

  1. 目标类实现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);
    }
}
  1. 使用方法注入功能,可以使用注解或者xml配置的方式。
    1. 使用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>
      
    2. 使用注解方式
      这里需要注意到的是,由于UserManage是个抽象类,所以UserManage类只能通过注解扫描的方式进入到容器中,而不能通过java config的方式。
      	@Component
      	public abstract class UserManage {
      		@Lookup( "user")
      		public abstract User getUser();
      	}
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值