深入Spring专题(17)

62 阅读2分钟

这是我参与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>