码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-08-09 20:07:58      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:string   ack   ann   过程   工厂模式   类型转换   bsp   属性   new   

Bean的创建过程:

技术分享图片技术分享图片

Spring beanFactory的工厂模式实现:

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

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

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

Bean的生命周期:

技术分享图片技术分享图片

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");

        }

}

使用场景:

技术分享图片技术分享图片

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

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


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

标签:string   ack   ann   过程   工厂模式   类型转换   bsp   属性   new   

原文地址:http://blog.51cto.com/13580976/2156931

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!