Bean专题——什么是Bean?怎么注册、使用?生命周期?作用域?

1.什么是Bean?

  • Bean是被实例的、组装的、及被Spring容器管理的Java对象。
  • Spring容器会自动完成Bean对象的实例化。
  • 创建应用对象之间的协作关系的行为被称为:装配,这就是依赖注入的本质。

2.Spring三种装配方案

1.隐式的bean发现机制和自动装配;

  • 1.涉及注册Bean的注解:@Component , @Repository , @ Controller , @Service , @Configration;(这些注解只局限于自己编写的类)。
  • 2.使用Bean的注解:@Autowired(默认byType注入,跟@Qualifier(“bean名称”)搭配进行byName注入), @Resource(默认byName注入,可以设置为byType);
  • 3.指定要扫描的包@CompoentScan(“要扫描的包名”),后边没参数时,默认扫描当前包、及其子包。

2.使用Java代码进行显示配置;

  • 1.涉及注解:@Bean,当引入第三方组件时,就需要用它去返回一个对象。
  • 2.@Bean注解用在返回实例的方法上,告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。 产生这个Bean对象的方法Spring只会调用一次
  • 3.@Import也能把第三方库中的类实例交给spring管理

3.在xml文件中进行显示配置。(不展开)

3.关于Bean的命名

  • 1.默认是类名的首字母小写。
    下边的bean默认的ID名:jayDisc
@Component
public class JayDisc implements ICompactDisc {...
}
  • 2.或者自己指定
    下边bean的ID名:zhoujielun
@Component("zhoujielun")
public class JayDisc implements ICompactDisc {...
}

3.5.Spring的常用注入方式

  • 1.构造器的依赖注入
  • 2.Setter方法的注入
  • 3.基于注解的注入,最好的解决方案是用构造器参数,实现强制依赖,Setter方法实现可选依赖。

4.关于自动注入——以@Autowire为例

1.源码

  • 属性boolean required();表示,如果没找到依赖注入的对象是否报错?
    可以自己设置为false不报错,但是一旦用到没被注入的对象会报NullPonterException空指针异常。
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {* Declares whether the annotated dependency is required.* <p>Defaults to {@code true}.这个属性表示,如果没找到依赖注入的对象是否报错?boolean required() default true;}

2.用法,3个地方

  • 1.用在构造器上(@Resource不支持这个)
public class Student {private Integer age;private String name;@Autowiredpublic Student(Integer age, String name) {this.age = age;this.name = name;}
}
  • 2.属性setter注解
public class Student {private Integer age;private String name;@Autowiredpublic void setAge(Integer age) {this.age = age;}@Autowiredpublic void setName(String name) {this.name = name;}
}
  • 3.属性field注解
public class Student {@Autowiredprivate Integer age;@Autowiredprivate String name;
}

5.Java对象的创建

1.对象创建的3步骤

1.为对象分配内存空间;
2.初始化对象;
3.将对象指向 分配的内存地址。

2.代码的执行顺序

父类静态代码块 >> 子类静态代码块 >> 父类代码块 >> 父类构造方法 >> 子类代码块 >> 子类构造方法
在这里插入图片描述

1.如下代码,子类调用了父类的构造方法。

  • 1.父类静态代码块……(只执行1次)
  • 2.子类静态代码块……(只执行1次)
  • 3.父类代码块……(每次new对象都执行)
  • 4.父类构造方法……(每次new对象都执行)
  • 5.子类代码块……(每次new对象都执行)
  • 6.子类构造方法……(每次new对象都执行)
class Parent{int age ;static {System.out.println("父类静态代码块……");}{System.out.println("父类代码块……");}public Parent(int age) {System.out.println("父类构造方法……");this.age = age;}
}
class Child extends Parent{static {System.out.println("子类静态代码块……");}{System.out.println("子类代码块……");}public Child(int age) {super(age); 调用父类构造方法System.out.println("子类构造方法……");}
}

