我有一个看起来像这样的域对象。 我需要使用从数据库中获取的数据("类型"在本例中)来获取和注入正确类型的服务。
我得到此输出,这意味着在调用期间未设置DB数据:
entity is a bean postconstruct: PocProduct [id=null, type=null, productName=null].. attching behavior!
当我尝试初始化Bean时,我得到相同的resilt。 配置它的正确方法是什么?
@Entity
@Table(name = "AAA_POC_PROD")
@Configurable(dependencyCheck = true)
@Scope("prototype")
public class PocProduct implements Serializable, InitializingBean {
/**
*
*/
private static final long serialVersionUID = 1136936011238094989L;
@Id
private String id;
private String type;
private String productName;
@Transient
private Behaviour behaviour;
@Transient
@Autowired
private BehaviourFactory behaviourFactory;
//getters and setters
@PostConstruct
public void attachBehavior() {
System.out.println("entity is a bean postconstruct: " + this + ".. attching behavior!");
//Need to call this : depends on type which is fetched from DB
// this.behaviour = behaviourFactory.getTypeBasedBehaviour(type);
}
}
答案 0 :(得分:3)
可构造的bean在构建之后或之前由Spring初始化,具体取决于@Configurable.preConstruction
属性的值。从数据库加载实体时,这意味着以下事件序列:
spring-aspects
'AnnotationBeanConfigurerAspect
拦截构造函数执行,并且在构造函数执行之前(或之后),Spring将通过执行您在其中的任何bean配置来配置这个新创建的对象弹簧环境,包括属性的自动装配。@PostLoad
方法,JPA提供程序将调用这些方法,以便在实体完全填充数据库中的数据后,您的实体有机会继续工作。从我看到你要做的事情来看,第四步是你应该放置你的自定义行为逻辑,假设其他一切都正常工作。