`

BeanFactoryAware的使用

 
阅读更多

使用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的四种方法

    获取 Spring 里注册的 Bean 对象可以使用四种方法:继承 BaseDispatchAction、实现 BeanFactoryAware、使用 ApplicationContext、使用 @Autowired。每种方法都有其特点和应用场景,开发者可以根据实际情况选择合适的...

    com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean,BeanDefinitionRegistryPostProcessor,BeanFactoryPostProcessor,BeanPostProcessor,ResourceLoaderA

    com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean...

    spring运行过程中动态注册bean

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

    几种spring获取bean的方法.txt

    此外,在实际开发中还可能遇到其他获取Bean的方式,比如使用`ApplicationContext`的子类如`ClassPathXmlApplicationContext`或`FileSystemXmlApplicationContext`等。选择哪种方式取决于具体的应用场景和个人喜好。...

    关于Spring注解@Async引发其他注解失效的解决

    因此,作者建议使用 @Autowired 来注入自己,而不是使用 BeanFactoryAware,这样可以避免循环依赖问题。同时,作者也强调了,了解 Spring 框架的加载机制和注解的处理方式非常重要,可以帮助开发者更好地使用Spring...

    Spring 框架中注入或替换方法实现

    本文将详细介绍 Spring 框架中注入或替换方法实现,主要涵盖了 Spring 框架中 singleton 和 prototype Bean 的作用域、BeanFactoryAware 接口的使用、CGLib 库的应用等方面的知识点。 一、Spring 框架中 singleton ...

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

    Spring Aware接口自定义获取bean的两种方式 Aware接口是Spring...在使用Spring编程时,需要根据bean的名称来获取相应的bean对象,这时候,可以通过实现BeanFactoryAware和ApplicationContextAware接口来满足需求。

    spring面试总结

    - 使用:Bean现在准备就绪,可以供应用使用。 - 销毁回调:在容器关闭时,调用`DisposableBean`接口的`destroy`方法或自定义的销毁方法。 掌握这些核心概念对于深入理解和使用Spring框架至关重要,它们有助于编写...

    Spring中Bean的生命周期使用解析

    在这个阶段,如果Bean实现了BeanFactoryAware接口,Spring容器 sẽ将BeanFactory传递给setBeanFactory()方法,然后Bean可以在setBeanFactory()方法中使用该BeanFactory。 6. ApplicationContextAware的...

    6.1、框架—Spring(14题)1

    - 实现 `BeanFactoryAware` 的 Bean 会通过 `setBeanFactory` 方法得到 `BeanFactory`,以便于访问容器服务。 - 实现 `ApplicationContextAware` 的 Bean 可以通过 `setApplicationContext` 获取 `...

    Spring In Action笔记100例

    - **`BeanFactoryAware`**: 使Bean能够获取所在的`BeanFactory`实例。 这些接口允许Bean更加灵活地访问Spring容器中的资源和服务。 以上是《Spring In Action》中部分核心知识点的详细解释和示例,有助于读者更好...

    基于java的企业级应用开发:Bean的生命周期.ppt

    在企业级应用开发中,Java和Spring框架是广泛使用的工具,尤其在管理Bean的生命周期方面。理解Bean的生命周期对于优化应用程序性能和实现高效资源管理至关重要。以下是对标题和描述中涉及知识点的详细说明: 1. **...

    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. ...

    java JSP开发之Spring中Bean的使用

    同样,如果实现了`BeanFactoryAware`,`setBeanFactory()`方法会被调用,传递BeanFactory实例。如果实现了`ApplicationContextAware`,则会调用`setApplicationContext()`,传递ApplicationContext引用。 4. **预...

    Spring.pdf

    3. 处理BeanNameAware和BeanFactoryAware接口:如果Bean实现了BeanNameAware或BeanFactoryAware接口,Spring会调用相应的方法,将Bean的ID和BeanFactory设置到Bean中。 4. BeanPostProcessor的前置处理:在Bean的...

    Spring @Async 的使用与实现的示例代码

    AsyncAnnotationAdvisor 继承自 PointcutAdvisor 接口,并在 AsyncAnnotationBeanPostProcessor 中实现了其父类接口的 BeanFactoryAware 中的 setBeanFactory 初始化方法。 ```java @Override public void ...

    Spring中关于Bean的管理的课件

    我们可以通过实现特定的接口或使用注解来定制Bean的生命周期行为。 9. **加载Bean的方式**:Spring支持多种方式加载Bean,包括XML配置文件、基于注解的配置和Java配置类。 10. **Aware接口**:Spring提供了一系列...

    Spring IOC的注入方式总结

    Spring允许通过实现`ApplicationContextAware`或`BeanFactoryAware`接口来获取ApplicationContext或BeanFactory,从而获取其他bean。这种方式在某些场景下可能更直观,但通常不推荐,因为它破坏了依赖注入的原则,...

    spring常见问题

    通过实现 BeanFactoryAware 接口来获得 factory 可以获取 Spring 容器。 动态代理技术是指在运行时生成代理对象,以便在运行时动态地将横切逻辑和业务逻辑编织在一起。JDK 的动态代理主要涉及到 java.lang.reflect ...

    Spring特性——Aware感知特性

    BeanFactoryAware接口提供了一个方法`setBeanFactory(BeanFactory beanFactory)`,允许bean获取到当前的BeanFactory实例。这样,bean就能在运行时动态地查找和依赖其他bean,或者利用BeanFactory提供的功能,如工厂...

Global site tag (gtag.js) - Google Analytics