spring aop示例
当一个bean依赖于另一个bean时,我们使用setter属性或通过构造函数注入bean。
getter方法将向我们返回已设置的引用,但是假设您每次调用getter方法时都想要一个依赖bean的新实例,那么您可能将不得不采用另一种方法。
在本文中,我们将看到一个使用lookup-method
属性的方法注入的示例。
依存关系
添加以下依赖项:
-
spring-core
-
spring-context
-
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
是一个抽象类,它具有两个方法makePizza
和makeVeggiesPizza()
,这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;}
}
我们将makePizza
和makeVeggiePizza
配置为lookup-method
。 我们配置了一个普通的比萨饼和一个素食比萨饼豆。 每个抽象方法将具有一个<lookup-method元素。 name
属性将是方法名称,并且bean将指向配置的bean。 在这里,我们将pizza
和veggiePizza
都配置为原型bean。
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
spring aop示例