Spring中提供了一些Aware接口,这些可以让bean被初始化(加载xml)之后获得一些资源,这里我们着重讲2个接口:ApplicationContextAware与BeanNameAware
第一步:配置xml,并实现要继承的2个类和测试类
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="moocApplicationContext" class="com.imooc.aware.MoocApplicationContext"></bean>
<bean id="moocBeanName" class="com.imooc.aware.MoocBeanName"></bean>
</beans>
继承ApplicationContextAware的类
package com.imooc.aware;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class MoocApplicationContext implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println(applicationContext.getBean("moocApplicationContext").hashCode());
}
}
继承BeanNameAware的类
package com.imooc.aware;
import org.springframework.beans.factory.BeanNameAware;
public class MoocBeanName implements BeanNameAware {
@Override
public void setBeanName(String Name) {
System.out.println("MoocBeanName"+Name);
}
}
测试类
package com.imooc.aware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAware {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("spring-aware.xml");
}
}
原理:在加载xml时,继承过ApplicationContextAware的类在重载方法setApplicationContext可以获取某一个bean的实例,即在加载xml过程,就可定义对象的实例
同样的对于继承过BeanNameAware的类而言,通过重写setBeanName可以获得该类的bean的id。
说到这里,其实我们通常会让一个类同时继承它们两个,然后获得这个类bean的id,在通过getbean(id)获得该类的实例,这样我们就在xml初始化时就定义好了一个实例
我们改写MoocBeanName来进行测试
package com.imooc.aware;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class MoocBeanName implements BeanNameAware,ApplicationContextAware {
String lblname=null;
@Override
public void setBeanName(String Name) {
lblname=Name;
System.out.println("MoocBeanName"+Name);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println(applicationContext.getBean(lblname).hashCode());
}
}
|