Spring源码学习之: 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
分类:
IT文章
•
2023-11-20 20:52:42
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种:
第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
第二种是:通过 在xml中定义init-method 和 destory-method方法
第三种是: 通过bean实现InitializingBean和 DisposableBean接口
下面演示通过 @PostConstruct 和 @PreDestory
1:定义相关的实现类:
1 package com.myapp.core.annotation.init;
2
3 import javax.annotation.PostConstruct;
4 import javax.annotation.PreDestroy;
5
6 public class PersonService {
7
8 private String message;
9
10 public String getMessage() {
11 return message;
12 }
13
14 public void setMessage(String message) {
15 this.message = message;
16 }
17
18 @PostConstruct
19 public void init(){
20 System.out.println("I'm init method using @PostConstrut...."+message);
21 }
22
23 @PreDestroy
24 public void dostory(){
25 System.out.println("I'm destory method using @PreDestroy....."+message);
26 }
27
28 }
View Code
2:定义相关的配置文件:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
7 http://www.springframework.org/schema/context
8 http://www.springframework.org/schema/context/spring-context-3.1.xsd">
9
10 <!-- <context:component-scan base-package="com.myapp.core.jsr330"/> -->
11
12 <context:annotation-config />
13
14 <bean id="personService" class="com.myapp.core.annotation.init.PersonService">
15 <property name="message" value="123"></property>
16 </bean>
17
18 </beans>
View Code
其中<context:annotation-config />告诉spring 容器采用注解配置:扫描注解配置;
测试类:
1 package com.myapp.core.annotation.init;
2
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.support.ClassPathXmlApplicationContext;
5
6 public class MainTest {
7
8 public static void main(String[] args) {
9
10 ApplicationContext context = new ClassPathXmlApplicationContext("resource/annotation.xml");
11
12 PersonService personService = (PersonService)context.getBean("personService");
13
14 personService.dostory();
15 }
16
17 }
View Code
测试结果:
I'm init method using @PostConstrut....123
I'm destory method using @PreDestroy.....123
其中也可以通过申明加载org.springframework.context.annotation.CommonAnnotationBeanPostProcessor
类来告诉Spring容器采用的 常用 注解配置的方式:
只需要修改配置文件为:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
7 http://www.springframework.org/schema/context
8 http://www.springframework.org/schema/context/spring-context-3.1.xsd">
9
10 <!-- <context:component-scan base-package="com.myapp.core.jsr330"/> -->
11
12 <!-- <context:annotation-config /> -->
13
14
15 <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
16 <bean id="personService" class="com.myapp.core.annotation.init.PersonService">
17 <property name="message" value="123"></property>
18 </bean>
19
20
21
22 </beans>
View Code