`
paladin1988
  • 浏览: 329705 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】BeanFactoryAware的使用

 
阅读更多

 

文章来源:http://cczakai.iteye.com/blog/1674776

 

使用ClassPathXmlApplicationContext 加载bean.xml文件才能将实现BeanFactoryAware接口的bean的BeanFactory注入进去。

 

 

 

springIoC容器核心为BeanFactory接口,该接口的最常用实现是XmlBeanFactory类,该类使用xml配置文件来初始化一个BeanFactory实例。

 

ApplicationContext是对BeanFactory接口的扩展,在大多数的应用中,使用ApplicationContext的优先级要高于BeanFactory,两者对比如下:

 

 

 

 

 

特性

BeanFactory

ApplicationContext

Bean 实例化/装配

Yes

Yes

自动 BeanPostProcessor 注册

No

Yes

自动 BeanFactoryPostProcessor 注册

No

Yes

便捷的 MessageSource 访问( i18n)

No

Yes

ApplicationEvent 发送

No

Yes

 

 

 

package com.cc.bsp.persistence.dao.hibernate.expand.namedql.content;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;

import com.cc.bsp.persistence.dao.hibernate.expand.namedql.builder.DynamicHibernateStatementBuilder;
import com.cc.bsp.persistence.exception.NamedQLException;
import com.cc.bsp.persistence.exception.PersistenceException;

public class NamedQLContent implements BeanFactoryAware{

private static final Logger LOGGER = LoggerFactory.getLogger(NamedQLContent.class );

private static Map<String, String> namedHQLQueries = new HashMap<String, String>();

private static Map<String, String> namedSQLQueries = new HashMap<String, String>();

private static BeanFactory beanFactory = null;

private DynamicHibernateStatementBuilder hibernateStatementBuilder = null;

private static NamedQLContent instance = null;

private NamedQLContent(){

}

public static NamedQLContent getInstance(){
if(instance ==null){
instance = (NamedQLContent) beanFactory.getBean("namedQLContent");
instance.initialize();
}
return instance;
}

private DynamicHibernateStatementBuilder getHibernateStatementBuilder() {
return hibernateStatementBuilder;
}

public void setHibernateStatementBuilder(
DynamicHibernateStatementBuilder hibernateStatementBuilder) {
this.hibernateStatementBuilder = hibernateStatementBuilder;
}


public void reload(){
try {
getHibernateStatementBuilder().init();
namedHQLQueries.clear();
namedSQLQueries.clear();
Map<String, String> tempHQL = getHibernateStatementBuilder().getNamedHQLQueries();
Map<String, String> tempSQL = getHibernateStatementBuilder().getNamedSQLQueries();
namedHQLQueries.putAll(tempHQL);
namedSQLQueries.putAll(tempSQL);
} catch (IOException e) {
e.printStackTrace();
LOGGER.error(e.getMessage());
} catch (NamedQLException e) {
e.printStackTrace();
LOGGER.error(e.getMessage());
}
}

public void initialize() {
Map<String, String> tempHQL = getHibernateStatementBuilder().getNamedHQLQueries();
Map<String, String> tempSQL = getHibernateStatementBuilder().getNamedSQLQueries();
namedHQLQueries.putAll(tempHQL);
namedSQLQueries.putAll(tempSQL);
}

public void addHQL(String sqlName, String sqlstr)
throws PersistenceException {

if (namedHQLQueries.containsKey(sqlName)) {
throw new PersistenceException("sqlName is exits");
}

namedHQLQueries.put(sqlName, sqlstr);
}

public void addSQL(String sqlName, String sqlstr)
throws PersistenceException {
if (namedSQLQueries.containsKey(sqlName)) {
throw new PersistenceException("sqlName is exits");
}
namedSQLQueries.put(sqlName, sqlstr);
}

public String getHQL(String sqlName){
return namedHQLQueries.get(sqlName);
}

public String getSQL(String sqlName){
return namedSQLQueries.get(sqlName);
}

@SuppressWarnings("static-access")
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}

}

 

 

 

<bean id="namedQLContent" class="com.cc.bsp.persistence.dao.hibernate.expand.namedql.content.NamedQLContent" scope="singleton">
		<property name="hibernateStatementBuilder" ref="hibernateStatementBuilder"></property>
</bean>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    spring运行过程中动态注册bean

    `BeanFactoryAware`接口使得Bean可以被注入`BeanFactory`,而`ApplicationListener`接口则可以让Bean监听到应用上下文的刷新事件,从而在合适的时机执行动态注册逻辑。 ```java public class BeanFactoryAwareBean ...

    springboot学习思维笔记.xmind

    BeanFactoryAware ApplicationContextAware MessageSourceAware ApplicationEventPublisherAware ResourceLoaderAware 多线程 计划任务 cron fixDelay fixRate 条件注解@Conditional ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    BeanFactoryAware 3.5.2.2. BeanNameAware 3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.1.1. 使用BeanPostProcessor的Hello World示例 3.7.1.2. ...

    SPRING中文开发参考手册

    - **BeanFactoryAware**:Bean 可以获取到创建它的 BeanFactory。 - **BeanNameAware**:Bean 可以获取到自己的名称。 - **FactoryBean**:一种特殊的 Bean,它返回另一个 Bean 的实例作为它的产品。 ##### 3.4 ...

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

    `BeanFactoryAware`接口包含`setBeanFactory(BeanFactory)`方法。实现这个接口的类可以获取到装载当前Bean的`BeanFactory`,这允许类直接访问容器和其中的其他Bean,提供了更大的灵活性。 5. **FactoryBean接口**...

    《Spring in Action》学习点滴

    - 如果一个bean实现了`BeanNameAware`、`BeanFactoryAware`或`ApplicationContextAware`接口,它可以获取关于自身或其所在环境的信息。 - 但这种方式会使bean与Spring框架耦合,因此在使用时需谨慎考虑。 #### 第...

    Spring系列面试题129道(附答案解析)

    - 如果Bean实现了BeanNameAware、BeanFactoryAware等接口,会调用相应的方法。 - 如果存在BeanPostProcessor,会调用它的postProcessBeforeInitialization方法。 - 如果Bean实现了InitializingBean接口,会调用...

    Spring解密之XML解析与Bean注册示例详解

    在上面的代码中,我们可以看到DefaultListableBeanFactory是如何忽略某些依赖接口的,它忽略了BeanNameAware、BeanFactoryAware、BeanClassLoaderAware等依赖接口,这些依赖接口是Spring中提供的一个重要特性。...

    spring-reference

    Spring框架允许Bean通过`BeanNameAware`和`BeanFactoryAware`等接口获取自身的信息。 ##### 3.4.3 FactoryBean FactoryBean是一种特殊的Bean,它可以生产其他Bean。Spring框架利用FactoryBean来延迟Bean的实例化...

Global site tag (gtag.js) - Google Analytics