`
liyixing1
  • 浏览: 971531 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

定制bean特性(类似与bean监听)以及对应的注解@PostConstruct and @PreDestroy annotations.

阅读更多
Spring提供了几个标志接口(marker interface),这些接口用来改变容器中bean的行为;它们包括InitializingBean和DisposableBean。实现这两个接口的bean在初始化和析构时容器会调用前者的afterPropertiesSet()方法,以及后者的destroy()方法。

Spring在内部使用BeanPostProcessor实现来处理它能找到的任何标志接口并调用相应的方法。如果你需要自定义特性或者生命周期行为,你可以实现自己的 BeanPostProcessor。

实现org.springframework.beans.factory.InitializingBean接口允许容器在设置好bean的所有必要属性后,执行初始化事宜。InitializingBean接口仅指定了一个方法:

void afterPropertiesSet() throws Exception;
通常,要避免使用InitializingBean接口并且不鼓励使用该接口,因为这样会将代码和Spring耦合起来,有一个可选的方案是,可以在Bean定义中指定一个普通的初始化方法,然后在XML配置文件中通过指定init-method属性来完成。如下面的定义所示:

<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>
public class ExampleBean {
   
    public void init() {
        // do some initialization work
    }
}
...效果与下面完全一样...

<bean id="exampleInitBean" class="examples.ExampleBean "/>
public class ExampleBean implements InitializingBean {
   
    public void afterPropertiesSet() {
        // do some initialization work
    }
}

析构回调
实现org.springframework.beans.factory.DisposableBean接口的bean允许在容器销毁该bean的时候获得一次回调。DisposableBean接口也只规定了一个方法:

void destroy() throws Exception;
通常,要避免使用DisposableBean标志接口而且不鼓励使用该接口,因为这样会将代码与Spring耦合在一起,有一个可选的方案是,在bean定义中指定一个普通的析构方法,然后在XML配置文件中通过指定destroy-method属性来完成。如下面的定义所示:

<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>
public class ExampleBean {

    public void cleanup() {
        // do some destruction work (like releasing pooled connections)
    }
}

..效果与下面完全一样...

<bean id="exampleInitBean" class="examples.ExampleBean "/>
public class ExampleBean implements DisposableBean {

    public void destroy() {
        // do some destruction work (like releasing pooled connections)
    }
}

缺省的初始化和析构方法

如果有人没有采用Spring所指定的InitializingBean和DisposableBean回调接口来编写初始化和析构方法回调,会发现自己正在编写的方法,其名称莫过于init(), initialize(),dispose()等等。这种生命周期回调方法的名称最好在一个项目范围内标准化,这样团队中的开发人员就可以使用同样的方法名称,并且确保了某种程度的一致性。

Spring容器通过配置可以实现对每个 bean初始化时的查找和销毁时的回调调用。这也就是说,一个应用的开发者可以借助于初始化的回调方法init() 轻松的写一个类(不必想XML配置文件那样为每个bean都配置一个'init-method="init"'属性)。Spring IoC容器在创建bean的时候将调用这个方法 (这和之前描述的标准生命周期回调一致)。

为了完全弄清如何使用该特性,让我们看一个例子。出于示范的目的,假设一个项目的编码规范中约定所有的初始化回调方法都被命名为init()而析构回调方法被命名为destroy()。遵循此规则写成的类如下所示:

public class DefaultBlogService implements BlogService {

    private BlogDao blogDao;

    public void setBlogDao(BlogDao blogDao) {
        this.blogDao = blogDao;
    }

    // this is (unsurprisingly) the initialization callback method
    public void init() {
        if (this.blogDao == null) {
            throw new IllegalStateException("The [blogDao] property must be set.");
        }
    }
}
<beans default-init-method="init">

    <bean id="blogService" class="com.foo.DefaultBlogService">
        <property name="blogDao" ref="blogDao" />
    </bean>

</beans>
注意在顶级的<beans/>元素中的'default-init-method'属性。这个属性的含义是Spring IoC容器在bean创建和装配的时候会将'init'方法作为实例化回调方法。如果类有这个方法,则会在适当的时候执行。

销毁回调方法配置是相同的 (XML配置),在顶级的<beans/>元素中使用 'default-destroy-method' 属性。

使用这个功能可以把你从位每个bean指定初始化和销毁回调的繁杂工作中解救出来。为了一致性,应该强制性的为初始化和销毁回调方法采用一致的命名规则。

当已经存在的类的初始化方法的命名规则与惯例有差异的时候,你应该始终使用<bean/>元素中的'init-method'和'destroy-method'属性(在XML配置中)来覆盖默认的方式。

最后,请注意Spring容器保证在bean的所有依赖都满足后立即执行配置的初始化回调。这意味着初始化回调在原生bean上调用,这也意味着这个时候任何诸如AOP拦截器之类的将不能被应用。一个目标bean是首先完全创建,然后才应用诸如AOP代理等拦截器链。注意,如果目标bean和代理是分开定义了,你的代码甚至可以绕开代理直接和原生bean通信。因此,在初始化方法上使用拦截器将产生未知的结果,因为这将目标bean和它的代理/拦截器的生命周期绑定并且留下了和初始bean直接通信这样奇怪的方式。

Spring2.5中有三种方式可以控制bean的生命周期行为: InitializingBean 和 DisposableBean 回调接口;自定义init() 和 destroy() 方法; @PostConstruct 和@PreDestroy annotations.
public class CachingMovieLister {

    @PostConstruct
    public void populateMovieCache() {
        // populates the movie cache upon initialization...
    }
   
    @PreDestroy
    public void clearMovieCache() {
        // clears the movie cache upon destruction...
    }
}

当组合不同的生命周期机制时 - 例如,类层次中使用了不同的生命周期机制 - 开发者必须注意这些机制的应用顺序,下面是初始化方法中的顺序:

@PostConstruct元注释

InitializingBean的afterPropertiesSet()定义

自定义init()方法配置

析构方法调用顺序是相同的:

@PreDestroy元注释

DisposableBean的destroy()定义

自定义destroy()方法
分享到:
评论

相关推荐

    java @PostConstruct和@PreConstruct注解

    Java @PostConstruct 和 @PreConstruct 注解详解 Java 中的 @PostConstruct 和 @PreConstruct 注解是从 Java EE5 规范开始引入的,它们是用来修饰 Servlet 生命周期的两个重要的注解。下面将详细介绍这两个注解的...

    @PostConstruct 和 @PreDestroy 使用

    在Java世界中,`@PostConstruct` 和 `@PreDestroy` 是两个非常重要的注解,它们主要用于管理组件的生命周期,特别是在使用Spring框架或者Java EE应用中。这两个注解是JSR 250规范的一部分,提供了对bean初始化和销毁...

    @PostConstruct注解用来获取springbean对象.txt

    获取springbean对象

    Spring实战之使用@POSTConstruct和@PreDestroy定制生命周期行为操作示例

    `@POSTConstruct` 和 `@PreDestroy` 注解允许我们在Bean初始化完成后执行特定的操作,并在Bean销毁之前执行清理工作。本示例详细介绍了如何在Spring中使用这两个注解来定制Bean的生命周期行为。 首先,让我们了解...

    Spring定时任务中@PostConstruct被多次执行异常的分析与解决

    使用IDE的调试工具,跟踪bean的创建过程,观察`@PostConstruct`注解的方法何时以及为何被调用,这将有助于找到问题的根源。通过以上分析和解决方案,你应该能够解决`@PostConstruct`被多次执行的问题,确保Spring...

    Spring注解@Component、@Repository、@Service、@Controller区别.doc

    在这里,我们使用 @PostConstruct 和 @PreDestroy 注解来指定组件的初始化和销毁方法,这样可以在组件的生命周期中执行特定的操作。 @Component、@Repository、@Service、@Controller 等注解是 Spring 框架中常用的...

    javax.annotation.jar文件

    spring 注解初始化,初始化开始@postconstruct 对象销毁@predestroy javax.annotation.jar文件

    14、加载spring启动首先进入的类方法注解1

    本文将详细讨论在Spring中使用`@PostConstruct`和`@PreDestroy`注解以及`InitializingBean`和`DisposableBean`接口来控制Bean的生命周期。 1. **使用@PostConstruct和@PreDestroy注解** `@PostConstruct`注解标记...

    SpringBoot @PostConstruct原理用法解析

    @PostConstruct 注解是 Spring 框架的一个重要组件,主要用于在 Bean 初始化之前执行某些操作。今天,我们将深入探讨 @PostConstruct 的用法和原理,并通过示例代码来演示其应用场景。 @PostConstruct 的原理 -----...

    spring注解注入示例详解.pdf

    Spring提供了多种注解来帮助开发者实现依赖注入,其中包括@Autowired、@Qualifier、@Resource以及@PostConstruct等。下面将详细介绍这些注解的使用方法和区别。 1. @Autowired注解 @Autowired是Spring提供的注解,...

    Spring bean初始化及销毁你必须要掌握的回调方法.docx

    类似于@PostConstruct,@PreDestroy是Java的JSR-250规范的一部分,用于标记一个方法,在Bean即将被销毁之前调用。 2. **DisposableBean接口** 如果Bean实现了DisposableBean接口,那么它必须重写`destroy()`方法...

    spring3注解详细

    本文将详细介绍几个关键的注解,包括 @Autowired、@Qualifier、@Resource 和 @PostConstruct,以及它们在实际开发中的应用。 ## 1. @Autowired 注解 @Autowired 是 Spring 提供的一种自动装配机制,它可以根据类型...

    Spring Bean的初始化和销毁实例详解

    在本文中,我们详细讲解了Spring Bean的初始化和销毁,包括使用@Bean的initMethod和destroyMethod、JSR-250的@PostConstruct和@PreDestroy注解等多种方式来控制Bean的生命周期。在实际开发中,我们可以根据需要选择...

    day38 16-Spring的Bean的装配:注解的方式

    6. **生命周期方法**:使用`@PostConstruct`和`@PreDestroy`注解来定义Bean初始化和销毁时执行的方法。 ```java @Service public class ServiceWithLifecycle { @PostConstruct public void init() { // 初始化...

    jsf 的Annotations配置

    3. `@PostConstruct`和`@PreDestroy`:这两个注解分别用于标记初始化和销毁Bean的方法。`@PostConstruct`的方法在Bean创建后立即调用,`@PreDestroy`的方法在Bean销毁前调用。 4. `@Inject`:这个注解来自JSR 330...

    javax.annotation-3.1.2.2-sources.jar.zip

    2. @PreDestroy:与@PostConstruct相对,@PreDestroy注解标记的方法会在对象销毁前被调用,提供了一个清理资源或执行其他必要操作的机会。 3. @Resource:此注解用于注入依赖,它可以自动查找匹配的bean并将其注入...

    浅尝Spring注解开发_Bean生命周期及执行过程.doc

       3.@PostConstruct 和 @PreDestroy 注解 Spring 也支持在方法上使用这些注解来标识初始化和销毁方法。`@PostConstruct` 标记的方法会在所有依赖注入完成后调用,而 `@PreDestroy` 标记的方法会在容器关闭前...

    spring常用注解

    11. @PostConstruct和@PreDestroy:分别表示在Bean初始化后和销毁前执行的方法。 12. @Configuration:用于标记配置类,替代传统的XML配置,结合@Bean注解创建和配置Bean。 13. @Bean:用于在@Configuration类中...

    spring注解1

    本文将详细讲解Spring中的几个关键注解:`@Autowired`、`@Qualifier`、`@Resource`以及`@PostConstruct`和`@PreDestroy`。 1. `@Autowired` `@Autowired`注解用于自动装配bean,它可以应用在字段、方法或构造器上,...

Global site tag (gtag.js) - Google Analytics