`

Spring Bean相关的接口、aware接口、FactoryBean

 
阅读更多
1、
package spring.beansandcontext;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

//如果被装配的Bean实现了相应的接口,就可以在Bean中获得相应的信息。,或者进行某些操作。
public class HelloServiceImpl implements HelloService,
//以下同时为接口的调用的顺序
BeanNameAware,//获得Bean名,也就是<Bean>标签的id属性值。
BeanClassLoaderAware,//获得装载过程中的ClassLoader对象。
BeanFactoryAware,//获得BeanFactory对象
ApplicationContextAware,//获得ApplicationContext对象

InitializingBean, //在Bean的所有属性设置完后,并且在调用完上面接口的方法后,调用此接口的afterPropertiesSet方法
DisposableBean //当销毁Bean时,调用此接口的destroy方法
{
	private String greeting;

	public String getGreeting() {
		// TODO Auto-generated method stub
		return "hello " + greeting;
	}

	// 以下同时为方法的调用的顺序
	public void setGreeting(String greeting) {
		this.greeting = greeting;
		System.out.println("setGreeting 设置greeting属性值");
	}

	public void setBeanName(String name) {
		System.out.println("BeanNameAware 接口方法  获得Bean名,也就是<Bean>标签的id属性值:" + name);
	}

	public void setBeanClassLoader(ClassLoader arg0) {
		System.out.println("BeanClassLoaderAware接口方法 获得装载过程中的ClassLoader对象:" + arg0);
	}

	public void setBeanFactory(BeanFactory arg0) throws BeansException {
		System.out.println("BeanFactoryAware接口方法 获得BeanFactory对象:" + arg0);
	}

	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		System.out.println("ApplicationContextAware接口方法 获得ApplicationContext对象:" + applicationContext);
	}

	public void afterPropertiesSet() throws Exception {
		System.out.println("InitializingBean接口方法 afterPropertiesSet");

	}
	public void initMethod() {
		System.out.println("<bean>标签的init-Method属性指定的方法,此方法在afterPropertiesSet()之后调用");
	}

	public void destroy() throws Exception {
		System.out.println("DisposableBean 接口方法 destroy");
	}

	public void destroyMethod() {
		System.out.println("<bean>标签的destroy-Method属性指定的方法,此方法在destroy()之后调用");
	}
}



2、Spring的InitializingBean和init-method


Spring的InitializingBean和init-method
Spring在设置完一个bean所有的属性后,会检查bean是否实现了InitializingBean接口,如果实现就调用bean的afterPropertiesSet方法。另外,如果bean是单例的,则afterPropertiesSet方法只会被调用一次;否则每次创建bean时afterPropertiesSet方法都会被重新调用.
Spring虽然可以通过InitializingBean完成一个bean初始化后对这个bean的回调,但是这种方式要求bean实现 InitializingBean接口。一但bean实现了InitializingBean接口,那么这个bean的代码就和Spring耦合到一起了。通常情况下不建议直接实现InitializingBean,而是用Spring提供的init-method的功能来执行一个bean 子定义的初始化方法,这可以在一个bean的配置文件中通过init-method声明:
<bean id="testBean" class="TestClass" init-method="initialize"/>

spring要求这个init-method方法是一个无参数的方法
如果一个bean同时实现了这两种方式的初始化配置,则spring会先调用afterPropertiesSet方法,然后通过反射调用init-method,任何一个方法出错都会导致spring创建bean失败.如果afterPropertiesSet方法调用失败,也不会再继续执行init-mehtod方法.


init-method属性用于指定自定义初始化方法

---------------------------------

引用配置文件的值
<!-- cache.properties中定义memcache.cache_prefix=sns\:2\: -->
<bean id="globalCacheManager" class="com.xiaonei.wap.framework.cache.GlobalCacheManager">
<property name="memCacheManager" ref="memCacheManger" />
<property name="cachePrefix" value="${memcache.cache_prefix}" />
</bean>

spring提供了很多*aware接口,比较常用的就是BeanFactoryAware,ApplicationContextAware,BeanNameAware
实现这些接口的Bean则能获得相应的BeanFactory,ApplicationContext实例,从而能直接获得容器信息。

3、FactoryBean接口作用就是封装自己定制的实例化逻辑(例如你想用工厂模式来实例化,或者Class.getInstance()),然后让spring统一管理。
http://fuhuijun.iteye.com/blog/1260609
http://readwall.blog.163.com/blog/static/10127132201042751036331
FactoryBean 用于在 spring 容器中创建其他的 Bean, 我们平时用得最多的 JndiObjectFactoryBean, hibernate 的 LocalSessionFactoryBean 都是 FactoryBean 的具体实现, 既然如此, 读取动态配置就变得易如反掌了, 假如我们要实现动态读取数据库配置的功能, 拿使用率最高的 BasicDatasource 为例, 简单的实现一个 BasicDatasource FactoryBean 如下即可

  代码

public class BasicDataSourceFactoryBean implements FactoryBean {
 public Object getObject() throws Exception {
  BasicDataSource dataSource = new BasicDataSource();
  // 读取外部配置, 设置到 dataSource 中 ...
  return dataSource;
 }

 public Class getObjectType() {
  return BasicDataSource.class;
 }

 public boolean isSingleton() {
  return true;
 }
}

然后在 spring 中如此声明

<bean id="dataSource" class="BasicDataSourceFactoryBean ">
... 你的配置来源
</bean>
4、BeanPostProcessor,BeanFactoryPostProcessor接口都是容器扩展点,容许spring在bean初始化或者销毁的时候回调,回调顺序可以用order来指定,前提是必须执行Ordered接口。
分享到:
评论

相关推荐

    spring-aware接口实现与bean作用域(spring多容器层面)

    在Spring框架中,`Spring-Aware`接口是一个重要的概念,它允许我们与Spring的应用上下文(ApplicationContext)进行交互,从而获取或操作由Spring管理的Bean。`ApplicationContextAware`是其中的一个典型接口,当...

    Spring Bean生命周期.pdf

    这些接口允许Bean获取容器的相关信息,如Bean的名称、类加载器、Bean工厂等。 - InitializingBean:对应初始化阶段,它提供了afterPropertiesSet方法供开发者实现Bean初始化逻辑。 - DisposableBean:对应销毁阶段...

    Spring特性——Aware感知特性

    在Spring框架中,Aware接口系列是其核心特性之一,它为Spring容器提供了向bean注入上下文信息的能力。这些接口让bean能够感知到Spring容器的存在,从而获取必要的服务或配置信息。下面我们将深入探讨Spring的Aware...

    Spring实现Aware接口自定义获取bean的两种方式

    Spring Aware接口自定义获取bean的两种方式 Aware接口是Spring框架中的一种机制,通过实现Aware接口,可以获取Spring容器中的bean对象。在Spring编程中,经常需要根据bean的名称来获取相应的bean对象,这时候,...

    Spring中关于Bean的管理的课件

    10. **Aware接口**:Spring提供了一系列的Aware接口,如BeanNameAware、BeanFactoryAware和ApplicationContextAware,这些接口使得Bean可以在运行时获取自身的一些信息,例如Bean的名字、所处的Bean工厂或...

    Spring Aware标记接口使用案例解析

    Spring Aware 标记接口是 Spring 框架中的一种机制,用于让 Bean 对象感知 Spring 容器的存在,以便在 Bean 对象中使用 Spring 容器提供的功能。Aware 接口是一个标记接口,表示对 XXX 可以感知通俗点解释就是:如果...

    spring入门 aware接口实现

    通过aware接口,可以对spring相应资源(可能包含相关核心资源)进行操作(一定要慎重) 首先创建一个类,实现ApplicationContextAware接口 , 该借口需要实现 setApplicationContext方法,该方法的参数由容器传递...

    详解Spring中Bean的生命周期和作用域及实现方式

    6. 实现 Aware 接口:在这个阶段,Bean已经实例化,并且已经实现了Aware接口。 7. Initialize:在这个阶段,Bean已经实例化,并且已经进行了初始化。 8. 使用Bean:在这个阶段,Bean已经实例化,并且已经可以使用。 ...

    Spring源码流程图

    下面我们将深入探讨Spring源码流程图,了解核心组件、Bean定义信息、Bean工厂、Bean生命周期和Aware接口的作用。 核心组件解析 在Spring框架中,核心组件包括BeanFactory、BeanDefinitionReader、...

    Spring bean生命周期配置过程解析

    然后,Spring会检查Bean是否实现了特定的`Aware`接口,如`BeanNameAware`、`BeanFactoryAware`和`ApplicationContextAware`。这些接口提供了让Bean获取自身名称、Bean工厂或应用上下文的能力。`invokeAwareMethods()...

    Spring源码分析.docx

    在 Spring 框架中,Bean 对象的创建过程是一个复杂的过程,涉及到多个步骤和接口。下面将对 Spring 源码中 Bean 对象的创建过程进行分析和解释。 1. 创建工厂,到达 BeanDefinition 步骤 在 Spring 框架中,Bean ...

    开源框架面试专题及答案.pdf

    同样的,当一个 bean 不在被调用时需要进行相关的析构操 作,并从 bean 容器中移除。 &gt; Spring bean factory 负责管理在 spring 容器中被创建的 bean 的生命周期。Bean 的生命 周期由两组回调(call back)方法组成...

    Spring官方文档之核心篇

    - **Aware接口**:通过实现特定的Aware接口,Bean可以获得Spring容器中的资源和信息。 - **自定义属性**:开发者可以定义自己的Aware接口来实现更复杂的功能。 ### 总结 Spring官方文档的核心篇为开发者提供了关于...

    Spring5.0中文开发手册

    - 这些接口使bean能够获取有关自身的信息,如容器上下文和名称。 - **3.6.3 Other Aware interfaces** - 其他Aware接口允许bean获取更多的上下文信息。 - **3.7 Spring Bean的继承** - 如何在一个bean上继承另...

    Spring-quartz.zip

    本项目结合两者,展示了如何在Spring中使用静态任务和动态任务,以及如何利用Spring的Aware接口和FactoryBean的概念。 首先,让我们深入理解Spring如何管理静态任务。在Spring中,静态任务通常指的是那些在应用启动...

    spring学习源码笔记

    另一个相关接口`BeanFactoryPostProcessor`则允许在bean实例化之前对`BeanDefinition`进行修改。 在Spring容器中,系统属性可以通过`Environment`接口获取,通常会预先加载到`StandardEnvironment`对象中。`...

    spring相关面试问题.docx

    3. **Aware 接口处理**:Spring 会检查 Bean 是否实现了特定的 xxxAware 接口,例如 BeanNameAware、BeanFactoryAware 和 ApplicationContextAware,然后注入相应的上下文信息。 4. **BeanPostProcessor**:如果 ...

    Spring Reference - Core Technologies.pdf

    Spring提供了多个Aware接口,如ResourceLoaderAware、BeanClassLoaderAware等,用于让Bean感知到Spring容器的各种资源。 1.7 Bean定义继承 Bean定义可以继承自父定义,使得子定义可以继承父定义的配置属性。 1.8 ...

    Spring Reference Core Technologies

    Spring还提供了一系列其他Aware接口,可以帮助Bean更好地融入Spring环境。 #### 六、Bean定义继承 通过继承Bean定义,可以复用现有的Bean配置,减少冗余代码。这种方式在配置复杂的应用时非常有用。 总结起来,...

Global site tag (gtag.js) - Google Analytics