1、Bean的别名
Bean的id必须是一个有效的标识符,因此id不能包含特殊字符。而Bean的别名支持各种特殊字符。
指定别名有两种方式 :
用的时候,别名和id的功能是一样的
User user = appContext.getBean("kaka",User.class);
2、Bean获取Spring容器
i.该Bean需要实现ApplicationContextAware接口
ii. 必须实现该接口中setApplicationContext方法。
(1)Dog.java
public class Dog implements ApplicationContextAware{
String kind;
ApplicationContext appContext;
public String getKind() {
return kind;
}
public void setKind(String kind) {
System.out.println("----setKind方法----");
this.kind = kind;
}
@Override
public String toString() {
return "Dog [kind=" + kind + "]";
}
public void bark(){
System.out.println(appContext.getMessage("bark", null,Locale.getDefault(Category.FORMAT)));
}
/**
* Spring会自动检测容器中所有Bean,如果发现某个Bean实现ApplicationContextAware接口,
* Spring容器就会在setter方法调用之后,自动调用setApplicationContext方法
* 当Spring容器调用该方法时,它会把容器自身作为参数传入
*/
@Override
public void setApplicationContext(ApplicationContext appContext)
throws BeansException {
this.appContext = appContext;
System.out.println(appContext);
}
}
(2)beans.xml配置
(3)测试:
可以看出Spring容器就会在setter方法调用之后,自动调用setApplicationContext方法。通过打印setApplicationContext(ApplicationContext appContext)方法获取到的appContext参数可知是ClassPathXmlApplicationContext。
3、Bean的作用域
设置Bean的作用域通过scope属性,该属性支持5种:
- singleton:单例。在整个spring容器生命周期中,该Bean永远都是同一个。
何时产生?→容器创建时
何时消亡?→容器销毁时
- prototype:
何时产生?程序getBean,spring就会创建它,然后就不管它了。
何时消亡?GC随时可能回收它。
相比之下,singleton具有更好的性能。它只要创建一次,可多次重复使用。
- request:只能在Web应用中使用,相当于一次请求内是singleton行为的。
- session:只能在Web应用中使用,相当于一次用户会话(session)内是singleton行为的。
- global session:只能在Portlet应用中使用,比较少用。
(1)如果没有设置scope属性,默认是singleton
①bean.xml配置
<!-- 默认就是singleton -->
<bean id="dogId" class="cony.domain.Dog">
<property name="kind" value="金毛犬"></property>
</bean>
<bean id="date" class="java.util.Date" scope="prototype"/>
②测试代码:
public void test() throws InterruptedException{
ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
System.out.println("----------------------");
// 如果你的Dog是singleton,无论何时获取Bean,永远都是同一个实例。
Dog dog1 = appContext.getBean("dogId",Dog.class);
Dog dog2 = appContext.getBean("dogId",Dog.class);
System.out.println(dog1 == dog2);//true
System.out.println("=====================================");
//每次getBean就会创建新的实例
Date date1 = appContext.getBean("date",Date.class);
System.out.println(date1);
Thread.sleep(2000);
Date date2 = appContext.getBean("date",Date.class);
System.out.println(date1==date2);//false
System.out.println(date2);
}
③结果:
可以看到Date两次时间都不一样,创建了两次实例