Spring bean 的三种实例化方式
id 和 name 的区别
- id必须唯一
- name 可以包含特殊字符
class 用于设置一个类的完全路径,主要作用是IOC容器生成类的实例
bean作用域 通过scope进行配置
类别 | 说明 |
---|---|
singleton(default) | 在SpringIOC的容器中仅存在一个bean的实例,bean以单例的方式存在 |
prototype | 每次调用getBean()的时候都会返回一个新的实例 |
request | 每次HTTP请求的时候都会创建一个新的bean,该作用域仅适用于WebApplicationContext |
session | 同一个HTTP Session共享一个bean,不同的HTTP Session使用不同的bean。仅适用于 WebApplicationContext |
Spring 的 bean 有三种实例化方式:
- 无参构造器实例化
- 静态工厂实例化
- 实例工厂实例化
ApplicationContext在加载配置文件时将所有单例模式生成的类实例化
以下通过一个简单的示例分别测试三种方法
文件路径
spring_bean
- src
- - main
- - - java
- - - - com.zhangxin9727.bean
- - - - - Bean1.java
- - - - - Bean2.java
- - - - - Bean2Factory.java
- - - - - Bean3.java
- - - - - Bean3Factory.java
- - - resources
- - - - applicationContext.xml
- - test
- - - java
- - - - SpringBeanTest.java
- pom.xml
主要文件
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<groupId>com.zhangxin9727</groupId>
<artifactId>spring_bean</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Bean1.java
package com.zhangxin9727.bean;
//bean的第一种实例化方法:采用无参构造器
public class Bean1 {
public Bean1() {
System.out.println("无参构造器实例化");
}
}
Bean2.java
package com.zhangxin9727.bean;
//bean的第二种实例化方法:采用静态工厂实例化
public class Bean2 {
}
Bean2Factory.java
package com.zhangxin9727.bean;
//Bean2的静态工厂
public class Bean2Factory {
public static Bean2 createBean2() {
System.out.println("静态工厂实例化");
return new Bean2();
}
}
Bean3.java
package com.zhangxin9727.bean;
//bean的第三种实例化方法:采用实例工厂实例化
public class Bean3 {
}
Bean3Factory.java
package com.zhangxin9727.bean;
//Bean3的实例工厂
public class Bean3Factory {
public Bean3 createBean3() {
System.out.println("实例工厂实例化");
return new Bean3();
}
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--无参构造器实例化-->
<bean id="bean1" class="com.zhangxin9727.bean.Bean1" scope="singleton"/>
<!--静态工厂实例化-->
<bean id="bean2" class="com.zhangxin9727.bean.Bean2Factory" factory-method="createBean2"/>
<!--实例工厂实例化-->
<bean id="bean3Factory" class="com.zhangxin9727.bean.Bean3Factory"/>
<bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3"/>
</beans>
SpringBeanTest.java
import com.zhangxin9727.bean.*;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringBeanTest {
@Test
//测试无参构造器实例化
public void test1() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Bean1 bean = (Bean1) applicationContext.getBean("bean1");
}
@Test
//测试静态工厂实例化
public void test2() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Bean2 bean = (Bean2) applicationContext.getBean("bean2");
}
@Test
//测试实例工厂实例化
public void test3() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Bean3 bean = (Bean3) applicationContext.getBean("bean3");
}
}