<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id= "moocApplicationContext" class="com.imooc.aware.MoocApplicationContext"></bean>
</beans>
package com.imooc.test.aware;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import com.imooc.ioc.interfaces.UnitTestBase;
@RunWith(BlockJUnit4ClassRunner.class)
public class TestAware extends UnitTestBase{
public TestAware(){
super("classpath:spring-aware.xml");
}
@Test
public void testMoocApplicationContext(){
}
}
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("MoocApplicationContext:"+applicationContext.getBean("moocApplicationContext"));
}
}
运行结果:
利用setApplicationContext方法获得配置文件里的bean。
package com.imooc.test.aware;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import com.imooc.ioc.interfaces.UnitTestBase;
@RunWith(BlockJUnit4ClassRunner.class)
public class TestAware extends UnitTestBase{
public TestAware(){
super("classpath:spring-aware.xml");
}
@Test
public void testMoocApplicationContext(){
System.out.println("testMoocApplicationContext:"+super.getBean("moocApplicationContext").hashCode());
}
}
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("MoocApplicationContext:"+applicationContext.getBean("moocApplicationContext").hashCode());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id= "moocApplicationContext" class="com.imooc.aware.MoocApplicationContext"></bean>
</beans>
运行结果:
说明:test里面得到的bean的实例和在bean定义实现ApplicationContextAware接口并覆盖setApplicationContext方法的时候,从这个applicationContext得到的bean的实例是一致的。也就说我们成功地把当前applicationContext成功地写到了我们的MoocApplicationContext中来。
可以用这种方式(private ApplicationContext applicationContext)来声明,用(this.applicationContext=applicationContext)来赋值,这样在其他方法中,就可以用applicationContext来进行操作。
package com.imooc.aware;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class MoocApplicationContext implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext=applicationContext;
System.out.println("MoocApplicationContext:"+applicationContext.getBean("moocApplicationContext").hashCode());
}
}
获得beanId:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- <bean id= "moocApplicationContext" class="com.imooc.aware.MoocApplicationContext"></bean> -->
<bean id= "moocBeanName" class="com.imooc.aware.MoocBeanName"></bean>
</beans>
package com.imooc.test.aware;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import com.imooc.ioc.interfaces.UnitTestBase;
@RunWith(BlockJUnit4ClassRunner.class)
public class TestAware extends UnitTestBase{
public TestAware(){
super("classpath:spring-aware.xml");
}
/*@Test
public void testMoocApplicationContext(){
System.out.println("testMoocApplicationContext:"+super.getBean("moocApplicationContext").hashCode());
}*/
@Test
public void testMoocBeanName(){
System.out.println("testMoocBeanName:"+super.getBean("moocBeanName"));
}
}
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);
}
}
运行结果:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- <bean id= "moocApplicationContext" class="com.imooc.aware.MoocApplicationContext"></bean> -->
<bean id= "moocBeanName" class="com.imooc.aware.MoocBeanName"></bean>
</beans>
package com.imooc.test.aware;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import com.imooc.ioc.interfaces.UnitTestBase;
@RunWith(BlockJUnit4ClassRunner.class)
public class TestAware extends UnitTestBase{
public TestAware(){
super("classpath:spring-aware.xml");
}
/*@Test
public void testMoocApplicationContext(){
System.out.println("testMoocApplicationContext:"+super.getBean("moocApplicationContext").hashCode());
}*/
@Test
public void testMoocBeanName(){
System.out.println("testMoocBeanName:"+super.getBean("moocBeanName").hashCode());
}
}
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 {
private String beanName;
@Override
public void setBeanName(String name) {
this.beanName=name;
System.out.println("MoocBeanName:"+name);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
System.out.println("setApplicationContext:"+applicationContext.getBean(this.beanName).hashCode());
}
}
在第一个接口里面得到beanName,并把值赋值给成员变量(private String beanName;this.beanName=name;);在另一个bean里通过容器的getBean方法得到从setBeanName传入的这个bean实例
运行结果:
两个hashCode一样,说明无论是通过aware接口传入,还是通过启动的这种getbean传入,效果是一样的,从容器中得到相同的bean实例。