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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql判断数字的函数_Mysql必读MySql判断汉字、日期、数字的具体函数

《Mysql必读MySql判断汉字、日期、数字的具体函数》要点&#xff1a;本文介绍了Mysql必读MySql判断汉字、日期、数字的具体函数&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。MYSQL学习几个平常用的mysql函数,MySql判断汉字、日期、数字的具体函数分享给大家…

编码:可视化位图

在过去的一个月左右的时间里&#xff0c;我每天花费一些时间来阅读Neo4j代码库的新部分&#xff0c;以使其更加熟悉&#xff0c;而我最喜欢的类之一是Bits类&#xff0c;该类可以完成所有底层工作&#xff0c;并且到磁盘。 特别是&#xff0c;我喜欢它的toString方法&#xff…

通过更改透明度使图片为透明

使用AlphaBlend函数 函数功能 该函数用来显示具有指定透明度的图像。函数原型 AlphaBlend(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,int hHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,BLENDFUNCTION blendFunc…

(转)CocoaPods:管理Objective-c 程序中各种第三方开源库关联

在我们的iOS程序中&#xff0c;经常会用到多个第三方的开源库&#xff0c;通常做法是去下载最新版本的开源库&#xff0c;然后拖拽到工程中。 但是&#xff0c;第三方开源库的数量一旦比较多&#xff0c;版本的管理就非常的麻烦。有没有什么办法可以简化对第三方库的管理呢&…

为什么子进程每次执行顺序不一样_看完这篇还不懂Redis的RDB持久化,你来打我...

推荐观看&#xff1a;Redis缓存穿透的终极解决方案&#xff0c;手写布隆过滤器_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.comP8架构师串讲&#xff1a;Redis&#xff0c;zookeeper&#xff0c;kafka&#xff0c;Nginx等技术_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​w…

Spring XD用于数据提取

Spring XD是一个功能强大的工具&#xff0c;它是一组可安装的Spring Boot服务&#xff0c;可以独立运行&#xff0c;在YARN或EC2之上运行。 Spring XD还包括一个管理UI网站和一个用于作业和流管理的命令行工具。 Spring XD是一组功能强大的服务&#xff0c;可与各种数据源一起使…

JDK 9 REPL:入门

会议是聚会Java名人的好地方。 Devoxx France是与Java语言架构师&#xff0c;前同事和老朋友Brian Goetz&#xff08; briangoetz &#xff09;见面的一个机会。 我们谈论了JDK 9&#xff0c;而他全都热衷于REPL。 他提到&#xff0c;尽管Java SE 9中有很多重要功能 &#xff0…

sinaapp mysql连接_手把手教你在新浪云上免费部署自己的网站--连接数据库

看完之后&#xff0c;默认你知道怎么将代码上传到新浪云SAE&#xff0c;并且能够成功运行&#xff0c;连接数据库之前&#xff0c;你必须先创建有一个应用。现在我创建一个名称为sampleone的应用&#xff0c;如下图点击左侧的代码管理&#xff0c;选在右侧创建一个版本然后就会…

HDU-4527 小明系列故事——玩转十滴水 模拟

题意&#xff1a;就是平时玩的十滴水游戏&#xff0c;游戏者拥有一定的水滴&#xff0c;能够滴在某些位置&#xff0c;如果一个点上的体积超过了4就会爆炸&#xff0c;向四周传递一个小水滴。该题就是要求模拟这个过程。 分析&#xff1a;这里有一个问题就是不能够使用递归来处…

win8改win7 教程

新入手的WIN8怎么改成WIN7呢&#xff1f;下面以戴尔Dell V3560 win8换win7系统为例说明&#xff1a; win8改win7本文转自http://jingyan.baidu.com/article/ed2a5d1f2a97ee09f6be17e2.html 第一步&#xff1a;开机过程中不断按F2进入到BIOS&#xff0c;更改bios设置&#xff0c…

7 centos 查看程序文件数量_解析CentOS 7中系统文件与目录管理

LINUXLinux操作系统解析CentOS 7中系统文件与目录管理Linux目录结构Linux目录结构是树形的目录结构根目录所有分区、目录、文件等的位置起点整个树形目录结构中&#xff0c;使用独立的一个“/”表示常见的子目录目录目录名称目录目录名称/root管理员家目录/bin所有用户可执行命…

IE浏览器模式设置

文件兼容性用于定义让IE如何编译你的网页。此文件解释文件兼容性&#xff0c;如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式。 前言 为了帮助确保你的网页在所有未来的IE版本都有一致的外观&#xff0c;IE8引入了文件兼容性。在IE6中引入一个增设的兼容…

mysql存储过程套嵌_mysql存储过程套嵌

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

拆卸invokedynamic

许多Java开发人员认为JDK的第七版有些令人失望。 从表面上看&#xff0c;仅少数语言和库扩展使它成为了发行版&#xff0c;即Project Coin和NIO2 。 但在幕后&#xff0c;该平台的第七个版本对JVM类型系统进行了最大的扩展&#xff0c;这是它最初发布后引入的。 添加invokedyna…

CRON

http://blog.csdn.net/tianlesoftware/article/details/5315039 1. 同时修改文件的修改时间和访问时间 touch -d "2010-05-31 08:10:30" test.doc 2. 只修改文件的修改时间 touch -m -d "2010-05-31 08:10:30" test.doc 3. 只修改文件的访问时间 touch -a …

mysql innodb_file_format_Innodb表压缩过程中遇到的坑(innodb_file_format)

对于越来越多的数据&#xff0c;数据库的容量越来越大&#xff0c;压缩也就越来越常见了。在我的实际工作中进行过多次压缩工作&#xff0c;也遇到多次问题&#xff0c;在此和大家分享一下。首先&#xff0c;我们先说说怎么使用innodb的压缩.第一&#xff0c;mysql的版本需要大…

java内存泄漏和内存溢出_Java和内存泄漏

java内存泄漏和内存溢出总览 术语“内存泄漏”在Java中的使用方式不同于在其他语言中使用的方式。 通用术语中的“内存泄漏”是什么意思&#xff0c;在Java中如何使用&#xff1f; 维基百科的定义 当计算机程序消耗内存但无法将其释放回操作系统时&#xff0c;就会发生计算机科…

JSP内置对象之WEB安全性及config对象

一、WEB-INF的安全性是最高的。 在Java EE的标准中&#xff0c;Web目录中的WEB-INF是必须存在的&#xff0c;而且此文件夹的安全性是最高的&#xff0c;在各个程序的开发中&#xff0c;基本上都将一些配置信息保存在此文件夹中。在定义WEB-INF目录时一定要注意大小写的问题&…

一行中的Java 8 Lambda

如果您了解这一行&#xff0c;或者更好的是仍然可以编写此代码&#xff0c;则可以说您已经了解了Java 8 Lambda的本质。 当然&#xff0c;它们可以与集合一起使用。 我在Peter Lawrey最近的一次演讲中发现了这一点 。 &#xff08;有空余时间绝对值得观看整个演示文稿。&#…

mysql事务的重复性读_Mysql下InnoDB的可重复读级别的事务测试

Mysql下InnoDB的可重复读的事务测试### 背景&#xff1a;* mysql版本&#xff1a;Server version: 5.1.71* 操作系统&#xff1a;CentOS 6.5 X64* 事务隔离级别&#xff1a;不可重复读### 实验前的准备&#xff1a;mysql> use test;mysql> create table test_table(id in…