aop通过接口上的注解进行拦截,无效!!!

如标题:
我定义了一个注解,接口,拦截器,代码如下:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Documented
public @interface Test
@Test
List<Test> test(Object ...);
@Around("@annotation(org.xxx.annotation.Test)")
public Object Interceptor(ProceedingJoinPoint pjp) throws Throwable

接口是没有实现方法的
我的想法是:拦截到接口被调用,我动态的实现,然后直接返回给调用处值
可是,我不知道是不是不能这样拦截.我始终无法拦截到接口被调用.

阅读 15.8k
2 个回答
  1. 接口没有实现方法,spring依赖注入管理的是对象,接口spring可管理不到,既然不是spirng管理的对象,你spirng+aop的配置肯定是失效的
  2. 注解是可以继承,但只有类的注解是可以继承的,还需要@Inherited,方法的注解继承不了,spring管理的是实际对象,你加不上注解,更不可能拦截到
  3. 你想实现的功能大体上是一种动态实现方法的手段,可以考虑以下:
    jdk代理实现接口,然后添加到spring容器中;不过你写这东西有啥用啊。。。。。。。。。。。。
package com.xxx.test;
//目标接口
public interface TestInterface {
    public void test();
}

接下来,用jdk实现代理工厂

public class ImplFactory {

    @SuppressWarnings("unchecked")
    public static <T> T create(Class<T> classzz) {
        ImplProxy<T> proxy = new ImplProxy<T>();
        T t = (T) proxy.bind(classzz);
        return t;
    }

    private static class ImplProxy<T> implements InvocationHandler {
        private Object bind(Class<T> classzz) {
            return Proxy.newProxyInstance(classzz.getClassLoader(), classzz.getInterfaces(),
                    this);
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            return "hahahaha";
        }
    }
}

利用spirng BeanDefinitionBuilder 将实现动态生成,并让spring托管

public class DynamicInjectBean implements ApplicationContextAware {
    private Logger logger = LoggerFactory.getLogger(DynamicInjectBean.class);
    DefaultListableBeanFactory beanFactory = null;
    private String basePackage;

    public void inject() {
        try {
            BeanDefinitionBuilder builder = BeanDefinitionBuilder
                    .genericBeanDefinition(RemoteFactory.class);
            beanFactory.registerBeanDefinition(classzz.getName(),
                    builder.getBeanDefinition());
            logger.info("remote 注册"+classzz.getName()+"到Spring容器中...");
        } catch (Exception e) {
            throw new RuntimeException("创建service" + classzz.getSimpleName()
                    + "异常:", e);
        }
    }

    @PostConstruct
    public void init() {
            Class classzz = Test.class;
            inject(classzz);
    }
    
    @Override
    public void setApplicationContext(ApplicationContext applicationcontext)
            throws BeansException {
        ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationcontext;
        beanFactory = (DefaultListableBeanFactory) configurableApplicationContext
                .getBeanFactory();
    }
}

最后配置一下在bean.xml中配置一下DynamicInjectBean就大功告成了

最主要的是:接口是没有实现方法的.不知道这样的注解能不能被拦截

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