Spring基础(1)-从getbean开始

Spring之AOP代理对象的产生(一) 准备 接口 public interface UserService { String query(); } 接口的实现 @Service public class UserServiceImpl implements UserService { @Override public String query() { System.out.println("------------ yz ------------"); return "yz"; 阅读详情

bean

  • 大家都可以背下来,spring有三种注入方式。构造方法/setter/注解。我们将采用最简单的setter方法进行演示。
  • 大家也可以背下来,spring实例话bean有三种方式,构造器(含默认构造器),静态工厂,实例工厂。我们将采用默认构造器(即使用构造器但是不配置构造器参数,使用类的无参构造器的方式)。
  • 大家也可以背下来,spring有三种配置方式,基于xml,基于注解,基于java代码。我们将采用第一种方式。我们将采用第一种方式进行演示。
public class SpringTest {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                new String[]{"Beans.xml"});

        DemoBean demoBean = (DemoBean) ctx.getBean("helloWorld");
        demoBean.getMessage();

    }
}


public class DemoBean {
    private String message;
    //spring并不要求所有对象的字段都有set方法。但是,所有需要注入的字段必须有set方法。
    public void setMessage(String message){
        this.message  = message;
    }
    public void getMessage(){
        System.out.println("Your Message : " + message);
    }
    /*
    在使用构造器实例话的情况下 一个类,想成为一个spring bean,至少需要满足下列两者之一(在声明构造方法参数的情况下):
    有无参的构造函数
    没有任何构造函数
    */
    public DemoBean() {
        System.out.println("in constructor");
    }
    //配置的INIT函数在无参构造函数执行之后执行。
    public void INIT(){
        System.out.println("in init");
    }
}

<bean id="helloWorld" class="gdl.DemoBean" init-method="INIT">
<property name="message" value="Hello World!"/>
</bean>

InitializingBean接口

如果我们将上述bean的代码改成如下

public class DemoBean implements InitializingBean {
    private String message;
    public void setMessage(String message){
        System.out.println("in setter");
        this.message  = message;
    }
    public void getMessage(){
        System.out.println("Your Message : " + message);
    }

    public DemoBean() {
        System.out.println("in constructor");
    }

    public void INIT(){
        System.out.println("in init");
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("in after property set");
    }
}

运行结果将是
in constructor
in setter
in after property set
in init
Your Message : Hello World!
由此可见InitializingBean.afterPropertiesSet字如其名,在属性注入之后运行。

BeanPostProcessor

spring负责bean的初始化。在初始化的时候完成AOP的注入。我们自然有一个问题,如果我们在初始化的时候就要切面呢!!我们需要在初始化的时候对所有bean进行统一的逻辑。显然我们不会愚蠢到每个bean的类里存在相同的代码。
我们将相关代码修改如下

//所有实现了该接口的bean将被优先实例化。BeanPostProcessor的bean不经过BeanPostProcessor的bean的处理过程。(不然不就乱套了)
public class DemoBeanInitAOP implements BeanPostProcessor {

    public DemoBeanInitAOP() {
        System.out.println("BeanPostProcessor constructor");
    }
    //Object o是刚刚完成实例化的对象,还没有完成属性注入。String s是这个对象的bean ID。
    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
        System.out.println("BeanPostProcessor after Init:"+ s);
        return o;
    }

    public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
        System.out.println("BeanPostProcessor before Init:"+ s);
        return o;
    }
}

    <bean id="hellowordlInitAOP" class="gdl.DemoBeanInitAOP">
    </bean>

输出如下
BeanPostProcessor constructor
in constructor
in setter
BeanPostProcessor before Init:helloWorld
in after property set
in init
BeanPostProcessor after Init:helloWorld
Your Message : Hello World!

代理

