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 配置。

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

  1. Spring Ioc 之 Bean的加载(1)(生命周期)

    在之前的文章中,我们分析了Spring的Ioc的初始化过程,实际上就是把 beanName 和 BeanDefinition 注册到DefaultListableBeanFactory的map中. 在 ...

  2. spring学习之将类交给spring管理,bean的注入,scope,集合注入,自动装配,生命周期,迟加载

    一.将类交给spring管理(IOC) 1.将类交给spring容器管理 如何将一个类交给spring容器进行管理呢? 方法很简单,只需要在applicationContext.xml中加入对应的xm ...

  3. javaweb_笔记1(系统架构;servlet分析,注册,生命周期;Servletconfig对象(四个方法)和Servletcontext对象;http协议,get,post)

    1.关于系统架构 1.1系统架构包括 C/S架构: Client/Server(客户端/服务器) 例如电脑上安装的各种软件,qq等,需要安装特定的软件 优点: 速度快(软件中数据大部分在客户端中,少量 ...

  4. 微信小程序之程序、页面注册及生命周期

    程序注册 App() App() 函数用来注册一个小程序.接受一个 object 参数,其指定小程序的生命周期函数等. object参数说明: 前台.后台定义: 当用户点击左上角关闭,或者按了设备 H ...

  5. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)...

    一.IOC控制反转概念 控制反转(IOC)是一种通过描述(在Java中可以是XML或者是注解)并通过第三方去生产或获取特定对象的方式. 主动创建模式,责任在于开发者,而在被动模式下,责任归于Ioc容器 ...

  6. Bean的作用域和生命周期-----Spring

    1.之前学过的变量的作用域:是指变量在方法中或者作用域中的某种行为,现在我们来进行了解一下Bean的作用域 咱们的Java中的公共类称之为Bean或者是JavaBean,Spring对象中的生命周期指 ...

  7. 新手一看就懂的Spring Bean生命周期

    Bean的作用域 在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean.简单地讲,bean就是由IoC容器初始化.装配及管理的对象 几种作用域中,requ ...

  8. Spring源码深度解析,Spring源码以及Bean的生命周期(五)(附代码示例:)

    五)Bean 的生命周期,创建---初始化---销毁的过程 目录 五)Bean 的生命周期,创建---初始化---销毁的过程 一 ,  指定初始化方法 init-method 方法​ 二 ,指定销毁 ...

  9. spring bean的作用域和生命周期

    一.spring bean的作用域 五种作用域:singleton.prototype.request.session.globalSession request.session和global ses ...

最新文章

  1. 桌面倒计时2.0 涉及知识点详解及源码分享
  2. “醒事”就在一瞬间 --- 一个真实的故事 (文PPT)
  3. 苹果手机at系统_iOS14系统苹果手机如何设置充满电提示音?
  4. Tomcat无法访问中文路径的解决办法
  5. python中abc属于字符串吗_在Python中,字符串s = 'abc',那么执行表达式s+'d'之后,s的打印结果是( )。...
  6. LeetCode 391. 完美矩形(set检查顶点+面积检查)
  7. Python | 如何强制除法运算为浮点数? 除数一直舍入为0?
  8. java连接ftp一直阻塞
  9. Snagit 2019 for Mac(最好用的截图软件)v2019.1.11汉化版 MacOS 11 Big Sur支持
  10. JavaWeb之路径问题
  11. 最难的几道Java面试题,看看你跪在第几个?
  12. Linux环境:可变剪切分析软件rMATS安装、使用与解读
  13. BeanUtils.populate的作用
  14. 我的物联网大学【第二章】:Luat的出世
  15. Open3d读写ply点云文件
  16. Python基础笔记(二)整数缓存、字符串驻留机制、字符串格式化等
  17. Delphi中的线程类Thread
  18. 无人机——开源飞控简介
  19. 智能网联封闭测试场和开放道路测试政策情况全扫描(2022版)
  20. AD学习笔记(四)PCB布局分析

热门文章

  1. 使用HomeBrew安装各种软件(长期更新)
  2. 西安科技大学学分计算机制,干货 | 关于绩点和学分的二三事
  3. 《Java 核心技术面试》课程笔记(十一)
  4. 无法解析的外部符号的几个原因
  5. galera mysql_MySQL高可用(Galera Cluster)
  6. android 阿拉伯语言,android - 阿拉伯语言的语音识别
  7. 24届春招百度暑假实习笔试第二题
  8. 大数据建模、分析、挖掘技术应用的进阶之路
  9. 营销科学年度复盘|9个数字,见证“科学增长”的力量
  10. 7月各国入境政策汇总!