“Lookup方法”可以使Spring替换一个bean原有的,获取其它对象具体的方法,并自动返回在容器中的查找结果。
其实,Lookup方法的工作机制是在不修改原系统代码的情况下,可以轻易的换成别的类型相容的对象而不会影响原系统。Spring是使用CGLIB在字节码级别动态实现出Bean的子类,并重写指定方法的方式来实现这个神奇的功能的。
这个是CGLIG动态生成的类,而不是原来的Bean的实例。所以请记住在任何时候只要定义了一个Bean的Lookup方法,那么这个Bean的实例将是一个CGLIB动态生成的实例而不是原来类的实例。
原文地址:http://blog.csdn.net/qking93415981/archive/2007/08/10/1735617.aspx
UserDao.java
package com.modellite.spring;
public class UserDao
{
private String name;
public UserDao(String name)
{
super();
this.name = name;
}
public UserDao()
{
// TODO Auto-generated constructor stub
}
public void setName(String name)
{
this.name = name;
}
public void create(){
System.out.println("create users from -"+name);
}
}
UserManager.java
在这段代码中UserManager依靠getUserDao方法来获取UserDao对象。由于在getUserDao方法里显示的声明了如何去实例一个UserDao,所以上面的代码不符合IoC模式的风格。虽然使用GetUserDao封装了UserDao的创建过程,但是UserManager和UserDao的关系仍然非常紧密。
package com.modellite.spring;
public class UserManager
{
public UserDao getUserDao()
{
return new UserDao("UserManager.getUserDao()");
}
public void createUser()
{
UserDao dao = getUserDao(); // 通过getUserDao获得userDao
dao.create();
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="userManager" class="com.modellite.spring.UserManager">
<lookup-method name="getUserDao" bean="userDao" />
</bean>
<bean id="userDao" class="com.modellite.spring.UserDao">
<constructor-arg>
<value>lookup method</value>
</constructor-arg>
</bean>
</beans>
测试类
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
UserManager manager=(UserManager) ctx.getBean("userManager");
System.out.println(manager.toString()); //打印userManager的信息
manager.createUser();
Spring还允许Lookup方法中定义的方法带有参数,但是Sping不会处理这些参数。
修改UserManager:
package com.modellite.spring;
public class UserManager
{
public UserDao getUserDao(String daoName){
{
return new UserDao("UserManager.getUserDao()");
}
public void createUser()
{
UserDao dao = getUserDao(); // 通过getUserDao获得userDao
dao.create();
}
}
虽然方法上由参数,但是上面的代码可以正常工作。Spring不会处理这些参数。
Spring对Lookup方法也存在一些限制:
方法不能是private的,但可以是protected的。
方法不能是静态的。
在抽象类和接口上应用Lookup方法有一个比较有趣的用法,就是在抽象类上定义Lookup方法。你一定记得经典的工厂模式吧。定义一个抽象工厂,然后为每一类具体产品实现一个具体产品的工厂。
一个抽象工厂:
package com.modellite.spring;
public abstract class Factory{
public abstract UserDao getProduct();
}
具体一类产品的工厂:
package com.modellite.spring;
public class UserDaoFactory extends Factory{
public UserDao getProduct(){
return new UserDao("UserDaoFactory");
}
}
用户可以通过:
new UserDaoFactory().getProduce();
来获取具体的UserDao产品。
但是如果有很多产品就需要做出实现出很多工厂如,DocumentDaoFactory、GroupDaoFactory等等,这样系统中会出现大量的工厂。工厂的泛滥并不能说明系统的设计是合理的。
既然Spring可以在抽象类上使用Lookup方法,那么我们就可以不同实现真的去实现那么多的子类了。我们可以在抽象类上直接定义Lookup方法和目标对象。用户直接通过抽象类来获得需要的产品对象。看下面这个例子:
Factory.java
package com.modellite.spring;
public abstract class Factory {
public abstract Object getProduct();
}
配置文件添加
<!--如果指定userDaoFactory的类为一个抽象类,并且再这个bean里定义了Lookup方法,那么Spring会自动生成这个抽象类的子类实现。 -->
<bean name="userDaoFactory" class="com.modellite.spring.Factory" scope="prototype">
<lookup-method name="getProduct" bean="userDao" />
</bean>
UserDao并没有改变,我们通过抽象的Factory获得了具体的UserDao的实例。这样即使系统中很多的具体产品我们也不需要实现每类产品的工厂类了。只需要在系统中配置多个抽象工厂,并且配置每个工厂的singlton为false,在用户使用时使用不同抽象工厂的实例就可以了。
<bean name="userDaoFactory" class="com.modellite.spring.Factory" scope="prototype">
<lookup-method name="getProduct" bean="userDao" />
</bean>
<bean name="documentDaoFactory" class="com.modellite.spring.Factory" scope="prototype">
<lookup-method name="getProduct" bean="documentDao" />
</bean>
Spring不关心抽象类中的定义的lookup方法是否时抽象的,Spring都会重写这个方法。
既然Sping可以动态实现抽象类的子类那么,它能不能动态创建出实现一个接口的类呢。答案时肯定的。上面的例子可以直接把Factory变成一个接口,仍然可以正常工作。
这里需要注意的是,只要在一个Bean上明确的定义了Lookup方法,Spring才会使用CGLIB来做原对象的字节码代理。如果一个没有定义Lookup方法的抽象类或接口是不能直接被Spring实例的。
本文介绍了Lookup方法的使用和工作原理,希望读者能够对Lookup方法有了比较深入的了解。虽然我的例子可以简化工厂模式,但是我并不鼓励大家在实际系统中这样做。因为我始终认为“工厂模式”只要在遗留系统中才会碰到。使用IoC模式基本上可以替代所有的对象创建模式。本章的例子只是为了说明Lookup方法如何使用,和Lookup方法的一些特殊情况。Lookup方法一般只在处理遗留代码时使用。
分享到:
相关推荐
EJB(Enterprise JavaBeans)是Java企业级应用开发的核心组件之一,主要用于构建可复用、安全和事务处理的服务器端应用程序。本压缩包"各种EJB之间的调用示例.zip"提供了一些关于EJB调用的实例,帮助开发者了解如何...
- 主要作用:在不修改源代码的情况下对方法进行扩展,降低业务逻辑各部分之间的耦合度,提高代码的可重用性和可维护性。 - 使用场景:例如,可以在方法执行前后自动记录日志,或者在数据库操作前后自动开启和关闭...
Log4Shell漏洞的核心在于log4j2的Lookup功能,该功能允许在日志消息中动态解析变量。攻击者可以利用此功能,将恶意的JNDI链接注入到日志记录中,当log4j2尝试解析这些链接时,就会执行攻击者控制的代码。由于很多...
这里的关键在于使用`InitialContext`来获取`Context`对象,并通过`lookup`方法查找目标EJB。 ##### 2. 采用`@EJB`注入另一个EJB的引用 使用`@EJB`注解可以在类级别或方法级别注入另一个EJB的引用。这种方式更为...
Java初学小作业,文件操作
本工具用于在支持无线网络的电脑上输入SSID和密码后一键创建WIFI热点
4.3 信息检索与问题解决 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv openmv+STM32串口通信 op
内容概要:本文详细探讨了EKF(扩展卡尔曼滤波)算法与传统里程计算法在机器人轨迹定位和跟踪中的性能差异。文中通过具体代码实例展示了两种方法的工作原理,并通过实验数据对比了两者的定位精度。里程计算法由于误差累积问题,定位精度较低,平均误差达到1.0283米;而EKF算法通过融合多种传感器数据并不断修正,显著提高了定位精度,平均误差仅为0.0716米。此外,文章还讨论了EKF算法的局限性和应用场景。 适合人群:从事机器人研究、开发的技术人员,尤其是关注机器人定位和导航系统的工程师。 使用场景及目标:适用于需要高精度机器人定位和跟踪的应用场景,如自动驾驶、仓储物流自动化等。目标是帮助技术人员选择合适的定位算法,优化机器人系统的性能。 其他说明:尽管EKF算法在大多数情况下表现出色,但在某些极端条件下(如急转弯)仍可能存在误差,此时可以考虑使用更高级的滤波算法,如UKF(无迹卡尔曼滤波)。
1、该资源内项目代码经过严格调试,下载即用确保可以运行! 2、该资源适合计算机相关专业(如计科、人工智能、大数据、数学、电子信息等)正在做课程设计、期末大作业和毕设项目的学生、或者相关技术学习者作为学习资料参考使用。 3、该资源包括全部源码,需要具备一定基础才能看懂并调试代码。 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip 大学生创新创业项目-基于微信小程序的一款模拟面试软件源码(使用微信Web开发者工具来实现用在线答题,支持在线面试(视频面试),可以观看面试视频,可以投简历,随时刷新招聘的信息、发布招聘信息、收藏文章等功能).zip
# 基于Go语言的数据库智能迁移工具 ## 项目简介 本项目是一个基于Go语言的数据库智能迁移工具,旨在帮助开发者方便、高效地进行数据库版本管理和迁移。通过简单的配置和SQL脚本,用户可以轻松地进行数据库结构的更新和数据的迁移。 ## 项目的主要特性和功能 1. 支持多种数据库涵盖MySQL、PostgreSQL,可按需选择。 2. 配置文件解析解析YAML格式配置文件,获取数据库连接、迁移目录、日志路径等参数。 3. 迁移文件过滤忽略以"ignore"开头的SQL文件,避免误执行。 4. 版本管理按文件名判断版本,依版本号顺序执行迁移脚本,保证迁移连续性。 5. 自动执行SQL脚本自动执行迁移目录下SQL文件,完成数据库结构更新和数据迁移。 6. 通知功能可通过企业微信等方式发送通知,告知迁移结果或提醒异常。 7. 日志记录详细记录迁移过程日志,便于追踪排查问题。 ## 安装使用步骤 1. 已下载项目的源码文件。
本工具用于将一台电脑上的个人数据快速备份到移动介质上,然后再将备份的数据从移动介质上还原到另一台电脑中,实现用户数据的快速迁移。
内容概要:本文档详细介绍了 Ubuntu 20.04 的安装步骤,包括从下载镜像到安装后的配置。首先,用户需要访问 Ubuntu 官网下载 ISO 文件,并通过工具如 Rufus 或命令行工具 `dd` 制作启动 U 盘。接着,设置 BIOS 使 U 盘成为第一启动项,进入 Ubuntu 安装界面。在安装过程中,用户可以选择安装语言、连接网络、选择安装类型(普通或最小安装)、进行磁盘分区(可选),以及设置用户信息
数据说明: 由Landsat 08卫星拍摄的山区、森林覆盖和沙漠图像组成的数据集,为遥感分析的各种应用提供了宝贵的资源。每幅图像的分辨率为256x256像素,比例尺范围为2公里至50公里每厘米,该数据集提供了高细节水平和覆盖范围,可用于分类和分割任务。 对于这个数据集,一个潜在的开发想法是实施机器学习模型,用于自动分类图像中的土地覆盖类型。通过在这个数据集上训练深度学习网络,可以创建一个能够准确识别和分类不同土地覆盖类别的模型,例如山脉、森林和沙漠。这将对环境监测、土地利用规划和保护工作产生重大影响。 该数据集的另一个可能应用是在变化检测分析领域。通过比较在不同时间点拍摄的图像,可以识别和分析土地覆盖模式的变化,如森林砍伐、城市化或自然灾害。这些信息可用干评估人类活动对环境的影响,监测植被健康状况的变化或预测土地覆盖动态的未来趋势。 此外,该数据集可用于开发图像分割算法,这涉及将图像划分为多个区域或感兴趣的对象。通过对这一数据集应用先进的图像处理技术,将有可能在图像中准确划定不同土地覆被类型的界限,从而能够对数据进行更详细的分析和解释。
内容概要:本文详细介绍了选区激光熔化(SLM)和电子束选区熔化(EBM)这两种增材制造技术的热源模拟方法。文中首先解释了这两种技术的基本原理及其面临的挑战,即如何精确控制热源分布和热影响区。随后,文章重点讨论了高斯热源模型的应用,包括其数学表达式以及在ANSYS Fluent中的具体实现方式。此外,还探讨了模拟过程中需要注意的关键点,如网格划分、边界条件和材料属性的设定。最后,通过一个具体的SLM模拟案例展示了整个模拟流程,并给出了实用的操作建议和技术细节。 适合人群:从事增材制造领域的研究人员、工程师以及相关专业的学生。 使用场景及目标:适用于希望通过数值模拟优化SLM和EBM工艺参数的研究人员和工程师,旨在提高成形件质量并降低成本。同时,也为初学者提供了一套完整的模拟指南。 其他说明:文章不仅提供了理论知识,还包括了大量的实践经验和代码示例,有助于读者更好地理解和掌握热源模拟的技术要点。
内容概要:本文详细介绍了永磁同步电机(PMSM)负载转矩估计的研究背景及其重要性,重点讨论了几种经典负载估计方法,包括卡尔曼滤波、离散卡尔曼滤波和Luenberger龙博格观测器。文中不仅提供了理论解释,还展示了具体的MATLAB/Simulink仿真模型,涵盖负载转矩测量、预测及转矩预测等功能。此外,文章深入探讨了负载自适应、转矩估计、电机转速闭环控制等关键技术的融合,强调了这些技术在实现PMSM高性能控制中的协同作用。通过实际案例和实验数据,验证了不同方法的有效性和优劣。 适合人群:从事电机控制、自动化工程及相关领域的研究人员和技术人员,尤其是对永磁同步电机负载转矩估计感兴趣的读者。 使用场景及目标:适用于希望深入了解PMSM负载转矩估计方法及其仿真的科研工作者和工程师。目标是掌握卡尔曼滤波、Luenberger观测器等技术的具体实现,提升电机控制系统的性能和稳定性。 其他说明:文章提供了详细的仿真模型和代码片段,便于读者理解和复现实验结果。同时,针对实际应用中的常见问题给出了优化建议,帮助读者避免常见的错误和陷阱。
# 基于TensorFlow.js和Angular的表情分类应用 ## 项目简介 本项目是一个使用TensorFlow.js和Angular构建的表情分类应用。它通过机器学习和图像识别技术,帮助用户理解和预测他人的情绪表达。这是一个有趣且实用的工具,特别是在人际交往过程中,可以帮助你更好地理解他人的情绪和意图。 ## 项目的主要特性和功能 1. 表情识别: 通过摄像头实时捕捉图像,应用机器学习模型进行表情识别。 2. 简单的用户界面: 用户界面设计简洁明了,易于操作。 3. 训练模型: 用户可以通过点击不同的类别来录入图像,训练模型以识别不同的表情。 4. 实时反馈: 训练完毕后,应用会实时分析摄像头的图像,并给出最可能的表情类别。 ## 安装使用步骤
QxEntityEditor 1.2.8 64位 MacOS程序安装包,QxOrm图形化编辑工具。官网无法访问,加速下载。
《前后端分离的图书管理系统源码资源简介》 本资源包含前后端分离的图书管理系统新版源码、详细说明以及数据库文件,是一份极具学习价值的优质资源。 在前端方面,采用现代化的前端技术框架构建用户界面,具备简洁美观、交互友好的特点,能为用户提供流畅的操作体验,如便捷的图书查询、借阅操作等。后端则运用成熟的技术栈,实现系统的核心业务逻辑,包括对图书信息、用户信息的管理,以及借阅流程的处理等,确保系统的高效稳定运行。 详细说明文档对系统的各个功能模块、代码结构、关键技术点进行了详细解读,有助于学习者快速理解系统的设计思路和实现原理。数据库文件则为系统提供了数据存储支持,其设计合理,能满足图书管理系统的数据需求。 本资源为学习者提供了一个实际的项目案例,通过学习和研究该资源,可深入了解前后端分离的开发模式、相关技术的应用,提升编程能力和项目实践水平,但请注意,本资源仅用于学习交流,严禁用于商业用途。
3.4.6-识别形状+颜色+增加最小变化阈值+增加最大变化阈值 STM32串口通信 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv数
matlab