bean创建过程、spring BeanFactory的实现、spring aware

Bean的创建过程:

image.png

Spring beanFactory的工厂模式实现:

    解析<bean>标签,存到一个Map<String, Object> beans中

    People o = (People)factory.getBean("p");

    因为map存的是object类型,所以取出时需要强制类型转换

Bean的生命周期:

image.png

spring aware的目的是为了让Bean获得spring容器的服务,bean继承applicationContextAware可以获得spring容器的所有服务,但原则上还是用到什么接口,继承什么接口。(如beanNameAware,BeanFactoryAware...)

beanNameAware接口:获得本身bean的id属性。

    void setBeanName(String name)

    该方法的name参数就是该bean的id属性,调用setBeanName方法可以让bean获取得自身的id属性

@Service public class BeanNameAwareTest implements BeanNameAware {   

    private String name;    

    @Override    

    public void setBeanName(String name) { 

        System.out.println("setBeanName方法,id是"+name);        

        this.name = name;    

    }    

    public String getBeanName() {        

        return this.name;    

    } 

}

获取bean:

@Autowired private BeanNameAwareTest beanNameAwareTest; 

public void aware()  {   

    System.out.println("beanName:"+beanNameAwareTest.getBeanName()); 

    beanNameAwareTest.setBeanName("beanName"); 

    System.out.println("beanName:"+beanNameAwareTest.getBeanName()); 

}

结果:

    setBeanName方法,id是beanNameAwareTest//bean被实例化时自动调用的

    beanName:beanNameAwareTest

    setBeanName方法,id是beanName//手动调用的setBeanName方法   beanName:beanName


BeanFactoryAware接口:相应的beanfactory的实例引用

    void setBeanFactory(BeanFactory beanFactory)

    通过这个方法的参数创建它的BeanFactory实例,实现了BeanFactoryAware接口,就可以让Bean拥有访问Spring容器的能力。缺点:导致代码与spring的api耦合在一起。

@Service 

public class BeanFactoryAwareTest implements BeanFactoryAware {    

    private BeanFactory beanFactory;    

    @Override    

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {            

        this.beanFactory = beanFactory;    

    } 

}

获取bean工厂进行bean操作:

@Autowired 

private BeanFactoryAwareTest beanFactoryAwareTest; 

public void aware()  {        

    System.out.println("通过bean工厂得到一个bean:"+beanFactoryAwareTest.getBeanFactory().getBean("beanFactoryAwareTest")); 

}


ApplicationContextAware接口:被注入applicationContext实例

    setApplicationContext(ApplicationContext context)

    使用参数context用来创建它的applicationContext实例,缺点:导致代码与spring的api耦合在一起。

public class ContextAwareTest implements ApplicationContextAware{

        @Override

    public void setApplicationContext(ApplicationContext arg0){

          applicationContext = arg0;

          People= (People)applicationContext.getBean("people");

        }

}

使用场景:

image.png

    比如,根据环境的不同,target需要对应不同的资源,可以首先加载一个source类,其中有一个与环境有关的属性mode;

    得到beanFactory,getBean(source)再对其mode属性判断,做出不同的处理,get相同的bean,赋给target


猜你喜欢

转载自blog.51cto.com/13580976/2156931