Spring - перехватывает создание бина и вводит собственный прокси

у меня есть@Controller с@Autowired поля и методы-обработчики, которые я хочу аннотировать с помощью пользовательских аннотаций.

Например,

@Controller
public class MyController{
    @Autowired
    public MyDao myDao;

    @RequestMapping("/home")
    @OnlyIfXYZ
    public String onlyForXYZ() {
        // do something
        return "xyz";
    }
}

куда@OnlyIfXYZ пример пользовательской аннотации Я думал, что перехватлю создание bean-компонента Controller, передам свой собственный прокси-сервер CGLIB, в котором Spring может затем установить свойства, например, поле autowired.

Я пытался с помощьюInstantiationAwareBeanPostProcessor но это решение неработает отлично, потому чтоpostProcessBeforeInstantiation() замыкает остальную часть процесса. Я пробовал сpostProcessAfterInitialization()как ниже

public class MyProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // Here the bean autowired fields are already set
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object aBean, String aBeanName) throws BeansException {
        Class clazz = aBean.getClass();
        // only for Controllers, possibly only those with my custom annotation on them
        if (!clazz.isAnnotationPresent(Controller.class))
            return aBean;

        Object proxy = Enhancer.create(clazz, new MyMethodInterceptor());
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            try {
                // get the field and copy it over to the proxy
                Object objectToCopy = field.get(aBean);
                field.set(proxy, objectToCopy);
            } catch (IllegalArgumentException | IllegalAccessException e) {
                return aBean;
            }
        }   
        return proxy;
    }
}

Это решение использует отражение, чтобы скопировать все поля целевого компонента в прокси-компонент (на мой взгляд, довольно странно). Но я нене имеет доступа кHttpServletRequest а такжеHttpServletResponse объекты, если те неT аргументы в методе I 'м перехват.

Есть ли другой обратный вызов, который я могу внедрить в логику создания bean-компонента Spring, чтобы добавить мой собственный прокси-контроллер, прежде чем Spring заполнил его свойства?Мне нужно иметь доступ кHttpServletRequest а такжеHttpServletResponse объекты независимо от того, имеет ли метод-обработчик его в своем определении, т.е. в качестве аргументов.

N.B @Autowired поле также является прокси, оно помечено@Transactional так что Spring это прокси

РЕДАКТИРОВАТЬ: Решение AOP прекрасно работает для перехвата вызова метода, но я могуне найти способ получить доступ кHttpServletRequest а такжеHttpServletResponse объекты, если они неЯ уже не аргументы метода.

Я, вероятно, собираюсь в конечном итоге использовать HandlerInterceptorAdapter, но я надеялся, что смогу сделать это с ООП, чтобы не добавлять накладные расходы на методы, которые не 'это не нужно

Ответы на вопрос(4)

Ваш ответ на вопрос