• 初识Spring Bean


    Bean在Spring和SpringMVC中很常见,那Bean到底是什么的?这个问题值得探讨。

      是什么?

    Spring 官方文档对 bean 的解释是:

    In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.

    翻译过来就是:

    在 Spring 中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。bean是一个由Spring IoC容器实例化、组装和管理的对象。

    概念简单明了,我们提取处关键的信息:

    1. bean是对象,一个或者多个不限定
    2. bean由Spring中一个叫IoC的东西管理
    3. 我们的应用程序由一个个bean构成

      所以说:

      Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化)。而Bean就是实例这个对象的,这样才能去使用这些方法以及属性。

      注意:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解

    这里顺带提一下@bean:

      @Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名

      下面看一个例子就懂了:

    下面是@Configuration里的一个例子

    1 @Configuration
    2 public class AppConfig {
    3 
    4     @Bean
    5     public TransferService transferService() {
    6         return new TransferServiceImpl();
    7     }
    8 
    9 }

    这个配置就等同于之前在xml里的配置:

    1   <beans>
    2       <bean id="transferService"  class="com.acme.TransferServiceImpl"/>
    3   </beans>    

      @Bean明确地指示了一种方法,什么方法呢——产生一个bean的方法,并且交给Spring容器管理;从这我们就明白了为什么@Bean是放在方法的注释上了,因为它很明确地告诉被注释的方法,你给我产生一个Bean,然后交给Spring容器,剩下的就别管了。

    在Spring中,你标识一个@符号,那么Spring就会来看看,并且从这里拿到一个Bean或者给出一个Bean  

      有什么?

        在Spring中有三种配置方案:

          1.在XML中进行显示配置
          2.使用Java代码进行显示配置
          3.隐式的bean发现机制和自动装配

          推荐方式: 3>2>1

    这里说一下注释:

      我们把注释分为两种

    1、一类是使用Bean,即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;

    2、一类是注册Bean,@Component , @Repository , @ Controller , @Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。

    Bean 的生命周期

    (小声哔哔:杀了我吧~~)

    在spring中,singleton属性默认是true,只有设定为false,则每次指定别名取得的Bean时都会产生一个新的实例

    一个Bean从创建到销毁,如果是用BeanFactory来生成,管理Bean的话,会经历几个执行阶段

    1:Bean的建立:

    容器寻找Bean的定义信息并将其实例化。

    2:属性注入:

    使用依赖注入,Spring按照Bean定义信息配置Bean所有属性

    3:BeanNameAware的setBeanName():

    如果Bean类有实现org.springframework.beans.BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。

    4:BeanFactoryAware的setBeanFactory():

    如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。

    5:BeanPostProcessors的ProcessBeforeInitialization()

    如果有org.springframework.beans.factory.config.BeanPostProcessors和Bean关联,那么其postProcessBeforeInitialization()方法将被将被调用。

    6:initializingBean的afterPropertiesSet():

    如果Bean类已实现org.springframework.beans.factory.InitializingBean接口,则执行他的afterProPertiesSet()方法

    7:Bean定义文件中定义init-method:

    可以在Bean定义文件中使用"init-method"属性设定方法名称例如:

    如果有以上设置的话,则执行到这个阶段,就会执行initBean()方法

    8:BeanPostProcessors的ProcessaAfterInitialization()

    如果有任何的BeanPostProcessors实例与Bean实例关联,则执行BeanPostProcessors实例的ProcessaAfterInitialization()方法

    此时,Bean已经可以被应用系统使用,并且将保留在BeanFactory中知道它不在被使用。有两种方法可以将其从BeanFactory中删除掉:


    1:DisposableBean的destroy()

    在容器关闭时,如果Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法

    2:Bean定义文件中定义destroy-method

    在容器关闭时,可以在Bean定义文件中使用"destroy-method"属性设定方法名称

  • 相关阅读:
    TERSUS笔记员工信息518Tersus数据库下拉菜单<Placeholder Text>默认值点击事件
    TERSUS笔记员工信息517Tersus数据库元件SQL语句传入相关问题总结
    010editor 注册分析[1]
    StartAllBack_3.3.5 记录
    pdb 符号路径
    win10 双机调试环境
    省选联考 2022 题解
    AtCoder Regular Contest 139
    AGC 营业记录
    AtCoder Grand Contest 029
  • 原文地址:https://www.cnblogs.com/fzzzjjj/p/11412944.html
Copyright © 2020-2023  润新知