2.如下代码,没有调用父类的构造方法

  • 1.父类静态代码块……(只执行1次)
  • 2.子类静态代码块……(只执行1次)
  • 3.父类代码块……(每次new对象都执行)
  • 4.子类代码块……(每次new对象都执行)
  • 5.子类构造方法……(每次new对象都执行)
class Parent{int age ;static {System.out.println("父类静态代码块……");}{System.out.println("父类代码块……"+age);}public Parent(int age) {System.out.println("父类构造方法……"+age);this.age = age;}public Parent() {}
}
class Child extends Parent{static {System.out.println("子类静态代码块……");}{System.out.println("子类代码块……"+age);}public Child(int age) {System.out.println("子类构造方法……"+age);this.age = age;}public Child() {}
}

6.Bean的生命周期

6.1.Spring扫描获取BeanDefinition

一个BeanDefinition描述了一个Bean实例的相关信息:属性、是否单例、是否懒加载、父类名称等;

6.2.Spring根据BeanDefinition进行实例化

实例化对象被包装在BeanWrapper对象(此时对象仍然是一个原生的状态,并没有进行依赖注入)中,之后通过BeanWrapper提供的设置属性的接口完成依赖注入

6.3.注入Aware接口

  • 什么是Aware接口????
    • 实现xxxAware接口,bean才有被Spring容器通知的能力,才能调用Spring所提供的资源
    • 因为Bean对Spring容器的存在是没有意识的,所以不实现xxAware接口,就没办法调用Spring的资源。

检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean;

  • BeanNameAware,获取容器中当前Bean的名称;
  • BeanFactoryAware,获取BeanFactory
  • ApplicationContextAware,获取ApplicationContext(它是BeanFactory的子类,IoC的核心)
    • 此类可以获取到spring配置文件中所有的bean对象
      在这里插入图片描述

6.4.检查Bean是否实现BeanPostProcessor接口

该接口有两个方法:一个实例化Bean之前调用,一个实例化Bean之后调用

  • 入参:要处理的Bean对象,Bean的名字
  • 出参:要处理的Bean对象

前置处理:postProcessBeforeInitialzation,在InitialzationBean之前执行,因此称为前置处理。所有Aware接口的注入就是在这一步完成的。
后置处理:postProcessAfterInitialzation,在InitialzationBean之后执行,因此称为后置处理。

public interface BeanPostProcessor {@Nullable1.实例化之前调用default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}@Nullable2.实例化之后调用default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {return bean;}
}

6.5.InitializingBean接口与init-method:实现注入Bean的初始化的2种方法

在bean正式构造完成前增加我们自定义的逻辑

  • 1.实现InitializingBean接口,则实现afterProperties的方法;
public interface InitializingBean {void afterPropertiesSet() throws Exception;
}
  • 2.反射原理,配置文件使用init-method标签直接注入bean。本质上仍然使用了InitializingBean接口。

6.6.DisposableBean接口和deatroy-method;2种方法异曲同工

在bean销毁前执行自定义的逻辑

  • 1.容器关闭后,如果Bean实现了DisposableBean接口,则会调用该接口的destroy方法
public interface DisposableBean {void destroy() throws Exception;
}
  • 2.如果配置了destroy-method方法,则会执行destroy-method配置的方法。

在这里插入图片描述

7.Bean的作用域——@Scope注解

1.Singleton:唯一的Bean实例,Spring默认bean是单例的;

@Scope("singleton")

2.Prototype:每次注入或者通过Spring应用上下文获取都会创建1个新的Bean实例;

@Scope("prototype")

3.Session:在web应用中,为每个会话创建1和Bean实例,只在本次会话的生命周期中生存;
4.Request:在web应用中,为每个请求创建1和Bean实例;只在本次请求的生命周期中生存;

8.FactoryBean与BeanFactory区别

BeanFactory,是Bean的工厂,ApplicationContext的父类,IoC容器的核心,负责生产和管理Bean对象;
FactoryBean,它只是1个Bean,可以通过实现FactoryBean接口定制实例化Bean的逻辑。

