Spring查找方法示例

当一个bean依赖于另一个bean时,我们使用setter属性或通过构造函数注入bean。

getter方法将向我们返回已设置的引用,但是假设您每次调用getter方法时都想要一个依赖bean的新实例,那么您可能将不得不采用另一种方法。

在本文中,我们将看到一个使用lookup-method属性的方法注入的示例。

依存关系

添加以下依赖项:

  1. spring-core
  2. spring-context
  3. spring-beans

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.javarticles.spring</groupId>
	<artifactId>springLookupMethodExample</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>
	</dependencies>

	<properties>
		<spring.version>3.2.3.RELEASE</spring.version>
	</properties>

</project>

方法注入方法

每次调用getter方法时如何获取新实例? 一种方法是将依赖bean定义为原型,然后实现getter方法以向我们返回一个调用applicationContext.getBean(beanId)的新实例。
这种方法的问题在于,现在您依赖applicationContext

第二种方法是让容器管理方法注入。 getter方法可以是抽象的,让spring动态子类化包含getter方法的类,并实现它以返回配置的bean。 这样,我们可以使用相同的基类,并以不同的方式部署它,从而无需更改代码即可返回不同的bean。

使用查找方法的方法注入

所讨论的方法不必是getter方法,而应该是返回某些内容的方法。 在我们的示例中, PizzaShop是一个抽象类,它具有两个方法makePizzamakeVeggiesPizza() ,这makeVeggiesPizza()我们返回素食Pizza

披萨店:

package com.javarticles.spring;

public abstract class PizzaShop {
   public abstract Pizza makePizza();
   public abstract Pizza makeVeggiePizza();
}

如您所见,我们的示例非常简单。 Pizza有一个静态count变量,当我们创建一个新实例时,该变量会增加。 它具有一个布尔成员isVeg ,如果比萨饼是素食主义者,则为true。

比萨:

package com.javarticles.spring;

import java.util.concurrent.atomic.AtomicLong;

public class Pizza {
    private static AtomicLong count = new AtomicLong(0); 
    private boolean isVeg;
    
    public Pizza() {
        count.incrementAndGet();
    }
    public String toString() {
        return "A new " + (isVeg ? "veggie" : "") + "Pizza, count(" + count.get() + ")";
    }
    public void setIsVeg(boolean veg) {
        isVeg = veg;
    }
}

我们将makePizzamakeVeggiePizza配置为lookup-method 。 我们配置了一个普通的比萨饼和一个素食比萨饼豆。 每个抽象方法将具有一个<lookup-method元素。 name属性将是方法名称,并且bean将指向配置的bean。 在这里,我们已经将pizzaveggiePizza配置为原型豆。

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="pizzaShop" class="com.javarticles.spring.PizzaShop">
		<lookup-method name="makePizza" bean="pizza"/>
		<lookup-method name="makeVeggiePizza" bean="veggiePizza"/>
	</bean>
	
	<bean id="pizza" class="com.javarticles.spring.Pizza" scope="prototype"/>
	
	<bean id="veggiePizza" class="com.javarticles.spring.Pizza" scope="prototype">
		<property name="isVeg" value="true"/>
	</bean>

</beans>

让我们下雪测试。 我们将首先加载上下文并获取PizzaShop bean。 接下来,我们将调用pizzaShop.makePizza()pizzaShop.makeVeggiePizza()

SpringLookupMethodExample:

package com.javarticles.spring;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringLookupMethodExample {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        try {
            PizzaShop pizzaShop = (PizzaShop) context.getBean("pizzaShop");
            Pizza firstPizza = pizzaShop.makePizza();
            System.out.println("First Pizza: " + firstPizza);

            Pizza secondPizza = pizzaShop.makePizza();
            System.out.println("Second Pizza: " + secondPizza);
            
            Pizza veggiePizza = pizzaShop.makeVeggiePizza();
            System.out.println("Veggie Pizza: " + veggiePizza);
        } finally {
            context.close();
        }
    }
}

每次调用该方法时,它都会创建一个新的Pizza bean,我们可以看到计数在增加。

输出:

First Pizza: A new Pizza, count(1)
Second Pizza: A new Pizza, count(2)
Veggie Pizza: A new veggiePizza, count(3)

下载源代码

这是有关使用lookup-method属性的弹簧方法注入的示例。 您可以在此处下载源代码: springLookupMethodExample.zip

翻译自: https://www.javacodegeeks.com/2015/05/spring-lookup-method-example.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值