bean创建过程、spring BeanFactory的实现、spring aware

Bean的创建过程:

Spring beanFactory的工厂模式实现:

解析<bean>标签,存到一个Map<String, Object> beans中

People o = (People)factory.getBean("p");

因为map存的是object类型,所以取出时需要强制类型转换

Bean的生命周期:

spring aware的目的是为了让Bean获得spring容器的服务,bean继承applicationContextAware可以获得spring容器的所有服务,但原则上还是用到什么接口,继承什么接口。(如beanNameAware,BeanFactoryAware...)

beanNameAware接口:获得本身bean的id属性。

void setBeanName(String name)

该方法的name参数就是该bean的id属性,调用setBeanName方法可以让bean获取得自身的id属性

@Service
public class BeanNameAwareTest implements BeanNameAware {

private String name;

@Override

public void setBeanName(String name) {

System.out.println("setBeanName方法,id是"+name);

this.name = name;

}

public String getBeanName() {

return this.name;

}

}

获取bean:

@Autowired
private BeanNameAwareTest beanNameAwareTest;

public void aware()  {

System.out.println("beanName:"+beanNameAwareTest.getBeanName());

beanNameAwareTest.setBeanName("beanName");

System.out.println("beanName:"+beanNameAwareTest.getBeanName());

}

结果:

setBeanName方法,id是beanNameAwareTest//bean被实例化时自动调用的

beanName:beanNameAwareTest

setBeanName方法,id是beanName//手动调用的setBeanName方法
  beanName:beanName

BeanFactoryAware接口:相应的beanfactory的实例引用

void setBeanFactory(BeanFactory beanFactory)

通过这个方法的参数创建它的BeanFactory实例,实现了BeanFactoryAware接口,就可以让Bean拥有访问Spring容器的能力。缺点:导致代码与spring的api耦合在一起。

@Service

public class BeanFactoryAwareTest implements BeanFactoryAware {

private BeanFactory beanFactory;

@Override

public void setBeanFactory(BeanFactory beanFactory) throws BeansException {

this.beanFactory = beanFactory;

}

}

获取bean工厂进行bean操作:

@Autowired

private BeanFactoryAwareTest beanFactoryAwareTest;

public void aware()  {

System.out.println("通过bean工厂得到一个bean:"+beanFactoryAwareTest.getBeanFactory().getBean("beanFactoryAwareTest"));

}

ApplicationContextAware接口:被注入applicationContext实例

setApplicationContext(ApplicationContext context)

使用参数context用来创建它的applicationContext实例,缺点:导致代码与spring的api耦合在一起。

public class ContextAwareTest implements ApplicationContextAware{

@Override

public void setApplicationContext(ApplicationContext arg0){

applicationContext = arg0;

People= (People)applicationContext.getBean("people");

}

}

使用场景:

比如,根据环境的不同,target需要对应不同的资源,可以首先加载一个source类,其中有一个与环境有关的属性mode;

得到beanFactory,getBean(source)再对其mode属性判断,做出不同的处理,get相同的bean,赋给target

原文地址:http://blog.51cto.com/13580976/2156931

时间: 2024-07-29 08:25:40

bean创建过程、spring BeanFactory的实现、spring aware的相关文章

Spring(八)核心容器 - Bean 创建过程

目录 1.整体流程 2.核心流程 2.1 解析 FactoryBean 2.2 从 createBean 开始 2.2.1 创建 Bean 实例 2.2.2 初始化 Bean 实例 - 属性注入 2.2.3 初始化 Bean 实例 - 执行初始化方法(回调钩子接口) Spring 版本 5.0.7.RELEASE 获取 Bean 的方法是 getBean,其来自 BeanFactory 继承的 AbstractAutowireCapableBeanFactory 抽象类继承的 AbstractB

Spring源码解析 – AnnotationConfigApplicationContext容器创建过程

Spring在BeanFactory基础上提供了一些列具体容器的实现,其中AnnotationConfigApplicationContext是一个用来管理注解bean的容器,从AnnotationConfigApplicationContext的实现结构图中可以看出: AnnotationConfigApplicationContext继承GenericApplicationContext这个通用应用上下文,GenericApplicationContext内部定义了一个DefaultList

Spring BeanFactory 依赖注入

Spring BeanFactory 依赖注入 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一.autowire 五种注入方式测试 (1) 环境准备 public class Company { private Department department; private List<Employee> employees; public Company() { } public Company(Departmen

【Spring源码分析】非懒加载的Bean实例化过程(下篇)

doCreateBean方法 上文[Spring源码分析]非懒加载的Bean实例化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireCapableBeanFactory的doCreateBean方法代码: 1 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[]

Spring中常见的bean创建异常

Spring中常见的bean创建异常 1. 概述     本次我们将讨论在spring中BeanFactory创建bean实例时经常遇到的异常 org.springframework.beans.factory.BeanCreationException,下面我们将讨论并再现这些异常,同时给出解决方案. 2. Cause:org.springframework.beans.factory.NoSuchBeanDefinitionException     到目前为止最常见的导致BeanCreat

Spring装配Bean的过程

首先说一个概念:“懒加载” 懒加载:就是我们在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中. spring配置文件中bean默认是lazy-init=“false”为非懒加载.下面具体说明. 1.默认情况下bean实例化过程: AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("/beans.xml"); //随着spri

【Spring源码分析】原型Bean实例化过程、byName与byType及FactoryBean获取Bean源码实现

原型Bean加载过程 之前的文章,分析了非懒加载的单例Bean整个加载过程,除了非懒加载的单例Bean之外,Spring中还有一种Bean就是原型(Prototype)的Bean,看一下定义方式: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi=&qu

Spring装配Bean的过程补充

对上一篇的<Spring装配Bean的过程>的过程说一下,不然真产生了误区. 误区在哪里呢?那就是spring bean的作用域问题. 说哈常用的两种作用域:默认是scope = singletonsingleton:在每个Spring IoC容器中一个bean定义对应一个对象实例. prototype:一个bean定义对应多个对象实例,每次获取bean就是实例化新的bean. 下面说重点了: 当scope=singleton,即默认情况,会在容器初始化时实例化.但我们可以指定Bean节点的l

spring 基于session方式的bean创建

spring bean生命周期:http://www.cnblogs.com/zrtqsk/p/3735273.html session bean创建: /**  * Created by dongsilin on 2017/3/7.  * RestTemplate bean,生命周期为session  */ @Configuration public class RestTemplateBean {     private static final SimpleClientHttpReques