使用@Configurable域对象属性根据数据分配特定行为

时间:2016-07-26 09:44:05

标签: spring jpa spring-aop

我有一个看起来像这样的域对象。 我需要使用从数据库中获取的数据("类型"在本例中)来获取和注入正确类型的服务。

我得到此输出,这意味着在调用期间未设置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);
    }


}

1 个答案:

答案 0 :(得分:3)

可构造的bean在构建之后或之前由Spring初始化,具体取决于@Configurable.preConstruction属性的值。从数据库加载实体时,这意味着以下事件序列:

  1. JPA提供程序通过反射
  2. 调用它的构造函数来创建实体
  3. 当构造函数执行时,spring-aspects'AnnotationBeanConfigurerAspect拦截构造函数执行,并且在构造函数执行之前(或之后),Spring将通过执行您在其中的任何bean配置来配置这个新创建的对象弹簧环境,包括属性的自动装配。
  4. JPA提供程序将接收已由Spring配置的此对象,并将开始使用从数据库获取的数据填充其持久属性。
  5. (可选)如果设置@PostLoad方法,JPA提供程序将调用这些方法,以便在实体完全填充数据库中的数据后,您的实体有机会继续工作。
  6. 从我看到你要做的事情来看,第四步是你应该放置你的自定义行为逻辑,假设其他一切都正常工作。