一.概念
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();
}
}