我正在编写自己的BeanPostProcessor,因此在eclipse和java9基础结构中创建了一个实现BeanPostProcessor接口的类。
现在的问题是-编译器不允许我对方法-- postProcessBeforeInitialization(Object,String)和postProcessAfterInitialization(Object,String)使用@重写注释。为什么?,即使我没有在类中提供这些方法的实现,我也不会收到编译器的抱怨,这是违反接口规则的。我的意思是,我应该得到编译器错误,告诉我必须实现接口方法。但事实并非如此。为什么?请引导我。
发布于 2018-07-17 09:00:28
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;
}
}编译器将允许您使用@重写。
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}在方法定义中,我们在Java 8中引入了'default‘关键字,因此您不必实现这个方法。在本例中,Java为该方法提供了“返回bean”作为主体。
发布于 2018-03-16 13:21:42
如果你看一下例如postProcessBeforeInitialization的签名
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}您将注意到,此方法是在接口中定义的,但已经声明为默认,因此具有一个实现。所以你不需要覆盖它。
发布于 2018-07-24 05:45:19
我有同样的问题,现在您确实想要覆盖这些方法,我想创建我自己的bean处理器,所以我重写了接口中的两个方法--参数是@Nullable
因此,我可以取消警告,或者在我的方法参数中添加@NullAble注释。
您可以覆盖默认方法。
我有Intellij和java9与springboot-2,我确实用@override注释了我的方法,因为您应该能够覆盖非最终方法,包括默认的接口方法。
@Override public Object postProcessBeforeInitialization(@Nullable final Object bean, String beanName) throws BeansException
https://stackoverflow.com/questions/49319849
复制相似问题