我正在编写自己的BeanPostProcessor
,因此在eclipse Oxygen和java 9基础结构中创建了一个实现BeanPostProcessor接口的类。
现在问题是 - 编译器不允许我对方法使用@Override注释 - postProcessBeforeInitialization(Object,String)
和postProcessAfterInitialization(Object,String)
。为什么?并且即使我没有在我的类中提供这些方法的实现,我也没有收到针对Interface规则的编译器投诉。我的意思是我应该得到编译器错误告诉我必须实现接口方法。但不是。为什么?请指导我。
答案 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;
}
}
编译器将允许您使用@Override。
@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