package com.astute.sparrow.spring.ioc.method_injection;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component("a")
public class A implements BeanFactoryAware {
@Autowired
@Qualifier("b")
private B b;
private BeanFactory factory;
public void printB() {
System.out.println(getB());
}
public B getB() {
return (B) factory.getBean("b");
}
public void setB(B b) {
this.b = b;
}
//容器在实例化实现了BeanFactoryAware接口的Bean时,会自动将容器本身注入该Bean
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.factory = beanFactory;
}
}
package com.astute.sparrow.spring.ioc.method_injection;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component("b")
@Scope("prototype")
public class B {
}
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="a" class="com.astute.sparrow.spring.ioc.method_injection.A">
</bean>
<bean id="b" class="com.astute.sparrow.spring.ioc.method_injection.B" scope="prototype"/>
</beans>
package com.astute.sparrow.spring.ioc.method_injection;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class TestBeanFactoryAware {
public static void main(String[] args) {
BeanFactory factory = new XmlBeanFactory(new ClassPathResource(
"com/astute/sparrow/spring/ioc/method_injection/spring-beanfactoryaware.xml"));
A a = (A) factory.getBean("a");
a.printB();
a.printB();
a.printB();
}
}
分享到:
相关推荐
com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean...
获取 Spring 里注册的 Bean 对象可以使用四种方法:继承 BaseDispatchAction、实现 BeanFactoryAware、使用 ApplicationContext、使用 @Autowired。每种方法都有其特点和应用场景,开发者可以根据实际情况选择合适的...
`BeanFactoryAware`接口使得Bean可以被注入`BeanFactory`,而`ApplicationListener`接口则可以让Bean监听到应用上下文的刷新事件,从而在合适的时机执行动态注册逻辑。 ```java public class BeanFactoryAwareBean ...
另一种获取Bean的方法是让类实现`BeanFactoryAware`接口。Spring容器会自动调用该接口的`setBeanFactory(BeanFactory beanFactory)`方法,将整个`BeanFactory`实例注入到实现了该接口的类中。这样就可以通过`...
BeanFactoryAware接口提供了一个方法`setBeanFactory(BeanFactory beanFactory)`,允许bean获取到当前的BeanFactory实例。这样,bean就能在运行时动态地查找和依赖其他bean,或者利用BeanFactory提供的功能,如工厂...
10. **Aware接口**:Spring提供了一系列的Aware接口,如BeanNameAware、BeanFactoryAware和ApplicationContextAware,这些接口使得Bean可以在运行时获取自身的一些信息,例如Bean的名字、所处的Bean工厂或...
- 如果Bean实现了特定的Spring接口,如`BeanNameAware`,`BeanFactoryAware`,`ApplicationContextAware`,Spring会在适当的时间调用相应的方法。 - `BeanNameAware`的`setBeanName()`方法用于将Bean的ID传递给...
`BeanFactoryAware`接口包含`setBeanFactory(BeanFactory)`方法。实现这个接口的类可以获取到装载当前Bean的`BeanFactory`,这允许类直接访问容器和其中的其他Bean,提供了更大的灵活性。 5. **FactoryBean接口**...
3. 处理BeanNameAware和BeanFactoryAware接口:如果Bean实现了BeanNameAware或BeanFactoryAware接口,Spring会调用相应的方法,将Bean的ID和BeanFactory设置到Bean中。 4. BeanPostProcessor的前置处理:在Bean的...
- Spring容器的生命周期包括对象实例化、属性设置、接口回调(如`BeanNameAware`、`BeanFactoryAware`等)以及初始化和销毁方法的调用。 6. Spring生命周期的11步: - 对象实例化:创建Bean对象。 - 属性封装:...
5. **BeanFactoryAware 接口回调**:如果该 Bean 实现了 `BeanFactoryAware` 接口,Spring 将 BeanFactory 传递给 `setBeanFactory()` 方法。 6. **调用 BeanPostProcessor.postProcessBeforeInitialization 方法**...
2. **XxxAware接口**:如ApplicationContextAware和BeanFactoryAware,可以让我们获取到ApplicationContext或BeanFactory,从而在Bean中直接访问到整个应用上下文或Bean工厂,进行更深入的定制。 3. **@Autowired...
2. BeanFactoryAware:在`setBeanName`之后,Spring会调用`setBeanFactory`方法,将BeanFactory对象注入到Bean中,使Bean能够访问容器。 3. InitializingBean:这个接口提供了一个`afterPropertiesSet`方法,在所有...
④ 如果 Bean 实现 BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext ⑤ 如果存在类实现 BeanPostProcessor(后处理 Bean),执行 ...
3. **Bean接口回调**:如果Bean实现了特定的接口,如`BeanNameAware`、`BeanFactoryAware`或`ApplicationContextAware`,Spring会在适当的时候调用对应的回调方法。这些接口允许Bean获取其ID、BeanFactory引用或...
6. **BeanFactoryAware**:此接口使得Bean可以在运行时显式查找其依赖的其他对象。BeanFactory通过`setBeanFactory(BeanFactory beanFactory)`方法传递自身,使得Bean可以直接使用BeanFactory来获取依赖。然而,这种...
- **BeanFactoryAware**:该接口的`setBeanFactory`方法会被Spring容器回调,将当前的`BeanFactory`实例传递给bean,便于bean访问容器内的其他bean。 - **ApplicationContextAware**:此接口的`...
5. 调用`initializeBean(...)`,其中包括执行`aware`接口方法,如`BeanFactoryAware`, `ApplicationContextAware`等,以设置属性值。 6. 应用`BeanPostProcessorBefore`和`BeanPostProcessorAfter`的前置和后置增强...
- 实现 `BeanFactoryAware` 的 Bean 会通过 `setBeanFactory` 方法得到 `BeanFactory`,以便于访问容器服务。 - 实现 `ApplicationContextAware` 的 Bean 可以通过 `setApplicationContext` 获取 `...