spring学习-ApplicationContext-spring上下⽂深⼊理解
4⽉份开始复习⼀遍spring相关知识。让⾃⼰巩固⼀下spring⼤法的深奥益处,所以就看了⼤佬的博客,转载留下来⽇后继续研读。认为重点的标记为红⾊
Spring有两个核⼼接⼝:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的⼦接⼝。他们都可代表Spring容
器,Spring容器是⽣成Bean实例的⼯⼚,并且管理容器中的Bean。
Bean是Spring管理的基本单位,在基于Spring的Java EE应⽤中,所有的组件都被当成Bean处理,包括数据源、Hibernate的SessionFactory、事务管理器等。在Spring中,Bean的是⼀个⾮常⼴义的概念,任何的Java对象、Java组件都被当成Bean处理。
⽽且应⽤中的所有组件,都处于Spring的管理下,都被Spring以Bean的⽅式管理,Spring负责创建Bean实例,并管理他们的⽣命周期。Bean在Spring容器中运⾏,⽆须感受Spring容器的存在,⼀样可以接受Spring的依赖注⼊,包括Bean属性的注⼊,协作者的注⼊、依赖关系的注⼊等。
Spring容器负责创建Bean实例,所以需要知道每个Bean的实现类,Java程序⾯向接⼝编程,⽆须关⼼Bean实例的实现类;但是Spring容器必须能够精确知道每个Bean实例的实现类,因此Spring配置⽂件必
须精确配置Bean实例的实现类。
⼀、Spring容器
Spring容器最基本的接⼝就是BeanFactor。BeanFactory负责配置、创建、管理Bean,他有⼀个⼦接⼝:ApplicationContext,因此也称之为Spring上下⽂。Spring容器负责管理Bean与Bean之间的依赖关系。
BeanFactory接⼝包含以下⼏个基本⽅法:
Ø Boolean containBean(String name):判断Spring容器是否包含id为name的Bean实例。
Ø <T> getBean(Class<T> requiredTypr):获取Spring容器中属于requiredType类型的唯⼀的Bean实例。
Ø Object getBean(String name):返回Sprin容器中id为name的Bean实例。
Ø <T> T getBean(String name,Class requiredType):返回容器中id为name,并且类型为requiredType的Bean
Ø Class <?> getType(String name):返回容器中指定Bean实例的类型。
调⽤者只需使⽤getBean()⽅法即可获得指定Bean的引⽤,⽆须关⼼Bean的实例化过程。即Bean实例的创建过程完全透明。
在使⽤BeanFactory接⼝时,我们⼀般都是使⽤这个实现类:org.springframework.l.XmlBeanFactory。然⽽ApplicationContext作为BeanFactory的⼦接⼝,使⽤它作为Spring容器会更加⽅便。它的实现类有:FileSystemXmlApplicationContext、ClassPathXmlApplicationContext、AnnotationConfigApplicationContext。
创建Spring容器实例时,必须提供Spring容器管理的Bean的详细配置信息。Spring的配置信息通常采⽤xml配置⽂件来设置,因此,创建BeanFactory实例时,应该提供XML配置⽂件作为参数。
XML配置⽂件通常使⽤Resource对象传⼊。Resource接⼝是Spring提供的资源访问接⼝,通过使⽤该接⼝,Spring能够以简单、透明的⽅式访问磁盘、类路径以及⽹络上的资源。
对于Java EE应⽤⽽⾔,可在启动Web应⽤时⾃动加载ApplicationContext实例,接受Spring管理的Bean⽆须知道ApplicationContext的存在。⼀般使⽤如下⽅式实例化BeanFactory:
1 //搜索当前⽂件路径下的l⽂件创建Resource对象
2 InputStreamSource isr = new FileSystemResource("l");
3 //以Resource对象作为参数创建BeanFactory实例
4 XmlBeanFactory factory = new XmlBeanFactory((Resource) isr);
5 或
6 ClassPathResource res = new ClassPathResource("l");
7 //以Resource对象作为参数创建BeanFactory实例
8 XmlBeanFactory factory = new XmlBeanFactory(res);
但是如果应⽤⾥⾯有多个属性配置⽂件,则应该采⽤BeanFactory的⼦接⼝ApplicationContext来创建BeanFactory的实例。ApplicationContext通常使⽤如下两个实现类: FileSystemXmlApplicationContext:以基于⽂件系统的XML配置⽂件创建ApplicationContext实例。
ClassPathXmlApplicationContext:以类加载路径下的XML配置⽂件创建的ApplicationContext实例。
如果需要同时加载多个XML配置⽂件,采⽤如下⽅式:
1 //搜索CLASSPATH路径,以classpath路径下的l、l⽂件创建applicationContex
t
2 ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"l","l"});
3
4 //以指定路径下的l、l⽂件创建applicationContext
5 ApplicationContext ctx1 = new FileSystemXmlApplicationContext(new String[]{"l","l"});
⼆、让Bean获取Spring容器
在前⾯简单的介绍了Spring容器。在Spring中我们可以使⽤Spring容器中getBean()⽅法来获取Spring容器中的Bean实例。在这样的访问模式下,程序中总是持有Spring容器的引⽤。但是在实际的应⽤中,Spring容器通常是采⽤声明式⽅式配置产⽣:记开发者只要在l⽂件中配置⼀个Listener,该Listener将会负责初始化Spring容器。在这种情况下,容器中Bean处于容器管理下,⽆须主动访问容器,只需要接受容器的注⼊管理即可。同时Bean实例的依赖关系通常也是由容器冬天注⼊,⽆须Bean实例主动请求。
在这种情况下,Sprig容器中Bean通常不会需要访问容器中其他的Bean—采⽤依赖注⼊,让Spring把被依赖的Bean注⼊到依赖的Bean 中即可。
实现BeanFactoryAware接⼝的Bean,拥有访问的BeanFactory容器的能⼒,实现BeanFactoryAware接⼝的Bean实例将会拥有对容器的访问能⼒。BeanFactoryAware接⼝仅有如下⼀个⽅法:
SetBeanFactory(BeanFactory beanFactory):该⽅法有⼀个参数beanFactory,该参数指向创建它的BeanFactory。
该⽅法将由Spring调动,当Spring调⽤该⽅法时会将Spring容器作为参数传⼊该⽅法。
1 public class Chinese implements ApplicationContextAware{
2
3 //将BeanFactory容器以成员变量保存
4 private ApplicationContext ctx;
5 /**
6 * 实现ApplicationContextAware接⼝实现的⽅法
7 */
8 public void setApplicationContext(ApplicationContext cyx)
9 throws BeansException {
10 = ctx;
11 }
12
spring framework组件13 //获取ApplicationContext的测试⽅法
14 public ApplicationContext getContext(){
15 return ctx;
16 }
17
18 }
上⾯的Chinese类实现了ApplicationContext接⼝,并实现了该接⼝提供的setApplicationContextAware()⽅法,这就使得该Bean实例可以直接访问到创建她的Spring容器。
将该Bean部署在Spring容器中。
测试类:
该程序先通过实例化的⽅法来获取ApplicationContext,然后通过chinese Bean来获得BeanFactory,并将两者进⾏⽐较。
1 public class ChineseTest {
2
3 public static void main(String[] args) {
4 ApplicationContext ctx = new ClassPathXmlApplicationContext("l");
5 Chinese c = Bean("chinese",Chinese.class);
6 System.out.Context());
7
8 System.out.Context()==ctx);
9
10 }
11 }
结果如下:
true
上⾯的代码虽然实现了ApplicationContextAware接⼝让Bean拥有了访问容器的能⼒,但是污染了代码,导致代码与Spring接⼝耦合在⼀起。所以,如果不是特别需要,⼀般不建议直接访问容器。
读李刚《轻量级Java EE企业应⽤实战》
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论