@Scope设置组件作用域
Spring 默认注册的 bean 都是单例模式的,如果需要设置其他模式,则使用@Scope注解,
@Scopde一共有4种模式:
- singleton: 单例,整个容器中只会有一个实例
- prototype: 多实例,每次获取都会生成一个新的实例
- request: 一个http请求生成一个实例
- session: 一个会话生成一个实例
单例模式
Config2.java
/**
* 配置类
* @author Demon-HY
* @date 2019-12-9
*/
@ComponentScan(value = "com.demon")
@Configuration
public class Config2 {
/**
* 给 Spring 容器注册一个 bean, bean 的 id 默认是方法名</br>
* 可以手动指定id: @Bean("方法名")
*/
@Scope(value = "singleton")
@Bean("user")
public User user() {
return new User("Demon-HY", 18);
}
}
IOCTest.java
package com.demon;
import com.demon.bean.User;
import com.demon.config.Config;
import com.demon.config.Config2;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author Demon-HY
* @date 2019-12-9
*/
public class IOCTest {
// 测试 Scope 单例
public void test2() {
// 通过注解方式生成 Spring 上下文
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config2.class);
User user1 = context.getBean(User.class);
User user2 = context.getBean(User.class);
System.out.println(user1 == user2); // true
}
}
多实例模式
Config2.java
/**
* 配置类
* @author Demon-HY
* @date 2019-12-9
*/
@ComponentScan(value = "com.demon")
@Configuration
public class Config2 {
/**
* 给 Spring 容器注册一个 bean, bean 的 id 默认是方法名</br>
* 可以手动指定id: @Bean("方法名")
*/
@Scope(value = "prototype")
@Bean("user")
public User user() {
return new User("Demon-HY", 18);
}
}
IOCTest.java
package com.demon;
import com.demon.bean.User;
import com.demon.config.Config;
import com.demon.config.Config2;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author Demon-HY
* @date 2019-12-9
*/
public class IOCTest {
// 测试 Scope 单例
public void test2() {
// 通过注解方式生成 Spring 上下文
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config2.class);
User user1 = context.getBean(User.class);
User user2 = context.getBean(User.class);
System.out.println(user1 == user2); // false
}
}
咖啡小馆
QQ群: 823971061 点击按钮入群