Spring 的 bean 默认都是单实例的, 如果我们想要每次都从 IoC 容器中获取的都是新的 bean 的实例,那么我们就需要使用多实例的 bean , 此时我们就要使用到 @Scope 注解
@Scope中的属性
value
scopeName
ScopeName 和 value 两个属性表示的是同一个意思, 他们互相定义了别名。 取值有两个
singleton (Spring IoC 容器默认就是单例的,可以不写)
prototype
这两个值在 ConfigurableBeanFactory 接口中有两个常量 SCOPE_SINGLETON 和 SCOPE_PROTOTYPE 在配置的时候,可以直接写字符串也可以使用这两个常量。
proxyMode
等价于 xml 配置 <aop:scoped-proxy/> 不经常使用
下面我们看代码验证
Person 类
public class Person {
private String name;
private Integer age;
public Person() {
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
// 省略 getter setter 和 toString 方法
}
配置类
@Configuration
public class ProtoTypeConfig {
@Scope("prototype")
@Bean
public Person person() {
return new Person("李四", 55);
}
测试代码
@Test
public void test4() {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ProtoTypeConfig.class);
Person person1 = ctx.getBean(Person.class);
Person person2 = ctx.getBean(Person.class);
System.out.println("person1 HashCode " + person1.hashCode());
System.out.println("person2 HashCode " + person2.hashCode());
System.out.println(person1 == person2);
}
输出结果
取出的是两个不同的 bean
网友评论