spring通过反射执行注解对应的方法

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ActionMapping {
    int mapping();

    int weight() default 1;

    boolean needTransaction() default false;
}
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class SpringContextHolder implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    private static Map<Integer,Method> map = new HashMap<>();
    private static Map<Integer,Class> classMap = new HashMap<>();

    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        SpringContextHolder.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static void printAllBeans() throws InvocationTargetException, IllegalAccessException, InstantiationException {
        Map<String, Object> a = SpringContextHolder.getApplicationContext().getBeansWithAnnotation(Controller.class);
        for (Object o : a.values()) {
            Class<?> cls = o.getClass();
            Method[] methods = cls.getDeclaredMethods();
            for (Method method : methods) {
                if (method.isAnnotationPresent(ActionMapping.class)){
                    ActionMapping mapping = method.getAnnotation(ActionMapping.class);
//                    method.invoke(cls.newInstance());
                    map.put(mapping.mapping(),method);
                    classMap.put(mapping.mapping(),cls);
                }
            }
        }
        map.get(2).invoke(SpringContextHolder.getApplicationContext().getBean(classMap.get(2)));
    }

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, InstantiationException {
        applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        printAllBeans();
    }
}
import org.springframework.stereotype.Controller;

@Controller
public class Test1Action implements IAction {

    @ActionMapping(mapping = 1)
    public void test1(){
        System.out.println("Test1Action test1");
    }
    @ActionMapping(mapping = 2)
    public void test2(){
        System.out.println("Test1Action test2");
    }

    public void test3(){

    }
}
import org.springframework.stereotype.Controller;

@Controller
public class Test2Action implements IAction {

    @ActionMapping(mapping = 3)
    public void test1(){
        System.out.println("Test2Action test1");
    }
    @ActionMapping(mapping = 4)
    public void test2(){
        System.out.println("Test2Action test2");
    }

    public void test3(){

    }
}
public interface IAction {
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值