9.ApplicationContext的通常实现

  • 1.FileSystemXmlApplicationContext
    此容器从⼀个 XML ⽂件中加载beans 的定义,XML Bean 配置⽂件的全路径名必须提供给它的构造函数。
  • 2.ClassPathXmlApplicationContext
    此容器也从⼀个 XML ⽂件中加载beans 的定义,这⾥,你需要正确设置classpath 因为这个容器将在 classpath ⾥找 bean 配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1618521.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring第三篇】什么是Bean?

在Spring 中&#xff0c;构成应用程序主干并由Spring IoC容器管理的对象称为bean。bean是一个由Spring IoC容器实例化、组装和管理的对象。 我们总结如下&#xff1a; 1.bean是对象&#xff0c;一个或者多个不限定 2.bean由Spring中一个叫IoC的东西管理 3.我们的应用程序由一个…

大数据-玩转数据-Flink窗口函数

一、Flink窗口函数 前面指定了窗口的分配器, 接着我们需要来指定如何计算, 这事由window function来负责. 一旦窗口关闭, window function 去计算处理窗口中的每个元素. window function 可以是ReduceFunction,AggregateFunction,or ProcessWindowFunction中的任意一种. Reduc…

软考:中级软件设计师:网络类型与拓扑结构,网络规划与设计,ip地址与子网划分,特殊含义的IP地址

软考&#xff1a;中级软件设计师:网络类型与拓扑结构 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准…

Qt入门教程【Core篇】Layout布局(布局管理器、手动布局)

&#x1f608;「编程小鱼酱秘密基地」&#xff1a;传送门 &#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「网易云课堂」&#xff1a;传送门 &#x1f608;「CSDN学院」&#xff1a;传送门 &#x1f608;「51CTO学…

前端布局 Flex(弹性)布局

1. flex布局优点 操作方便&#xff0c;布局极为简单&#xff0c;移动端应用很广泛 pc端浏览器支持情况较差 IE11或者更低版本&#xff0c;不支持或仅部分支持 2. flex布局原理 flex意为“弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性&#xff0c;任何一个容器都…

Java BorderLayout(边框布局)布局管理器

BorderLayout BorderLayout 将容器分为 EAST 、 SOUTH 、 WEST 、 NORTH 、 CENTER五个区域&#xff0c;普通组件可以被放置在这 5 个区域的任意一个中 。 BorderLayout布局 管理器的布局示意图如图所示 。 当改变使用 BorderLayout 的容器大小时&#xff0c; NORTH 、 SOUTH …

java:布局方法(网格布局)

网格布局 一、简单说明二、关键代码三、流程图四、例子说明1. 有17个“按钮”排列&#xff08;1&#xff09;源码A&#xff08;2&#xff09;运行效果 2. 有36个“按钮”排列&#xff08;1&#xff09;源码B&#xff08;2&#xff09;源码B运行效果 3. 有12个“按钮”排列&…

Grid布局介绍

1、什么是Grid布局 ​     Grid布局即网格布局&#xff0c;是一种新的css模型&#xff0c;一般是将一个页面划分成几个主要的区域&#xff0c;定义这些区域的大小、位置和层次等关系&#xff0c;是目前唯一一种css二维布局。 2、和flex布局的区别 ​     Grid布局和fle…

Java GridLayout(网格布局)布局管理器

GridLayout&#xff08;网格布局&#xff09; ​ GridLayout 布局管理器将容器分割成纵横线分隔的网格 &#xff0c; 每个网格所占的区域大小相同。当向使用 GridLayout 布局管理器的容器中添加组件时&#xff0c; 默认从左向右、 从上向下依次添加到每个网格中 。 与 FlowLay…

css经典布局——圣杯布局

圣杯布局和双飞翼布局一直是前端面试的高频考点&#xff0c;圣杯布局的出现是来自由 Matthew Levine 在 2006 年写的一篇文章 《In Search of the Holy Grail》。 比起双飞翼布局&#xff0c;它的起源不是源于对页面的形象表达。在西方&#xff0c;圣杯是表达“渴求之物”的意思…

