我正在检查bean作用域,一个注入到单例bean中的原型。当我使用@Lookup注解时,它抛出了空指针异常。
在singletonBean类中显示null指针...实际上,返回的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();
}
}
2条答案
按热度按时间5hcedyr01#
我曾经用这种方法做过同样的事情,然后,由于某种未知的原因,它停止了工作,产生了同样的NPE问题。我相信Spring在用GCLIB编译的实现替换自己的实现方面存在问题。
最后,我使用了factory method approach,即客户端bean拥有Spring应用程序上下文,并使用它返回
getProtoBean()
中所需的依赖项,这没有使用@Lookup
那么直接,但似乎更可靠。rjee0c152#
我还有下一个案子:
在原型Bean的@PostConstruct处及之后抛出异常,在@Lookup方法中始终返回空值。
例外情况:
为了修复此行为,我在@PostConstruct方法中捕获异常:
数据库. springframework. Bootstrap :2.3.2.版本
io. Spring .依赖性管理:1.0.8.发布