Spring MethodInvoker学习笔记

  1. 编写业务执行代码
    @Component
    public class AMethodClass {
        public static String execute(String str) {
            return str.concat("-result");
        }
        public String execute2(String str) {
            return str.concat("-result2");
        }
    }
    
  2. 编写配置类
    @Configuration
    @ComponentScan("com.yicj.study.shiro.methodinvoke")
    public class AConfig {
        @Bean
        public MethodInvoker aMethod(){
            MethodInvoker invoker = new MethodInvoker() ;
            invoker.setTargetClass(AMethodClass.class);
            invoker.setTargetMethod("execute");
            return invoker ;
        }
        @Bean
        public MethodInvoker aMethod2(AMethodClass aMethod2Class){
            MethodInvoker invoker = new MethodInvoker() ;
            invoker.setTargetObject(aMethod2Class);
            invoker.setTargetMethod("execute2");
            return invoker ;
        }
        @Bean
        public MethodInvokingFactoryBean aMethod3(){
            MethodInvokingFactoryBean factoryBean = new MethodInvokingFactoryBean() ;
            factoryBean.setTargetClass(AMethodClass.class);
            factoryBean.setTargetMethod("execute");
            factoryBean.setArguments("test3");
            return factoryBean ;
        }
    }
    
  3. 静态方法调用(单元测试)
    public class MethodInvokeTest {
        /*
         * 注意看配置文件
         * 获取配置的MethodInvoker;这个bean配置的是targetClass,要求targetMethod必须是静态方法
         * */
        @Test
        public void staticMethodInvoke() throws Exception {
            BeanFactory beanFactory = new AnnotationConfigApplicationContext(AConfig.class);
            MethodInvoker method = (MethodInvoker) beanFactory.getBean("aMethod");
            //下来可以自己手工设置方法参数
            Object[] arguments = new Object[1];
            arguments[0] = "test";
            method.setArguments(arguments);
            // 准备方法
            method.prepare();
            //执行方法
            Object result = method.invoke();
            System.out.println(result);
        }
        
    }
    
  4. 实例方法调用(单元测试)
    public class MethodInvokeTest {
        /*
         * 注意看配置文件
         * 获取配置的MethodInvoker;这个bean配置的是targetObject,则需要先配置一个bean,这里ref到这个bean
         * targetMethod可以不是静态的
         * */
        @Test
        public void instanceMethodInvoke() throws Exception{
            BeanFactory beanFactory = new AnnotationConfigApplicationContext(AConfig.class);
            MethodInvoker method2 = (MethodInvoker) beanFactory.getBean("aMethod2");
            //下来可以自己手工设置方法参数
            Object[] arguments2 = new Object[1];
            arguments2[0] = "test2";
            method2.setArguments(arguments2);
            // 准备方法
            method2.prepare();
            //执行方法
            Object result = method2.invoke();
            System.out.println(result);
        }  
    }
    
  5. 但一般情况不直接使用MethodInvoker,使用MethodInvokingFactoryBean(单元测试)
    public class MethodInvokeTest {
        /*
         * 使用MethodInvokingFactoryBean;相当于spring帮你做了上述逻辑;
         * 可以直接获取到方法的执行结果;
         * 注意这里是方法的返回值;而不是class本身;这是由于MethodInvokingFactoryBean实现了FactoryBean接口;
         * 由接口方法getObject()来获取最终返回的对象
         */
        @Test
        public void factoryBeanInvoke(){
            BeanFactory beanFactory = new AnnotationConfigApplicationContext(AConfig.class);
            Object aMethod3 = beanFactory.getBean("aMethod3");
            System.out.println(aMethod3);
        }
    }
    
  6. 参考博客:https://blog.csdn.net/iteye_11480/article/details/82133807
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值