在使用Spring所提供的各种丰富而神奇的功能之前,必须在Spring IoC容器中装配好Bean,并建立Bean与Bean之间的关联关系。
控制反转(Inverser of Control ioc)是Spring容器的内核,AOP、声明式事务等功能都是在此基础上开花结果的。所谓Ioc,
就是通过容器来控制业务对象之间的依赖关系,而非传统实现中,由代码直接操控、这也就是“控制反转”概念的所在:控制权
由应用代码中转到了外部容器,控制权的转移,就是反转。控制权转移带来的好处就是降低了业务对象之间的依赖程度。
BeanFactory和ApplicationContext:
Spring通过一个配置文件描述了Bean和Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。
Spring的IoC容器在完成这些底层工作之后还提供了Bean实例缓存,生命周期管理,ean实例代理,事件发布,资源装载等高级服务。
Bean工程(com.springframework.beans.factory.BeanFactory)是Spring框架核心的接口,它提供了高级IoC的高级配置机制,
BeanFactory使管理不同类型的java对象成为可能,应用上下文(com.springframework.context.ApplicationContext)是建立在
BeanFactory基础之上,提供了更多面向应用的功能,还提供了国际化支持和框架事件体系,更易于创建实际应用。一般称BeanFactory
为IoC容器,而称ApplicationContext为应用上下文。
区分:BeanFactory是Spring框架的基础设施,面向Spring本身;ApplciationContext面向使用Spring框架的开发者,几乎所有的应用
场合都直接使用ApplicationContext而不是底层的BeanFactory。

BeanFactory介绍:
BeanFactory是一个工厂类,但它和传统的类工厂不同,传统的类工厂仅负责构造一个或几个类的实例,而BeanFactory是类的通用工厂,
他可以创建并管理各种累的对象。这些可被创建和管理的对象本身没有什么特别之处,仅是一个POJO,Spring称这些被创建和管理的java
对象为Bean。
beans.xml:Car的配置文件

beanfactory/BeanFactoryTest.java


ApplicationContext介绍:
ApplicationContext是由BeanFactory派生而来,提供了更多面向实际应用的功能,在BeanFactory中,很多功能都需要以编程的方式实现,
而在ApplicationContext中则可以通过配置的方式实现。
与BeanFactory初始化相似,ApplicationContext的初始化也很简单,如果配置文件防止在类路径下,则可以优先使用ClassPathXMLApplicationContext
实现类。
ApplicationContext ctx=new ClassPathApplicationContext("com/smart/context/beans.xml")
对于ClassPathXMLApplicationContext来说com/smart/context/beans.xml相当于classpath:com/smart/context/beans.xml
如果配置文件放置在文件系统的路径下,则可以优先考虑使用FileSystemXmlApplicationContext实现类
ApplicationContext ctx=new FileSystemApplicationContext("com/smart/context/beans.xml")
对于FileSystemApplicationContext来说com/smart/context/beans.xml相当于file:com/smart/context/beans.xml

还可以指定一组配置文件,Spring会自动将多个配置文件在内存中“整合”成一个配置文件
ApplicationContext ctx=new ClassPathXmlApplicationContext(new String[]{"conf/beans1.xml","conf/beans2.xml"})
当然FileSystemXMLApplicationContext和ClassPathXmlApplicationContext都可以显示使用带资源类型前缀的路径,他们的区别在于。如果不显示
指定资源类型前缀,句分别将路径解析为文件系统路径和类路径。
在获取ApplicationContext实例后,就可以像BeanFactory一样调用getBean(beanName)返回Bean了,ApplicationContext的初始化和BeanFactory
的初始化有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一个访问某个Bean时才实例化目标Bean;而ApplicationContext在
初始化应用上下文时就实例化所有单实例的Bean.因此ApplicationContext的初始化时间会比BeanFactory稍长一些,不过稍后的调用则没有“第一次惩罚”
的问题。
Spring3.0之处基于类注解的配置方式,主要功能来自于Spring的一个名为JavaConfig的子项目。一个标注@Configuration注解的POJO即可提供Spring
所需的Bean配置信息。

context/Beans.java context/AnnotationApplicationContext.java

WebApplicationContext类体系结构:
WebApplicationContext是专门为Web应用准备的,它允许从相对于Web根目录的路径中装载配置文件,完成初始化工作。从WebApplicationContext中
可以获得ServletConfig的引用,整个Web应用上下文对象将作为属性放置到ServletContext中,以便Web应用环境可以访问Spring应用上下文,Spring
为此还专门提供一个工具类WebApplicationContextUtils,通过该类的getWebApplicationContext(servletContext sc)方法。即可以从ServletContext
中获取WebApplicationContext实例。
WebApplicationContext初始化:
WenApplicationContext的初始化方式和BeanFactory,ApplicationContext的初始化方式有所区别,因为WebApplicationContext需要ServletContext实例,
也就是说必须在拥有Web容器的前提下才能完成启动的工作。可以在web.xml中配置自动的servlet或定义web容器监听器(ServletContextListener)
Spring分别提高了用于启动WebApplicationContext的servlet和web容器监听器。
org.springframework.web.context.Context.ContextLoaderServlet
org.springframework.web.context.Context.ContextLoaderListener

