`
huangjinjin520
  • 浏览: 70819 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spring核心接口之InitializingBean

阅读更多
一、InitializingBean接口说明
InitializingBean接口为bean提供了属性初始化后的处理方法,它只包括afterPropertiesSet方法,凡是继承该接口的类,在bean的属性初始化后都会执行该方法。

package org.springframework.beans.factory;

/**
* Interface to be implemented by beans that need to react once all their
* properties have been set by a BeanFactory: for example, to perform custom
* initialization, or merely to check that all mandatory properties have been set.
*
* <p>An alternative to implementing InitializingBean is specifying a custom
* init-method, for example in an XML bean definition.
* For a list of all bean lifecycle methods, see the BeanFactory javadocs.
*
* @author Rod Johnson
* @see BeanNameAware
* @see BeanFactoryAware
* @see BeanFactory
* @see org.springframework.beans.factory.support.RootBeanDefinition#getInitMethodName
* @see org.springframework.context.ApplicationContextAware
*/
public interface InitializingBean {

/**
* Invoked by a BeanFactory after it has set all bean properties supplied
* (and satisfied BeanFactoryAware and ApplicationContextAware).
* <p>This method allows the bean instance to perform initialization only
* possible when all bean properties have been set and to throw an
* exception in the event of misconfiguration.
* @throws Exception in the event of misconfiguration (such
* as failure to set an essential property) or if initialization fails.
*/
void afterPropertiesSet() throws Exception;

}

从方法名afterPropertiesSet也可以清楚的理解该方法是在属性设置后才调用的。

二、源码分析接口应用
通过查看spring的加载bean的源码类(AbstractAutowireCapableBeanFactory)可以看到
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
throws Throwable {
//判断该bean是否实现了实现了InitializingBean接口,如果实现了InitializingBean接口,则调用bean的afterPropertiesSet方法
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger.isDebugEnabled()) {
logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
}
if (System.getSecurityManager() != null) {
try {
AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
public Object run() throws Exception {
//调用afterPropertiesSet
((InitializingBean) bean).afterPropertiesSet();
return null;
}
}, getAccessControlContext());
}
catch (PrivilegedActionException pae) {
throw pae.getException();
}
}
else {
//调用afterPropertiesSet
((InitializingBean) bean).afterPropertiesSet();
}
}

if (mbd != null) { //判断是否指定了init-method方法,如果指定了init-method方法,则再调用制定的init-method
String initMethodName = mbd.getInitMethodName();
if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
!mbd.isExternallyManagedInitMethod(initMethodName)) {
//反射调用init-method方法
invokeCustomInitMethod(beanName, bean, mbd);
}
}
}
分析代码可以了解:
1:spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用
2:实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率相对来说要高点。但是init-method方式消除了对spring的依赖
3:如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。

三、接口应用
  InitializingBean接口在spring框架中本身就很多应用,这就不多说了。我们在实际应用中如何使用该接口呢?

1、使用InitializingBean接口处理一个配置文件:
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;

import org.springframework.beans.factory.InitializingBean;

public class ConfigBean implements InitializingBean{

//微信公众号配置文件
private String configFile;

private String appid;

private String appsecret;

public String getConfigFile() {
return configFile;
}

public void setConfigFile(String configFile) {
this.configFile = configFile;
}

public void afterPropertiesSet() throws Exception {
if(configFile!=null){
File cf = new File(configFile);
if(cf.exists()){
Properties pro = new Properties();
pro.load(new FileInputStream(cf));
appid = pro.getProperty("wechat.appid");
appsecret = pro.getProperty("wechat.appsecret");
}
}
System.out.println(appid);
System.out.println(appsecret);
}
}
2、配置
spring配置文件:
<bean id="configBean" class="com.ConfigBean">
<property name="configFile" value="d:/wechat.properties"></property>
</bean>
wechat.properties配置文件
wechat.appid=wxappid
wechat.appsecret=wxappsecret
3、测试
     public static void main(String[] args) throws Exception {
        String config = Test.class.getPackage().getName().replace('.', '/') + "/bean.xml";
           ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
           context.start();
        }


跟多技术文章


  • 大小: 39.9 KB
分享到:
评论

相关推荐

    Spring官方文档之核心篇

    Spring官方文档中的核心篇是深入学习和掌握Spring框架不可或缺的资料,其中包含了关于Spring核心特性的详细介绍和示例。接下来,我们将详细介绍文档中提到的核心知识点。 ### Spring IoC 容器和Bean #### 容器概述...

    自定义Spring核心功能项目源码

    这个自定义Spring核心功能项目源码提供了一次深入理解并实践Spring框架核心特性的机会。让我们逐步解析这个项目的各个关键知识点。 首先,我们要讨论的是**IOC(Inversion of Control)**,即控制反转。在传统的...

    Spring核心学习IOC部分

    在Spring框架中,IOC(Inversion of Control,控制反转)是其核心概念之一,它改变了传统应用程序中的对象创建和管理方式。本学习资料主要聚焦于Spring的IOC容器,特别是从最基本的BeanFactory开始,逐步深入理解...

    Spring框架核心源代码的分析及其感受-6

    从初始化、正常使用到销毁,Spring提供了一系列的回调方法,如`init-method`、`destroy-method`,以及`InitializingBean`和`DisposableBean`接口。通过这些机制,开发者可以在特定的生命周期阶段执行自定义逻辑。...

    Spring中与Bean相关的接口

    在Spring框架中,Bean是核心概念,它代表了应用程序中的对象。这些对象通过Spring的依赖注入(Dependency Injection,DI)机制来管理和协调。本篇文章将深入探讨Spring中与Bean相关的接口,以及它们如何帮助我们更好...

    Spring之核心容器bean

    **Spring核心容器** Spring的核心容器是整个框架的基础,它负责创建、配置和管理bean。主要有两个关键组件:BeanFactory和ApplicationContext。BeanFactory是Spring的基础容器,它提供bean的实例化、作用域、依赖...

    1.Spring核心功能梳理,配套测试代码

    Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(DI)和面向切面编程(AOP)功能而闻名。让我们深入探讨一下标题和描述中提及的几个...在实际项目中,熟练运用Spring核心功能可以极大地提升开发效率。

    spring工程需要的四个核心jar包之beans包

    "spring-beans"包是Spring的核心组件之一,主要涉及Bean工厂和Bean定义的概念。Bean工厂是Spring用来管理和控制对象生命周期的组件,它负责根据Bean定义来创建、初始化、配置和管理Bean。Bean定义则包含了关于一个...

    Spring源码分析.docx

    在 BeanPostProcessor 的前置处理完成后,Spring 框架会执行 InitializingBean 接口。InitializingBean 是一种特殊的接口,用于在 Bean 对象创建完成后对其进行初始化。例如,可以使用 InitializingBean 来执行 Bean...

    spring-spring-framework-4.3.24.RELEASE.zip

    在源码中,`org.springframework.beans.factory.config`包包含了许多关于生命周期的接口和类,如InitializingBean、DisposableBean以及BeanFactoryPostProcessor等。 6. **事件驱动模型**:Spring提供了基于...

    spring源码中英文注释

    1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一,允许组件之间解耦。DI通过容器管理组件的依赖关系,而不是由组件自身负责查找和管理。在源码中,你可以看到`ApplicationContext`如何创建bean...

    spring 源码四

    Spring框架作为Java领域最流行的开源框架之一,它的设计思想和实现方式一直是开发者深入学习的重点。本文将围绕“Spring源码”这一主题,详细探讨Spring的核心概念、设计理念以及关键组件的源码实现,帮助你更深入地...

    Spring2(源码)

    Spring框架是Java开发中最常用的轻量级开源框架之一,它以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)能力而著名。源码分析是理解Spring工作原理的关键,能...

    模仿实现spring经典绝对值得看

    Spring提供接口和注解来定制Bean的生命周期行为,例如`InitializingBean`和`DisposableBean`接口,以及`@PostConstruct`和`@PreDestroy`注解。反射使得Spring可以无侵入地调用这些生命周期方法。 3. **依赖注入(DI...

    Spring学习笔记(精华全记录)

    - **IoC (控制反转)**:这是Spring的核心特性之一。控制反转意味着将对象的创建和依赖管理从应用代码中移除,交由Spring容器负责。这样做的好处是可以减少代码耦合度,提高组件的可测试性和可重用性。 - **DI ...

    Spring开发jar包

    - 依赖注入是Spring框架的核心特性之一,它允许我们将对象之间的依赖关系解耦,使得代码更加灵活和易于测试。 - 在Spring中,可以通过构造器注入、setter注入或接口注入三种方式来实现依赖注入。 - 通过XML配置...

    Spring Bean生命周期.pdf

    其中,Spring Bean生命周期的管理是Spring框架的核心功能之一,它涉及Spring容器如何创建、配置以及销毁Bean的整个过程。理解Spring Bean的生命周期对于开发高效和可维护的Java应用至关重要。 Spring Bean生命周期...

    Spring三种注入方式(三)

    总结起来,Spring的依赖注入机制是其核心特性之一,它简化了对象间的依赖关系管理,提高了代码的可读性和可维护性。通过理解并熟练运用构造器注入、设值注入和接口注入,开发者可以更好地利用Spring框架进行企业级...

    Spring源码学习八:常用的扩展接口详解1

    在Spring框架中,为了满足不同开发需求,...这些接口是Spring高度可扩展性的核心,使得Spring能适应各种不同的企业级应用需求。在实际开发中,可以根据需要选择合适的接口进行扩展,以实现特定的功能或优化系统性能。

Global site tag (gtag.js) - Google Analytics