通过上述步骤,我们getbean获得的对象,就是对象本身,可不是什么代理。但是如果我们加上AOP设置。

    <aop:config>
        <!--首先定义一个切入点-->
        <aop:pointcut id="loggerCutpoint"
                      expression=
                              "execution(* gdl.DemoBean.*(..)) "
        />
        <!--然后定义一个切面,一个切面包含唯一有一个切面支持的bean-->
        <aop:aspect id="logAspect" ref="hellowordlAOP">
            <aop:around pointcut-ref="loggerCutpoint" method="log"/>
        </aop:aspect>
    </aop:config>


public class DemoBeanAOP {
    public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("我在被监视程序之前。。。");
        Object object = joinPoint.proceed();
        System.out.println("我在被监视程序之后。。。" );
        return object;
    }
}

这样,被命中的bean就会被代理对象所替代。
如果输出其class,就会变成

gdl.DemoBean$$EnhancerBySpringCGLIB$$bfcae182

总结

当然,spring getbean远远没有这么简单。还有诸如循环依赖等等复杂的烧脑问题。这个我们将在后续文章中介绍。
这里,简单介绍下spring的getbean过程:
+ 首先完成所有BeanPostProcessor,listner bean的初始化,该步骤在context new的时候完成。二者按着上述顺序完成,注意,后者在初始化时也会经过第一个)
+ 对于其他的bean,如果lazy-init设置为true,则会在getbean时加载。否则,会在context new时完成初始化。
postProcessBeforeInitialization(所有) ->
bean的构造器 ->
属性注入 ->
InitializingBean.afterPropertiesSet(单个)->
init-method(单个) ->
postProcessAfterInitialization(所有)
如果没有设置lazy-init,那么,第一次getbean(或者context start)的时候会初始化所有bean。否则为使用时才创建bean。

AG32VF407直流电流采集仪设计:从1uA到10A宽范围采样与FPGA加速方案 本文详细介绍了基于AG32VF407芯片的直流电流采集仪设计方案,实现了从1uA到10A的宽范围采样。方案采用低噪声电源、精密运放调理、高速比较器自动档位切换及高精度ADC同步采样,并重点阐述了利用AG32VF407片内FPGA实现硬件加速以提升性能的架构思路,为精密电流测量提供了完整的硬件与FPGA加速解决方案。 阅读详情

相关推荐

反激电源RCD尖峰吸收电路的原理以及调试

反激电源RCD尖峰吸收电路的原理以及调试

mnmmnmn的博客 9252

详解Spring的GetBean方法

