lookup-method 和 @Lookup

lookup-method

lookup-method为抽象方法指定返回类型,会为标记了lookup-method的方法生产代理类来处理返回类,所以就算是个抽象类,依然可以使用,毕竟真正调用的是代理类。

定义bean

public class User {
    public void showMe(){
        System.out.println("i am user");
    }
}

// 子类1
public class Teacher extends User {

    @Override
    public void showMe() {
        System.out.println("i am teacher");
    }
}

// 子类2
public class Student extends User {

    @Override
    public void showMe() {
        System.out.println("i am student");
    }
}

// 使用环境
public abstract class TestLookup {

    public abstract User getBean();

    public void show(){
        this.getBean().showMe();
    }
}

配置xml

// xml配置
  <bean id="testLookup" class="org.dhcao.relax.spring.lookup.TestLookup">
    <lookup-method name="getBean" bean="student"></lookup-method>
  </bean>

  <bean id="teacher" class="org.dhcao.relax.spring.lookup.Teacher"></bean>
  <bean id="student" class="org.dhcao.relax.spring.lookup.Student"></bean>

使用结果

// 效果
public class Main {
    public static ApplicationContext context = null;
    public static void main(String[] args) {
        context = new ClassPathXmlApplicationContext("spring-context.xml");
        lookup();
    }

    public static void lookup(){
        TestLookup bean =(TestLookup) context.getBean("testLookup");
        bean.show();
    }
}

七月 25, 2019 12:00:47 下午
i am student

@Lookup

是lookup-method的注解版本,在方法或者抽象方法上使用@Lookup注解,将会根据该方法的返回值,自动在BeanFactory中调用getBean()来注入该Bean。

public abstract class TestLookup {

    @Lookup
    public abstract Teacher getBean();

    public void show(){
        this.getBean().showMe();
    }
}
原文地址:https://www.cnblogs.com/dhcao/p/11244118.html