这是我参与2022首次更文挑战的第23天,活动详情查看2022首次更文挑战
Bean别名命名
验证使用不同的名称从ApplicationContext实例中获取同一个bean,它们是否相同的bean。
public class BeanNameAliasing{
public static void main(String... args){
GenericXmlApplicationContext ctx=new GenericXmlApplicationContext();
ctx.load("classpath:spring/app-context.xml");
ctx.refresh();
String s1=(String)ctx.getBean("tony");
String s2=(String)ctx.getBean("tom");
String s3=(String)ctx.getBean("tona");
String s4=(String)ctx.getBean("tomy");
String s5=(String)ctx.getBean("ton");
System.out.println(s1==s2);
System.out.println(s2==s3);
System.out.println(s3==s4);
System.out.println(s4==s5);
Map<String,String> beans=ctx.getBeansOfType(String.class);
if(beans.size() == 1){
System.out.println("只有一种String类型的Bean");
}
ctx.close();
}
}
执行后输出5次true,同时输出只有一种String类型的Bean,证明使用不同名称访问的bean实际上是相同的bean。
使用注解配置的Bean命名
当使用注解声明Bean定义时,Bean命名与XML有不同,使用构造型注解@Component及其所有特例,如@Service、@Repository和@Controller声明Bean定义。
@Component
public class Singer{
public void sing(){
System.out.println("Component name");
}
}
使用@Component注解编写的Singer类型的单例Bean的声明,Spring IoC容器使用类名首字母小写的规则来决定了Bean的唯一标识符。因此使用@Component("singer")相当于@Component注解Singer类,如果想以不同的方式命名Bean,@Component注解必须接收Bean名称作为参数。
@Component("sing")
public class Singer{
public void sing(){
System.out.println("Component name");
}
}
Bean实例化模式
默认情况下Spring中的所有bean都是单例的,这意味着Spring维护一个bean的实例,所有依赖对象都使用同一个实例,对ApplicationContext.getBean()的所有调用都会返回同一实例。Spring不仅限于使用单例实例,仍然可创建新的bean实例,以满足每个依赖项以及对getBean()的调用。如果正在使用一个单例对象,发现它不适合多线程访问,需要将它改为非单例(原型)。
<beans ...>
<bean id="nonSingleton" class="com.ozx.Singer" scope="prototype" c:_0="Tony"></bean>
</beans>