Spring容器提供了五种获取Bean的方式,可以根据beanName获取Bean,也可以根据classType来获取Bean,所有根据beanName来获取Bean的方式,底层都会通过调用下面的doGetBean()来获取Bean对象 protected <T> T doGetBean( String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly

sermonlizhi的博客 9508

Ubuntu中 vsftpd 的安装与配置 (详细介绍)

简介 vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持很多其他的 FTP 服务器不支持的特征。 vsftpd是 UNIX 操作系统中的一个开源的、免费的 FTP 服务软件。具有以下特点: 安全性高 轻小易用 支持系统用户匿名用户和虚拟用户的权限验证和相关操作 安装步骤如下: 1.将此命令复制到终端 sudo apt-get install vsftpd 2.安装完成后启动VSFTP

qq_43299421的博客 1万+

Spring源码分析之getBean主流程分析

当我们通过向Spring容器获取某个bean的时候,总是调用Spring中重载的各种getBean方法。那么,getBean中的流程是什么样的? 通过本文,你将对getBean方法的主流程有一个详细的认识。 入口当然是getBean方法: public Object getBean(String name) throws BeansException { return doGetBe...

南瓜灯cc 3154

RandLA-Net复现SemanticKITTI和S3DIS数据集

RandLA-Net复现KITTI和室内数据集

weixin_48845174的博客 4117

AUTOSAR BswM配置实战:手把手教你用Vector Davinci Configurator搭建第一个模式管理规则

本文详细介绍了如何使用Vector Davinci Configurator工具配置AUTOSAR BswM模块,实现车身控制ECU的模式管理规则。通过实战案例,从环境准备、核心概念梳理到具体配置步骤,包括ModeRequestPort、ModeCondition、Logical Expression和Rules的构建,帮助工程师快速掌握BswM配置技巧,提升汽车电子软件开发效率。

weixin_28678831的博客 353

Spring中的getBean()的几种方式(转载)

在本文中,我们将详细介绍从BeanFactory中获取bean的多种方式。简单地说,正如方法的名称所表达的,getBean()负责从Spring IOC容器中获取bean实例。

VIBE的博客 3069

ENVI_基于无人机数据的果树提取与相对健康监测

一、数据处理 1.计算植被指数VDVI或GDVI:Band Math / Spectral Indices 2.制作掩膜:ROI——Threshold——Subset 二、单地块果树提取 1.绘制感兴趣区shp 2.确定果树提取参数:Count Crops 3.输出果树矢量文件:Convert Crops To Shapefile 4.果树相对健康程度分析:Calculate Crop Me...

提供技术服务、资源分享 429690771 1400

Spring IoC源码:getBean 详解

先从缓存中获取实例对象,如果有实例则进行工厂对象解析流程,判断beanName是否带&符号,决定是返回工厂对象本身还是返回真正的实例,如果是返回真正的实例,则调用工厂对象的getObject返回,如果返回值为null,并且在isSingletonCurrentlyInCreation中存在,代表是一个正在创建的bean,不完整的工厂对象,则抛出异常。

猪大肠的博客 1379

TC397 EB MCAL开发从0开始系列 之 [13.1] Dma配置实战 -实现M2M数据传输(读存储写存储)

TC3XX TC397 MCAL DMA 从0搭建测试用例-实现M2M 存储到存储数据传输

yy九歌的博客 1914

SQL Server数据库备份与恢复

在 SQL Server 中,数据库备份与恢复是保障数据安全的核心操作。

zjw541806的博客 1877

Spring——ApplicationContext之getBean方法详解

我们知道可以通过ApplicationContext的getBean方法来获取Spring容器中已初始化的bean。getBean一共有以下四种方法原型: getBean(String name) getBean(Class type) getBean(String name,Class type) getBean(String name,Object[] args) 下来我们分别来探讨以上四种方式获取bean的区别。 其中实体类Person定义如下: public class Person { p

weixin_43949634的博客 1万+

C++ getline函数详解与示例代码

每次调用函数时,会读取一行文本,并将其存储在字符串对象中。在循环中,我们检查读取到的文本是否为空行,如果是则跳出循环,否则输出读取到的文本。这个函数在处理用户输入、文件读取等场景中非常有用,希望能对您的C++编程有所帮助。函数是一个常用的字符串输入函数,可以用于从输入流中读取一行文本。首先,我们输出提示信息,要求用户输入一行文本。函数会等待用户输入,并将输入的文本存储在。函数从输入流中读取一行文本,并将其存储在字符串对象。这样,当用户输入制表符时,函数会停止读取。函数的用法,并提供相应的示例代码。

LogicGuruX的博客 828

理解Spring中的getBean()

1.简介 在本文中,我们将详细介绍从BeanFactory中获取bean的多种方式。 简单地说,正如方法的名称所表达的,getBean()负责从Spring IOC容器中获取bean实例。 2. 创建Bean容器 首先,让我们定义一些用于测试的Spring bean。创建spring IOC容器有多种方式,但是在本文中,我们将使用基于注释的Java配置: @Configuration class ...

susht 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring IoC源码学习:getBean 详解

前言 接着Spring IoC:finishBeanFactoryInitialization详解,我们正式开始学习获取bean实例方法,该方法是Spring最核心的方法。 正文 单击 preInstantiateSingletons方法里的getBean(beanName)代码,进入该方法。 getBean @Override public Object ...

程序员囧辉 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SPRING11_getBean源码详细解读、流程图

SPRING10_getBean源码详细解读、流程图

所得皆惊喜 1123

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring源码之BeanFactory.getBean()

本文是针对Srping的BeanFactory.getBean来进行源码解析,如果您是第一次看请先看一下XMLBeanFactory解析:https://blog.youkuaiyun.com/qq_30257149/article/details/87972291,可以更好的理解Spring的注册原理,本篇博客是跟源码一步步看spring怎么实现getBean源码,Spring版本为5.X,源码已经在每一行...

lantao 1万+

详解Spring中getBean()方法

我们日常会经常使用getBean()方法从spring容器中获取我们需要的bean。那么,getBean()方法是怎么一步步完成从spring容器中获取bean的呢? 下面我们就通过源码分析一下。 一、主要代码分析 基于:spring5.1 入口:AbstractBeanFactory类的doGetBean(): public Object getBean(String n...

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 1万+

Spring中ApplicationContext的getBean()方法

getBean一共有以下四种方法原型: (1)getBean(String name) :通过id或name去查找获取bean.参数name表示IOC容器中已经实例化的bean的id或者name,且无论是id还是name都要求在IOC容器中是唯一的不能重名。 (2)getBean(Class type):通过类型去获取bean,要求类型必须唯一参数Class type表示要加载的Bean的类型。如果该类型没有继承任何父类(Object类除外)和实现接口的话,那么要求该类型的bean在IOC容器中也必须是

雪人奥特曼的博客 3367

spring获取容器对象 getBean()方法的使用

getBean中有两种方法可以获取对象 1. getBean(String name) 通过配置文件中id的方式获取对象 ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); Book b = (Book) app.getBean("配置文件中的id"); 可以看到,通过id方式获取对象,返回的是Object类型,需要强制转换类型 2. getBean(Class requiredTyp

InterestAndFun的博客 1万+

spring getBean()方法解析概述

getBean(beanName) 整体概述 1.transformedBeanName(name) 将bean的别名(alias)解析成真正的beanName 截取&beanName中&字符,获得beanName 2.getSingleton(beanName) 从缓存中获取bean,有三个缓存集合,循环依赖会有单章讲解。 singletonObjects :缓存已经初始化完成的bean对象 earlySingletonObjects : 循环引用中,提前暴露的bean对象

weixin_41009314的博客 2260

Spring 源码之--getBean完整流程

begin with : new AnnotationConfigApplicationContext(MainConfig.class); ==> org.springframework.context.annotation.AnnotationConfigApplicationContext public AnnotationConfigApplicationContext(...

pengweismile的专栏 2003

spring源码之 getBean流程图

Created with Raphaël 2.1.0调用getBean方法调用AbstractBeanFactory的doGetBean方法Bean 是否 不为null并且args为null调用getObjectForBeanInstance方法判断BeanInstance是否为FactoryBean类型并且不以name为&开头返回bean判断BeanInstance不是FactoryBean类型的

wuhulala的休息室 3049

Spring ApplicationContext 中的getBean方法的深入分析

Spring 中的ApplicationContext是如何取得Bean的

yzx2015fd的博客 1万+

Spring--getBean()与@Autowired的对比

本文介绍getBean()与@Autowired的对比。

IT利刃出鞘的博客 5965

Spring GetBean流程

 第一节讲解Spring启动的时候说到,Spring内部先解析了所有的配置,加载所有的Bean定义后,再根据需要对Bean进行实例化和初始化。除开Spring自己主动新建的对象,第一次根据Bean定义加载对象的动作出现在AbstractApplicationContext的invokeBeanFactoryPostProcessors方法,该方法会在Spring容器中找出实现了BeanF...

cxyAtuo的博客 523
上一篇: 数据结构之图
下一篇: Spring基础(2)-ApplicationContext
define_us
博客等级 码龄14年 157粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值