【发布时间】:2019-10-21 12:38:57
【问题描述】:
我正在尝试检查 bean 范围,这是一个注入单例 bean 的原型。当我使用@Lookup 注释时,它会抛出空指针异常。
singletonBean 类的空指针...实际上返回的 null 应该被 cglib 覆盖并且应该返回原型作用域的 bean 正确...
AppConfiguration.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import Bean.ProtoBean;
import Bean.SingletonBean;
@Configuration
public class AppConfiguration {
@Bean
@Scope("prototype")
public ProtoBean protoBean() {
return new ProtoBean();
}
@Bean
@Scope("singleton")
public SingletonBean singletonBean() {
return new SingletonBean();
}
}
SingletonBean.java
@Component
public class SingletonBean {
public SingletonBean() {
System.out.println("SingletonBean");
}
public ProtoBean fromProto() {
ProtoBean protoBean = getProtoBean();
//throws nullpointer here
System.out.println("beans is here: "+protoBean.hashCode());
return protoBean;
}
@Lookup
public ProtoBean getProtoBean() {
return null;
}
}
App.java
public class App
{
public static void main( String[] args )
{
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfiguration.class);
SingletonBean sb = ctx.getBean(SingletonBean.class);
ProtoBean pb = sb.fromProto();
SingletonBean sb1 = ctx.getBean(SingletonBean.class);
ProtoBean pb1 = sb1.fromProto();
if(pb.equals(pb1)) {
System.out.println("Equal Proto");
} else {
System.out.println("Unequal Proto");
}
ctx.close();
}
}
【问题讨论】:
-
好吧,您调用 getProto() 方法,当您查看当前实现时,该方法总是返回 null。所以在下一行当你调用 protoBean.hashCode 你实际上 cvall null.getHashCode 抛出一个空指针异常
-
@meaningqo,不,这不是那么天真。 (S)他试图让 Spring 覆盖返回 null 的 (baeldung.com/spring-lookup),这通常可以工作,但在某些情况下它是有问题的,请参阅我的回答。
标签: spring-boot