Spring源码学习之: 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作

关于在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

 

同样可以得到以上测试的输出结果。

 

时间: 2024-10-24 05:52:10

Spring源码学习之: 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作的相关文章

spring源码学习之:spring容器的applicationContext启动过程

 Spring 容器像一台构造精妙的机器,我们通过配置文件向机器传达控制信息,机器就能够按照设定的模式进行工作.如果我们将Spring容器比喻为一辆汽车,可以将 BeanFactory看成汽车的发动机,而ApplicationContext则是 整辆汽车,它不但包括发动机,还包括离合器.变速器以及底盘.车身.电气设备等其他组件.在ApplicationContext内,各个组件按部就班. 有条不紊地完成汽车的各项功能. ApplicationContext内部封装 了一个BeanFactory对

Spring源码学习之:你不知道的spring注入方式

前言     在Spring配置文件中使用XML文件进行配置,实际上是让Spring执行了相应的代码,例如: 使用<bean>元素,实际上是让Spring执行无参或有参构造器 使用<property>元素,实际上是让Spring执行一次setter方法     但Java程序还可能有其他类型的语句:调用getter方法.调用普通方法.访问类或对象的Field等,而Spring也为这种语句提供了对应的配置语法: 调用getter方法:使用PropertyPathFactoryBean

Spring源码学习之:spring注解@Transactional

在分析深入分析@Transactional的使用之前,我们先回顾一下事务的一些基本内容. 事务的基本概念 先来回顾一下事务的基本概念和特性.数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行.事务,就必须具备ACID特性,即原子性(Atomicity).一致性(Consistency).隔离性(Isolation)和持久性(Durability). 编程式事务与声明式事务 Spring 与Hibernate的整合实

Spring源码学习之:FactoryBean的使用

转载:http://book.51cto.com/art/201311/419081.htm ==========个人理解========================= FactoryBean和BeanFactory的关系[1]FactoryBean:是一个接口,是一个用户自定义实现类实现该接口的A类.当ioc容器初始化完成后.BeanFactory(ioc容器)调用getBean("beanname")的时候,返回的bean不是A类对应的实例,而是A类getObject()方法返

springMvc源码学习之:spring源码总结

转载自:http://www.cnblogs.com/davidwang456/p/4213652.html   spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.annotation, 支持包,提供对java 5注解处理bean样式的支持.org.springframework.beans.factory, 实现spring轻量级IoC容器的核心包.or

【spring源码学习】springMVC之映射,拦截器解析,请求数据注入解析,DispatcherServlet执行过程

[一]springMVC之url和bean映射原理和源码解析 映射基本过程 (1)springMVC配置映射,需要在xml配置文件中配置<mvc:annotation-driven >  </mvc:annotation-driven> (2)配置后,该配置将会交由org.springframework.web.servlet.config.MvcNamespaceHandler处理,该类会转交给org.springframework.web.servlet.config.Anno

【spring源码学习】spring的aop目标对象中进行自我调用,且需要实施相应的事务定义的解决方案

转载:http://www.iteye.com/topic/1122740 1.预备知识 aop概念请参考[http://www.iteye.com/topic/1122401]和[http://jinnianshilongnian.iteye.com/blog/1418596] spring的事务管理,请参考[http://jinnianshilongnian.iteye.com/blog/1441271] 使用AOP 代理后的方法调用执行流程,如图所示 也就是说我们首先调用的是AOP代理对象

【spring源码学习】spring的AOP面向切面编程的实现解析

一:Advice(通知)(1)定义在连接点做什么,为切面增强提供织入接口.在spring aop中主要描述围绕方法调用而注入的切面行为.(2)spring定义了几个时刻织入增强行为的接口  =>org.springframework.aop.BeforeAdvice   org.springframework.aop.MethodBeforeAdvice  =>org.springframework.aop.AfterAdvice   org.springframework.aop.After

【spring源码学习】spring的事务管理的源码解析

[一]spring事务管理(1)spring的事务管理,是基于aop动态代理实现的.对目标对象生成代理对象,加入事务管理的核心拦截器==>org.springframework.transaction.interceptor.TransactionInterceptor.===>spring事务管理的核心拦截器===>需要配置的数据项:事务管理机制配置属性的查找类transactionAttributeSource,事务管理的核心处理器PlatformTransactionManager