CSS响应式布局(自适应布局)

CSS 响应式布局也称自适应布局&#xff0c;是 Ethan Marcotte 在 2010 年 5 月份提出的一个概念&#xff0c;简单来讲就是一个网站能够兼容多个不同的终端&#xff08;设备&#xff09;&#xff0c;而不是为每个终端做一个特定的版本。这个概念是为解决移动端浏览网页而诞生的。…

flex布局(详解)

目录 前言 一、何为Flex布局 二、基本概念 三、容器的属性 3.1 flex-direction属性 3.2 flex-wrap属性 3.3 flex-flow 3.4 justify-content属性 3.5 align-items属性 3.6 align-content属性 四、项目的属性 4.1 order属性 4.2 flex-grow属性 4.3 flex-shrink属性 …

Redis各类数据结构应用场景总结

Redis各类数据结构应用场景总结 引言String应用场景 List应用场景 Hash应用场景 Set应用场景 ZSet应用场景 小结 引言 实际面试过程中更多看重的是对Redis相关数据结构的活学活用&#xff0c;同时也可能会引申出Redis相关底层数据结构原理的实现&#xff0c;笔者最近面试过程中…

CSS基本布局——grid布局

grid布局简介&#xff1a; Grid布局是将容器划分成“行”和“列”&#xff0c;产生单元格&#xff0c;然后指定“项目所在”的单元格&#xff0c;可以看作是二维布局。 基本概念&#xff1a; 容器&#xff08;container&#xff09;——有容器属性项目&#xff08;items&…

【CSS布局】—— flex(弹性)布局

赶快悄悄的努力起来吧&#xff0c;不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享&#xff0c;感觉有用的小伙伴可以点个订阅&#xff0c;不定时更新相关面试题&#xff1a;面试专栏 。 文章目录 &#x1f33c;前言&#x1f33b;正文1、弹性盒子模型是什么&#x…

火列星屯--最强大的CSS布局方案

一、总论 首先给出结论&#xff1a;网格布局&#xff08;Grid&#xff09;是最强大的 CSS 布局方案。 虽说如此&#xff0c;但是仍要重视具体的应用场景&#xff0c;如果有其他写法可以提高代码的简洁和可读性&#xff0c;未必非要选择Gird不可。 网格布局就如同它的字面意思…

常见的布局方式

1.弹性布局---flex布局 弹性布局是一种常见且好用的布局方式&#xff0c;它可以让结构中的内容自适应不同的分辨率&#xff0c;简化的代码的书写。 使用方法 给父盒子加上display:flex;默认子元素不换行&#xff0c;如果装不开&#xff0c;子元素会缩小元素的宽度。 父级元…

前端开发常见的几种布局方式

作为前端开发工程师&#xff0c;布局方式有多种&#xff0c;对于不同的场景可以使用不同的布局方式&#xff0c;那么我们就先来简单的来了解一下&#xff0c;那些前端开发必须了解的布局。 一. 静态布局&#xff08;static layout&#xff09; 即传统的Web布局&#xff0c;网页…

android系统启动流程之zygote(Native)启动分析

zygote有一部分运行在native,有一部分运行在java层&#xff0c;它是第一个进入java层的进程 zygote在启动时&#xff0c;在init.${ro.zygote}.rc脚本中&#xff0c;里面描述了zygote是如何被启动的&#xff0c; 当init进程解析到zygote.rc文件时&#xff0c;将根据解析出来的命…

No117.精选前端面试题,享受每天的挑战和学习

文章目录 断点续传怎么做的秒传怎么实现var let const 块级作用域ts Partial Omit 怎么实现的箭头函数有哪些限制箭头函数为什么不能作为构造函数promise常用apiMap和Object的区别vue怎么实现双向绑定 断点续传怎么做的 断点续传是指在文件下载或上传过程中&#xff0c;当连接…