Spring的lookup-method标签

简介: Spring的解析源码 public void parseLookupOverrideSubElements(Element beanEle, MethodOverrides overrides) { NodeList nl = beanEle.

Spring的解析源码

    public void parseLookupOverrideSubElements(Element beanEle, MethodOverrides overrides) {
        NodeList nl = beanEle.getChildNodes();
        for (int i = 0; i < nl.getLength(); i++) {
            Node node = nl.item(i);
            //仅当在Spring默认bean的子元素下且为
       if (isCandidateElement(node) && nodeNameEquals(node, LOOKUP_METHOD_ELEMENT)) { Element ele = (Element) node; //获取要修饰的方法
          String methodName
= ele.getAttribute(NAME_ATTRIBUTE); //获取配置返回的bean
          String beanRef
= ele.getAttribute(BEAN_ELEMENT); LookupOverride override = new LookupOverride(methodName, beanRef); override.setSource(extractSource(ele)); overrides.addOverride(override); } } }

lookup-method的使用

lookup-method实现方式说明:

<bean class="beanClass">
    <lookup-method name="method" bean="non-singleton-bean"/>
</bean>
// 定义一个水果类
public class Fruit {
    public Fruit() {
        System.out.println("I got Fruit");
    }
}
// 苹果
public class Apple extends Fruit {
    public Apple() {
        System.out.println("I got a fresh apple");
    }
}
// 香蕉
public class Bananer extends Fruit {
    public Bananer () {
        System.out.println("I got a  fresh bananer");
    }
}
// 水果盘,可以拿到水果
public abstract class FruitPlate{
    // 抽象方法获取新鲜水果
    protected abstract Fruit getFruit();
}
<!-- 这是2个非单例模式的bean -->
<bean id="apple" class="Apple" scope="prototype"/>
<bean id="bananer" class="Bananer " scope="prototype"/>
<bean id="fruitPlate1" class="FruitPlate">
    <lookup-method name="getFruit" bean="apple"/>
</bean>
<bean id="fruitPlate2" class="FruitPlate">
    <lookup-method name="getFruit" bean="bananer"/>
</bean>


public static void main(String[] args) {
    ApplicationContext app = new ClassPathXmlApplicationContext("classpath:resource/applicationContext.xml");
    FruitPlate fp1= (FruitPlate)app.getBean("fruitPlate1");
    FruitPlate fp2 = (FruitPlate)app.getBean("fruitPlate2");
    fp1.getFruit();
    fp2.getFruit();
}

测试结果:
I got Fruit
I got a fresh apple
I got Fruit
I got a fresh bananer

 

目录
相关文章
|
5月前
|
Java Spring 容器
Spring5源码(42)-@Transactional注解的声明式事物事物标签提取
Spring5源码(42)-@Transactional注解的声明式事物事物标签提取
38 0
|
4月前
|
Java Spring 容器
spring重点标签有哪些
spring重点标签有哪些
|
5月前
|
XML Java 数据格式
Spring5源码(41)-tx:annotation-driven 标签解析过程
Spring5源码(41)-tx:annotation-driven 标签解析过程
379 0
|
5月前
|
Java 数据库 Spring
Spring5源码(40)-基于tx标签和基于@Transactional注解的声明式事物介绍
Spring5源码(40)-基于tx标签和基于@Transactional注解的声明式事物介绍
49 0
|
5月前
|
XML 缓存 Java
Spring5源码(7)-lookup-method和replace-method注入
Spring5源码(7)-lookup-method和replace-method注入
92 0
|
5月前
|
存储 前端开发 Java
Spring Boot中Spring MVC的表单标签库与数据绑定讲解与实战(附源码 超详细必看)
Spring Boot中Spring MVC的表单标签库与数据绑定讲解与实战(附源码 超详细必看)
77 0
|
12月前
|
Java Spring 容器
05Spring - IOC中bean标签和管理对象细节
05Spring - IOC中bean标签和管理对象细节
40 0
|
SQL XML 前端开发
Mybatis 的多种标签使用以及 Spring 框架单元测试(下)
Mybatis 的多种标签使用以及 Spring 框架单元测试(下)
101 0
|
SQL XML Java
Mybatis 的多种标签使用以及 Spring 框架单元测试(上)
Mybatis 的多种标签使用以及 Spring 框架单元测试(上)
113 0
|
XML 前端开发 JavaScript
Spring Boot + vue-element 开发个人博客项目实战教程(二十一、个人介绍、公告管理、标签管理开发)2
Spring Boot + vue-element 开发个人博客项目实战教程(二十一、个人介绍、公告管理、标签管理开发)2
183 0