网站首页 > 技术文章 正文
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 陈何芳,靳娜:校园环境理论对非正规教育有何借鉴意义
- 最近发表
-
- 使用这个新的 ECMAScript 运算符告别 Try/Catch!
- 抛弃 try-catch,错误处理的新方案
- 深圳尚学堂Java培训:总结java编程常用的快捷键(二)
- Try-catch speeding up my code?(speeding up)
- 能代替try catch处理异常的优雅方式
- Linux系统stress压力测试工具(linux自带的压力测试)
- ESL-通过事件控制FreeSWITCH(es事务控制)
- 谈JVM xmx, xms等内存相关参数合理性设置
- 嵌入式工程师竟然看不懂这些专业语句,那真别怪人说你菜
- 不会前端也能写官网?没问题,Devbox+Cursor 带你起飞
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)