实现BeanPostProcessor spring 5 + java 9

时间:2018-03-16 11:35:41

标签: spring interface override

我正在编写自己的BeanPostProcessor,因此在eclipse Oxygen和java 9基础结构中创建了一个实现BeanPostProcessor接口的类。

现在问题是 - 编译器不允许我对方法使用@Override注释 - postProcessBeforeInitialization(Object,String)postProcessAfterInitialization(Object,String)。为什么?并且即使我没有在我的类中提供这些方法的实现,我也没有收到针对Interface规则的编译器投诉。我的意思是我应该得到编译器错误告诉我必须实现接口方法。但不是。为什么?请指导我。

3 个答案:

答案 0 :(得分:2)

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class DisplayNameBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("Before "+bean.getClass() + "  " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("After "+bean.getClass() + "  " + beanName);
        return bean;
    }


}

编译器将允许您使用@O​​verride。

@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    return bean;
}

在方法定义中,我们在Java 8中引入了'default'关键字,因此不必实现此方法。在这种情况下,Java提供了“返回bean”。作为此方法的主体。

答案 1 :(得分:0)

如果你看一下例如postProcessBeforeInitialization

的签名
    @Nullable
    default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

您会注意到此方法是在接口中定义的,但已经声明为默认,因此具有实现。所以你不需要覆盖它。

答案 2 :(得分:0)

我有一个同样的问题,现在您想覆盖这些方法,我想创建自己的bean处理器,所以我覆盖了这两个方法现在在接口中,参数为@Nullable

因此,我可以禁止显示警告或在方法的参数中添加@NullAble注释。

您可以覆盖默认方法。

我拥有带有springboot-2的Intellij和java9,并且使用@override注释了我的方法,因为您应该能够覆盖非最终方法,包括默认的接口方法。

@Override public Object postProcessBeforeInitialization(@Nullable final Object bean, String beanName) throws BeansException