三: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 对象引用的方法

  1. ClassPathXmlApplicationContext -> 通过类路径
  2. 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

原文地址:https://www.cnblogs.com/feimo/p/3090508.html