欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【PostConstruct】(一)概念

程序员文章站 2022-05-25 08:03:26
...
The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any initialization. This method MUST be invoked before the class is put into service. This annotation MUST be supported on all classes that support dependency injection. The method annotated with PostConstruct MUST be invoked even if the class does not request any resources to be injected. Only one method can be annotated with this annotation. The method on which the PostConstruct annotation is applied MUST fulfill all of the following criteria:
The method MUST NOT have any parameters except in the case of interceptors in which case it takes an InvocationContext object as defined by the Interceptors specification.
The method defined on an interceptor class MUST HAVE one of the following signatures:
void <METHOD>(InvocationContext)


Object <METHOD>(InvocationContext) throws Exception


Note: A PostConstruct interceptor method must not throw application exceptions, but it may be declared to throw checked exceptions including the java.lang.Exception if the same interceptor method interposes on business or timeout methods in addition to lifecycle events. If a PostConstruct interceptor method returns a value, it is ignored by the container.


The method defined on a non-interceptor class MUST HAVE the following signature:
void <METHOD>()


The method on which PostConstruct is applied MAY be public, protected, package private or private.
The method MUST NOT be static except for the application client.
The method MAY be final.

If the method throws an unchecked exception the class MUST NOT be put into service except in the case of EJBs where the EJB can handle exceptions and even recover from them.


Code piece 1:

package com.javabeat.jsrannotations;

 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.annotation.Resource;

 public class Product {
     private Integer price;
     private String name;

     @Resource(name = "typeB")
     private Type type;

     public Integer getPrice() {
         return price;
     }

     public void setPrice(Integer price) {
         this.price = price;
     }

     public Type getType() {
         return type;
     }

     public String getName() {
         return name;
     }

     public void setName(String name) {
         this.name = name;
     }

     @PostConstruct
     public void init() {
         System.out.println("In init block of Product");
     }

     @PreDestroy
     public void destroy() {
         System.out.println("In destroy block of Product");
     }
}

Code piece 2:

public class MainApp {
     public static void main(String[] args) {
         AbstractApplicationContext context = new ClassPathXmlApplicationContext(
                 "BeansJSRAnnotation.xml");

         Product product = (Product) context.getBean("product");

         System.out.println("Product Name : " + product.getName());
         System.out.println("Price : " + product.getPrice());

         Type productType = product.getType();

         System.out.println(product.getName() + " is of type:"
                 + productType.getProductType());
         context.registerShutdownHook();
     }
}

Result:

    In init block of Product
    Product Name : ProductA
    Price : 400
    ProductA is of type:Import
    In destroy block of Product    


Summary:

    After the bean was loaded, the method decorated by @PostConstruct was init.

相关标签: PostConstruct