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 {
}