网站首页 > 技术文章 正文
1. 环境准备
首先,准备一个Service Bean,该类会在接下来的代码中都会使用到。
@Component("ps")
public class PersonService {
public void save() {
System.out.println("PersonService save method invoke...") ;
}
public void query(Integer id) {
System.out.printf("PersonService query method id: %d%n", id) ;
}
}
该类非常的简单就是为了接下来的演示足够简单清晰。
2. 方法定位
public class MethodLocatingFactoryBean implementsFactoryBean<Method>, BeanFactoryAware {
private String targetBeanName;
private String methodName;
private Method method;
public Method getObject()throws Exception {
returnthis.method;
}
public Class<Method> getObjectType(){
return Method.class;
}
// ...
}
该类是个FactoryBean,具体返回的是Method对象;该类主要的作用就是通过beanName查找到对应的Class,然后通过设置的methodName查找该Class对应的Method对象。
定义Bean对象
@Configuration
public class AppConfig {
@Bean
MethodLocatingFactoryBean methodLocatingFactoryBean() {
MethodLocatingFactoryBean fb = new MethodLocatingFactoryBean() ;
// 设置要查找的方法签名
fb.setMethodName("save") ;
// 设置beanName
fb.setTargetBeanName("ps") ;
return fb ;
}
}
知道了MethodLocatingFactoryBean返回的是Method,那接下来就可以在其它的Bean中直接注入该Method对象。
@Component
public class BeanMethod {
// 注入Method
@Resource
private Method method ;
@Resource
private PersonService target ;
public Object invoke(Object ... params) throws Exception {
return method.invoke(target, params) ;
}
}
测试&输出结果
@Resource
private BeanMethod bm ;
@Test
public void testSave() {
bm.invoke() ;
}
// 输出
PersonService save method invoke...
配置带参数的方法
MethodLocatingFactoryBean fb = new MethodLocatingFactoryBean() ;
fb.setMethodName("query(java.lang.Integer)") ;
方法的参数类型需要完整的限定名(包名+类名),如果方法参数是基本数据类型,那么直接写基本类型即可(query(int))。
3. 方法调用
public class MethodInvokingFactoryBean extends MethodInvokingBean
implements FactoryBean<Object>
// 返回的实际对象
private Object singletonObject
public void afterPropertiesSet() throws Exception {
// 准备初始化
prepare() ;
if (this.singleton) {
this.initialized = true;
// 创建调用;在方法内部会调用设置的目标方法,获取方法的返回值
this.singletonObject = invokeWithTargetException();
}
}
public Object getObject() throws Exception {
if (this.singleton) {
// ...
return this.singletonObject;
}
}
}
该类在初始化方法调用时,会调用目标类的方法,方法返回值作为这里getObject方法的返回对象。
定义一个工厂类(无所谓是否是工厂类)
public class PersonFactory {
public PersonService getInstance() {
return new PersonService() ;
}
public static PersonService getPs() {
return new PersonService() ;
}
}
该类不用注册为Bean对象。接下来配置bean对象
@Configuration
public class AppConfig {
@Bean
MethodInvokingFactoryBean methodInvokingFactoryBean() {
MethodInvokingFactoryBean fb = new MethodInvokingFactoryBean() ;
// 静态方法
fb.setTargetClass(PersonFactory.class) ;
fb.setTargetMethod("getPs") ;
return fb ;
}
}
测试&输出结果
@Resource
private PersonService ps ;
@Test
publicvoidtestSave(){
ps.query(10) ;
}
// 输出
PersonService query method id: 10
配置为非静态方法
MethodInvokingFactoryBean fb = new MethodInvokingFactoryBean() ;
// 非静态方法
fb.setTargetObject(new PersonFactory()) ;
fb.setTargetMethod("getInstance") ;
猜你喜欢
- 2025-05-27 静态库和目标文件保护:开发者的新“神器”
- 2025-05-27 智能驾驶为何频现“误判门”
- 2025-05-27 问了一个DeepSeek关于现在男女婚配的问题,你猜它怎么回答的
- 2025-05-27 日思录(2236)车间现场管理:一眼看穿工厂的方法
- 2025-05-27 拒绝内耗!聪明人都懂的人生通关秘诀:不追满分,守住60分底线
- 2024-07-26 一名攻城狮都必须懂的前端性能优化
- 2024-07-26 《目标感》:没有目标的人生,犹如没有舵的船
- 2024-07-26 如何从静态图像中识别“比心”动作
- 2024-07-26 一个想要成功的人应该拥有的三种思维模式
- 2024-07-26 陈何芳,靳娜:校园环境理论对非正规教育有何借鉴意义
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 1524℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 659℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 528℃MySQL service启动脚本浅析(r12笔记第59天)
- 494℃启用MySQL查询缓存(mysql8.0查询缓存)
- 493℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 481℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 463℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 461℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)