IoC是Spring容器的内核,AOP、声明事物等功能在此基础上开花结果。
IoC概念
我的理解,多个类可以实现同一个接口,由配置来决定调用哪一个类来处理业务逻辑
引用他人博客IoC概念
IoC的类型
IoC主要可以划分为三种类型:构造函数注入、属性注入和接口注入。SPring支持构造函数注入和属性注入
通过容器完成依赖关系注入
通过new XmlBeanFactory(“xxx.xml”)等方式即可启动容器。Spring会根据配置文件的描述信息,自动实例化Bean并完成依赖关系的装配。
"http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
id="actor" class="LiuDehua"/>
id="scenario" class="com.ioc.scenario" p:geli-ref="actor"/>
资源抽象接口
Spring设计了一个Resource接口,它为应用提供了更强的底层资源访问能力。该接口拥有对应不同资源类型的实现类。资源加载时默认采用系统编码读取资源内容。
名称 | 功能 |
---|---|
WritableResource | 可写资源接口,是spring3.1 新加的接口有两个实现类FileSystemResource和PathResource其中Pathresource是spring4.0提供的实现类 |
ByteArrayResource | 二进制数组表示的资源,二进制数组资源可以在内存中通过程序构建 |
ClassPathResource | 类路径下的资源,以相对路径方式表示 |
FileResource | 文件系统资源,通过系统路径的方式表示 |
InputStreamResource | 以输入流返回表示的资源 |
ServletContextResource | 访问web容器上下文中的资源而涉及的类 |
UrlResource | 可以使用它访问文件系统的资源、Http资源、Ftp资源等 |
PathResource | Spring4.0提供的读取资源文件的新类 |
如果资源文件采用特殊的编码格式,那么可以通过EncodedResource对资源进行编码,以保证资源内容操作的正确性。
Resource res = new ClassPathResource("conf/file1.txt");
EncodedResource encRes = new EncodedResource(res,"UTF-8");
String content = FileCopyUtils.copyToString(encRes.getReader());
System.out.println(content);
2.资源加载
为了访问不同类型的资源,必须使用相应的Resource实现类,这是比较麻烦。Spring提供了一个强大的加载资源的机制,不但能够通过"classpaht:"、"file:"等资源地址前缀识别不同的资源类型,还支持Ant风格带通配符的资源地址。
地址前缀 | 示例 | 对应的资源类型 |
---|---|---|
classpath: | classpath:com/crm/test.xml | 从类路径中加载资源classpath:和classpath:/是等价的,都是相对于类的根目录 |
file: | file:/conf/com/crm/test.xml | 使用UrlResource从文件系统目录中装载资源,可采用绝对或相对路径 |
http:// | http://www.baidu.com/test.xml | 使用UrlResource从Web服务器中装载资源 |
ftp:// | ftp://www.baidu.com/test.xml | 使用UrlResource从Ftp服务器中装载资源 |
没有前缀 | com/crm/test.xml | 根据ApplicationContext的具体实现类采用对应的Resource |
2. Ant风格的资源地址支持三种匹配符
1. ?:匹配文件中的一个字符。
2. *:匹配文件中的任意字符。
3. **:匹配多层路径。
ps:用Resource操作文件时,如果资源配置文件在项目发布时会被打包到jar中,那么不能使用Resource#getFile()方法,否则会抛出FileNotFoundException。但可以使用Resource#getInputStream()方法读取。
对于两者的用途,我们可以进行简单的划分:BenaFactory是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用SPring框架的开发者,几乎所有的应用场合都可以直接使用ApplicationContext而非底层的BeanFactory。
BeanFactory介绍
接口名称 | 功能说明 |
---|---|
ListableBeanFactory | 该接口定义了访问容器中Bean基本信息的若干方法,如Bean的个数、获取某一类型Bean的配置名、查看容器中是否包括某一Bean等 |
HierarchicalBeanFactory | 父子级联IoC容器的接口,子容器可以通过接口方法访问父容器等 |
ConfigurableBeanFactory | 这是一个重要的接口,增强了IoC容器的可定制性。他定义了设置类加载器、属性编辑器、容器初始化后置处理器等方法。 |
AutowireCapableBeanFactory | 定义了将容器中的Bean按某种规则进行自动装配的方法。 |
SingletonBeanRegistry | 定义了允许在运行期向容器注册单实例Bean的方法 |
BeanDefinitionRegistry | Spring配置文件中每一个bean节点元素在spring容器里通过一个BeanDefinition对象表示,它描述了Bean的配置信息。而BeanDefinitionRegistry接口提供了向容器手工注册BeanDefinition对象的方法。 |
2. 初始化BeanFactory
下面使用Spring配置文件为car提供配置信息,然后通过BeanFactory装载配置文件,启动SpringIoC容器
"car1" class="com.smart.Car" init-method="myInit" destroy-method="myDestory"
p:brand="红旗CA72"
p:maxSpeed="200"/>
@Test
public void getBean() throws Throwable{
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource res = resolver.getResource("classPath:com/test/beans.xml");
System.out.println(res.getURI());
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(res);
System.out.println("init BeanFactory");
Car car = factory.getBean("car",Car.class);
System.out.println("car bean is ready for user!");
car.introduce();
}
ApplicationContext介绍
ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。
1. ApplicationContext类体系结构
ApplicationContext的主要实现类是ClassPathXmlApplicationContext 和 FileSystemXmLApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件。
和BeanFactory初始化相似,ApplicationContext的初始化也很简单。
如果配置文件放置在类的路径下,则可以优先考虑使用ClassPathXmlApplicationContext实现类,对于ClassPathXmlApplicationContext来说"com/test/test.xml"等同于"classpath:com/test/test.xml"
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/test/test.xml");
如果配置文件在文件系统的路径下,则可以优先考虑使用FileSystemXmlApplicationContext实现类,对于FileSystemXmlApplicationContext来说"com/test/test.xml"等同于"file:com/test/test.xml"
ApplicationContext ctx = new FileSystemXmlApplicationContext("com/test/test.xml");
3.WebApplicationContext类体系结构
WebApplicationContext是专门为Web应用准备的,它允许从相对于Web根目录的路径中装载配置文件完成初始化工作
1. WebApplicationContext初始化
通过Web容器监听器引导
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/test.xml,/WEB-INF/test1.xml
</param-value>
</context-param>
<listener>
<listener- class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
通过自启动的servlet引导
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/test.xml,/WEB-INF/test1.xml
</param-value>
</context-param>
<servlet>
<servlet-name>springContextLoaderServlet</servlet-name>
<servlet-calss>org.springframework.web.context.ContextLoaderServlet</servler-class>
<load-in-startup>1</load-in-startup>
</servlet>
硬性知识不记录
引用他人博客