三:ApplicationContex 应用上下文容器
从ApplicationContex 应用上下文容器中获取bean和从bean工厂容器中获取bean
具体案例:
1 //从ApplicationContext中取bean 2 ApplicationContext ac=new ClassPathXmlApplicationContext("com/hsp/ioc/beans.xml"); 3 //当我们去实例化beans.xml,该文件中配置的bean被实例(该bean scope是 singleton)从bean中取出student 4 5 6 //如果我们使用beanfactory去获取bean,当你只是实例化该容器, 那么 7 //容器的bean不被实例化,只有当你去使用getBean某个bean时,才会实时的创建. 8 9 BeanFactory factory = new XmlBeanFactory( 10 new ClassPathResource("com/hsp/ioc/beans.xml")); 11 factory.getBean("student");
结论:
1.如果使用ApplicationContext ,则配置的bean如果是 singlton不管你用不用,都被实例化.(好处就是可以预先加载,缺点就是耗内存)
2.如果是 BeanFactory ,则当你获取beanfacotry时候,配置的bean不会被马上实例化,当你使用的时候,才被实例(好处节约内存,缺点就是速度)
3.规定: 一般没有特殊要求,应当使用ApplicatioContext完成(90%)
bean 的 scope的细节
1 //入门案例: 2 //获取两个student 3 Student s1=(Student) ac.getBean("student"); 4 Student s2=(Student) ac.getBean("student"); 5 System.out.println(s1+" "+s2);
三种获取ApplicationContext 对象引用的方法
- ClassPathXmlApplicationContext -> 通过类路径
- FileSystemXmlApplicationContext -> 通过文件路径
举例:
1 ApplicationContext ac=new FileSystemXmlApplicationContext("文件路径beans.xml / applicationContext.xml");
3.XmlWebApplicationContext
bean的生命周期
① 实例化(当我们的程序加载beans.xml文件),把我们的bean(前提是scope=singleton)实例化到内存
② 调用set方法设置属性
③ 如果你实现了bean名字关注接口(BeanNameAware) 则,可以通过setBeanName获取id号
④ 如果你实现了 bean工厂关注接口,(BeanFactoryAware),则可以获取BeanFactory
⑤ 如果你实现了 ApplicationContextAware接口,则调用方法
1 //该方法传递ApplicationContext 2 3 public void setApplicationContext(ApplicationContext arg0) 4 5 throws BeansException { 6 7 // TODO Auto-generated method stub 8 9 System.out.println("setApplicationContext"+arg0); 10 11 12 13 }
⑥ 如果bean 和 一个后置处理器关联,则会自动去调用 Object postProcessBeforeInitialization方法
⑦ 如果你实现InitializingBean 接口,则会调用 afterPropertiesSet
⑧ 如果自己在<bean init-method=”init” /> 则可以在bean定义自己的初始化方法.
⑨ 如果bean 和 一个后置处理器关联,则会自动去调用 Object postProcessAfterInitialization方法
⑩ 使用我们的bean
11. 容器关闭
12. 可以通过实现DisposableBean 接口来调用方法 destory
13. 可以在<bean destory-method=”fun1”/> 调用定制的销毁方法
小结: 我们实际开发中往往,没有用的这么的过程,常见的是:
1->2->6->10->9->11