通过Web容器监听器引导:
<!--指定配置文件-->
<context-param>
<param-name>contextConfiguration</param-name>
<param-value>/WEB-INF/viewspace-dao.xml,/WEB-INF/viewspace-service.xml,</param-value>
</context-param>
<!--声明web容器监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
ContextLoaderListener通过web容器上下文参数contextConfigLocation获取Spring配置文件的位置,可以指定多个配置文件,用逗号,空格或分号分割
对于未带资源类型前缀的配置文件路径,WebApplicationContext默认这些路径是相对于Web的部署根路径。
在不支持容器监听器的低版本web容器中,可采用ContextLoaderServlet来完成相同的工作。
<!--指定配置文件-->
<context-param>
<param-name>contextConfiguration</param-name>
<param-value>/WEB-INF/viewspace-dao.xml,/WEB-INF/viewspace-service.xml,</param-value>
</context-param>
<!--声明自动启动的servlet-->
<listener>
<servlet-name>springContextLoaderServlet</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<!--启动顺序-->
<load-on-startup>1</load-on-startup>
</listener>
WebApplicationContext需要使用日志功能,
指定Log4J配置文件时启动Spring web应用上下文。
<!--指定配置文件-->
<context-param>
<param-name>contextConfiguration</param-name>
<param-value>/WEB-INF/viewspace-dao.xml,/WEB-INF/viewspace-service.xml</param-value>
</context-param>
<!--指定log4j配置文件位置-->
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<!--装载log4j配置文件的自启动servlet-->
<servlet>
<servlet-name>log4jConfiguration</servlet-name>
<servlet-class>org.springframework.web.util.Log4jConfigServlet</servlet-class>
<load-on-start-up>1</load-on-start-up>
</servlet>
<!--声明web容器监听器-->
<listener>
<servlet-name>springContextLoaderServlet</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<!--启动顺序-->
<load-on-startup>1</load-on-startup>
</listener>

使用@Configuration的java类提供配置信息的信息在web.xml中做如下配置:
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--通过指定context参数,让spring使用AnnotationConfigWebApplicationContext而非XMLWebApplicationContext启动容器-->
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<!--指定标注了@Configuration的配置类,多个可以使用逗号分开-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.smart.AppConfig1</param-value>
</context-param>
<!--ContextLoaderListener监听器将根据上面配置使用AnnotationConfigWebApplicationContext根据contextConfigLocation指定的配置类启动Spring容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
ContextLoaderListener如果发现配置了contextClass上下文参数,就会使用参数所指定的WebApplicationContext实现类来初始化容器,该实现类会根据contextConfigLocation
上下文参数指定的@Configuration的配置类所提供的Spring配置信息来初始化容器。

资源加载:
为了访问不同类型的资源,必须使用相应的Resource实现类,Spring提供了一个强大的加载资源的机制,不但可以通过classpath file等资源地址前缀来加载
识别不同的资源类型,还支持Ant风格带通配符的资源地址。
classpath: classpath:com/smart/beanfactory/beans.xml 从类路径中加载资源,classpath:和classpath:/是等价的,都是相对于类的根
路径,资源文件可以在标准的文件系统中,也可以在jar或zip的类包中
file: file:/conf.com.smart/smart/beanfactory/beans.xml 使用UrlResource从文件系统目录中装载资源,可采用绝对或相对路径
http:// http://www.smart.com/resource/beans.xml 使用UrlResource从web服务器中装载资源
ftp:// ftp://www.smart.com/resource/beans.xml 使用UrlResource从ftp服务器中装载资源
没有前缀 com/smart/beanfactory/beans.xml 根据ApplicationContext具体实现类采用对应类型的Resource


Bean装配:
要使应用程序中的Spring容器成功启动,需要同时具备以下3方面的条件:
Spring框架的雷暴都已经放到应用程序的类路径下
应用程序为Spring提供玩呗的Bean配置信息
Bean的类都已经放到应用程序的类路径下
Spring启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系
为上层应用提供准备就绪的运行环境。
Bean的配置信息是Bean的元数据信息,由4方面组成:
Bean的实现类
Bean的属性信息,如数据源的连接数,用户名密码等
Bean的依赖关系,Spring根据依赖关系配置完成Bean之间的装配
Bean的行为配置,如生命周期范围及生命周期各过程的回调函数等。
Bean元数据信息在Spring容器中的内部对应物是由一个个BeanDefinition形成的Bean注册表,Spring实现了Bean原数据信息内部表示信息和外部表示的解耦。
Bean配置信息定义了Bean的实现和依赖院系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载,
实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应用程序调用。



Bean基本配置:
装配一个Bean:
在Spring容器的配置文件中,定义一个简要Bean的配置片段 <bean )默认名称为方法名
注入:比较灵活,可以在方法处通过@Autowired使方法入参绑定bean,然后在方法中通过代码进行注入,还可以通过调用配置类的@Bean方法进行注入
生命周期方法:通过@Bean的initMethod或destoryMethod指定一个初始化或销毁方法。对于初始化方法来说,可以直接在方法内部通过代码的方式灵活初始化逻辑
作用范围:通过在Bean方法定义处标注@Scope指定
延迟初始化:通过在Bean方法定义处标注@Lazy指定

Bean不同配置方式的适用场合
基于XML配置:Bean实现类来源于第三方类库,如DataSource,JdbcTemplate等,因无法在类中标注注解,通过XML配置方式较好。命名空间的配置,如aop context等,只能采用基于XML的配置
基于注解配置:Bean的实现类是当前项目开发的,可以直接在Java类中基于注解的配置
基于Java类配置:基于Java类配置的优势在于可以通过代码控制Bean初始化的整体逻辑。所以如果实例化Bean的逻辑比较复杂,则比较适合用基于Java类配置的方式

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-27
  • 2021-06-14
  • 2022-12-23
  • 2022-02-09
猜你喜欢
  • 2021-10-18
  • 2022-12-23
  • 2021-06-11
  • 2021-06-23
  • 2021-11-04
  • 2022-12-23
  • 2021-07-30
相关资源
相似解决方案