Skip to main content

Lifecycleโ€‹

Clawject allows us to attach custom actions to bean or application creation and destruction, and it is done using the @PostConstruct and @PreDestroy decorators.

@PostConstruct and @PreDestroy can be used in @Configuration, @ClawjectApplication classes and in Beans. You can decorate method or property with arrow function, also decoration target should not be static.

@PostConstruct and @PreDestroy can be used together at the same method โ€” so the method will be called twice.

Note that @PostConstruct and @PreDestroy works a little different in configuration classes and in Beans, when using in configuration classes - you can pass arguments to the method, these arguments will be treated as a dependencies, and container will inject appropriate Beans to the method, in other hand, when using in Bean - you can't pass arguments to the method, container will not inject anything to the method and will report compilation error.

@PostConstructโ€‹

Clawject calls the methods annotated with @PostConstruct only once, just after the initialization of bean or application.

@PostConstruct in Contextโ€‹

Let's use the @PostConstruct decorator in the @Configuration class:

@ClawjectApplication
class Application {
@Bean foo = 'string';

@PostConstruct
postConstruct(stringBean: string) { // <- "foo" bean will be injected here
console.log(`MyContext has been created, "stringBean" value is ${stringBean}`);
}
}

@PostConstruct in Beanโ€‹

Let's use the @PostConstruct decorator in the Bean:

class Foo {
@PostConstruct
postConstruct() {
console.log('Foo bean has been created');
}
}

Now when we register this class as a Bean in context - the postConstruct method will be called when Foo instance is created.

@PreDestroyโ€‹

Clawject calls the methods annotated with @PostConstruct only once, just before context clearing or bean removal from context.

The purpose of this method should be to release resources or perform other cleanup tasks, such as closing a database connection, before the bean gets destroyed.

@PreDestroy in Contextโ€‹

Let's use the @PreDestroy decorator in the Context:

@ClawjectApplication
class Application {
@Bean foo = 'string';

@PreDestroy
preDestroy(stringBean: string) { // <- "foo" bean will be injected here
console.log(`MyContext is going to be destroyed, "stringBean" value is ${stringBean}`);
}
}

@PreDestroy in Beanโ€‹

Let's use the @PreDestroy decorator in the Bean:

class Foo {
@PreDestroy
preDestroy() {
console.log('Foo bean is going to be destroyed');
}
}

Now when we register this class as a Bean in context - the preDestroy method will be called when Foo bean is going to be destroyed.