一.概念

   Bean 是 Spring 装配的组件模型,一切实体类都可以配置成一个 Bean ,进而就可以在任何其他的 Bean 中使用,一个 Bean 也可以不是指定的实体类,这就是抽象 Bean 。

二.作用

1.用于配置对象让Spring来创建,

2.默认情况下调用类中的无参构造函数,如果没有无惨构造函数则无法创建

.属性

1.id:给对象在容器中提供一个唯一标识。用于获取对象。

2.class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。

3.scope:指定对象的作用范围。 

  * Spring2.0 之前 Bean 只有两种作用域,即 Singleton( 单例 ) 和 non-Singleton( 也 称 prototype) , Spring2.0 以后,增加了 session 、 request 和 global session 三个专用于 Web 应用 程序上下文的 Bean 

* singleton :默认值,单例的.

* prototype :多例的.

* request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.

* session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.

* global session :WEB 项目中,应用在 Portlet 环境.如果没有 Portlet 环境那么 globalSession 相当于 session.

四. bean 的作用范围和生命周期

1.单例对象:scope="singleton"

一个应用只有一个对象的实例。它的作用范围就是整个引用。

生命周期:

对象出生:当应用加载,创建容器时,对象就被创建了。

对象活着:只要容器在,对象一直活着。

对象死亡:当应用卸载,销毁容器时,对象就被销毁了。

2.多例对象:scope="prototype"

每次访问对象时,都会重新创建对象实例。

生命周期:

对象出生:当使用对象时,创建新的对象实例。

对象活着:只要对象在使用中,就一直活着。

对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了。

五. 实例化 Bean 的三种方式 

1.第一种方式:使用默认无参构造函数

--在默认情况下:

它会根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败。

id 属性:指定 bean id,用于从容器中获取

class 属性:指定静态工厂的全限定类名

factory-method 属性:指定生产对象的静态方法 

创建Bean1

package demo3;


public class Bean1 {
    Bean1(){
        System.out.println("Bean1被实例化了");
    }
}

创建TestBean1

package demo3;

import org.junit.jupiter.api.Test;

public class TestBean1 {
    @Test
    public void test(){
        Bean1 bean1 = new Bean1();
    }
}

2.第二种方式:spring 管理静态工厂-使用静态工厂的方法创建对象

此种方式是:

使用 StaticFactory 类中的静态方法存入 spring 容器

id 属性:指定 bean id,用于从容器中获取

class 属性:指定静态工厂的全限定类名

factory-method 属性:指定生产对象的静态方法

第二种方式:

创建Bean2

package demo3;

public class Bean2 {
}

创建Bean2Factory工厂

package demo3;

public class Bean2Factory {
    public static  Bean2 getBean2(){
        System.out.println("通过自定义的静态方法返回Bean2实例");
        return new Bean2();
    }
}

创建TestBean2

package demo3;

import org.junit.jupiter.api.Test;

public class TestBean2 {
    @Test
    public void test(){
        Bean2 bean2 = Bean2Factory.getBean2();
    }
}

3.第三种方式:spring 管理实例工厂-使用实例工厂的方法创建对象

此种方式是:

先把工厂的创建交给 spring 来管理。

然后在使用工厂的 bean 来调用里面的方法

factory-bean 属性:用于指定实例工厂 bean id

factory-method 属性:用于指定实例工厂中创建对象的方法。

第三种方式:
创建Bean3

package demo3;

public class Bean3 {
}

创建Bean3Factory工厂

package demo3;

public class Bean3Factory {
    public Bean3 getBean3(){
        System.out.println("通过自定义工厂的普通方法(非静态方法)返回Bean3的实例");
        return new Bean3();
    }
}

创建TestBean3

package demo3;

import org.junit.jupiter.api.Test;

public class TestBean3 {
    @Test
    public void test(){
        Bean3 bean3 = (new Bean3Factory()).getBean3();
    }
}