一:Spring中配置文件的加载原理:
二:常用的Spring配置文件的加载方式:
有三种分别是:
- 1:使用我们当前项目的的路径加载:
即使用ClassPathXmlApplicationContext("classpath:xxx.xml")类加载; - 2:使用磁盘文件目录加载
FileSystemXmlApplicationContext("配置文件所在的磁盘路径"); - 3:在Web.xml文件中使用Listener来加载:
spring3.0中已经将org.springframework.web.context.ContextLoaderServlet该类废弃
* <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-iod.xml</param-value>
</context-param>
* <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
然后在
web项目中使用以下代码获取相应的bean对象:
ServletContext context = req.getSession().getServletContext();
ApplicationContext con = WebApplicationContextUtils.getWebApplicationContext(context);
shop s = (shop)con.getBean("oneInterface");
三:Spring的配置中的bean属性用法:
1:id唯一标识一个bean对象;
2:class:表示要实例化哪一个类的对象
3:property:要实例化的对象的属性
-
4:scope:它的值有5个:
- singleton:表示单例;每一个bean容器中只存在一个对象(default)
- prototype表示每次请求都会创建一个对象;
- request在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。
- session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
-
globel session:在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。
lazy-init(默认为“default”):用来定义这个Bean是否实现懒初始化。如果为“true”,它将在BeanFactory启动时初始化所有的Singleton Bean。反之,如果为“false”,它只在Bean请求时才开始创建Singleton Bean。
-
5:autowire(自动装配,默认为“default”):它定义了Bean的自动装载方式。
自动装配就意思就是我们不需要在Bean上增加属性,IOC容器会根据我们选择的装配模式去自己给我们相应的类的属性赋值;- 1、“no”:不使用自动装配功能。(default)
- 2、“byName”:把Bean的属性具有相同名字的的其他Bean自动装配到Bean的对应属性中。
- 3、“byType”:把与Bean的属性具有相同类型的的其他Bean 自动装配Bean的对应属性当中。
- 4、“constructor”:把与Bean 的构造器入参具有相同类型的其他Bean自动装配到构造器的对应入参中。
- 5、“autodetect”:通过Bean类的反省机制(introspection)决定是使用“constructor”还是使用“byType”。
首先尝试使用constructor进行自动装配,如果失败,再使用byType进行自动装配
6:dependency-check(依赖检查,默认为“default”):它用来确保Bean组件通过JavaBean描述的所以依赖关系都得到满足。在与自动装配功能一起使用时,它特别有用。
1、 none:不进行依赖检查。
2、 objects:只做对象间依赖的检查。
3、 simple:只做原始类型和String类型依赖的检查
4、 all:对所有类型的依赖进行检查。它包括了前面的objects和simple。
7.depends-on(依赖对象):这个Bean在初始化时依赖的对象,这个对象会在这个Bean初始化之前创建。
8:init-method:用来定义Bean的初始化方法,它会在Bean组装之后调用。它必须是一个无参数的方法。
9:destroy-method:用来定义Bean的销毁方法,它在BeanFactory关闭时调用。同样,它也必须是一个无参数的方法。它只能应用于singleton Bean。
10: factory-method:定义创建该Bean对象的工厂方法。它用于下面的“factory-bean”,表示这个Bean是通过工厂方法创建。此时,“class”属性失效。
11:factory-bean:定义创建该Bean对象的工厂类。如果使用了“factory-bean”则“class”属性失效。
四:Spring的生命周期方法:
init和destory方法
这些方法会在Bean容器初始化时和Bean容器销毁时就去调用。
有三种配置方式:
- 1:直接在Bean里面配置 每一个bean的属性里面都有一个init-method和destory-method方法;
例子
<bean id="shop" class="com.cp.insist.impl.shopimp" init-method="init" destroy-method="destory"></bean>
相应的类中也要有对应的init方法和destory方法
- 2:配置全局的默认的初始化init-method和销毁destory-method方法,在Beans 这个标签里面有一个default-init-method和default-destory-method方法;
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
default-init-method="init" default-destroy-method="destory">
- 3:实现InitializingBean,DisposableBean这两个接口并重写两个接口里面的方法
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("我是初始化方法afterPropertiesSet");
}
@Override
public void destroy() throws Exception {
System.out.println("我是销毁方法destory");
}
五:Spring中以Aware结尾的接口使用说明:
Aware,即感知,是Spring IOC的一个特性,当实现了对应的Aware接口时,BeanFactory工厂会在生产bean时给bean注入对应的属性,即为该bean增强一定功能。
Spring中提供一些Aware相关接口,像是BeanFactoryAware、 ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,实现这些 Aware接口的Bean在被初始之后,可以取得一些相对应的资源,例如实现BeanFactoryAware的Bean在初始后,Spring容器将会注入BeanFactory的实例,而实现ApplicationContextAware的Bean,在Bean被初始后,将会被注入 ApplicationContext的实例等等。
如上图所示:Spring中有很多实现了Aware的接口
下面介绍几种常用的:
1:ApplicationContextAware:给实现该接口的bean注入ApplicationContext容器
2:ApplicationEventPublisherAware:给实现该接口的bean注入ApplicationEventPublisher对象,以供分发事件使用。
3:BeanClassLoaderAware:给实现该接口的bean注入该类的类加载器。
4:BeanFactoryAware:给实现该接口的bean注入当前BeanFactory容器,此时该bean就持有BeanFactory容器功能。
5:BeanNameAware:给实现该接口的bean注入bean的名称。
public class school implements ApplicationContextAware{
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
this.context = arg0;
}
public void getBean(){
((userdaoImp)context.getBean("userdao1")).add("ceshi ");
System.out.println(context.hashCode());
}
}
六:Spring中读取配置文件的Resource接口介绍:
在Spring内部,针对于资源文件有一个统一的接口Resource表示。
- 其主要实现类有
ClassPathResource、FileSystemResource、UrlResource、ByteArrayResource、ServletContextResource和InputStreamResource。
Resource接口中主要定义有以下方法: - 1: exists():用于判断对应的资源是否真的存在。
- 2:isReadable():用于判断对应资源的内容是否可读。需要注意的是当其结果为true的时候,其内容未必真的可读,但如果返回false,则其内容必定不可读。
- 3: isOpen():用于判断当前资源是否代表一个已打开的输入流,如果结果为true,则表示当前资源的输入流不可多次读取,而且在读取以后需要对它进行关闭,以防止内存泄露。该方法主要针对于InputStreamResource,实现类中只有它的返回结果为true,其他都为false。
- 4: getURL():返回当前资源对应的URL。如果当前资源不能解析为一个URL则会抛出异常。如ByteArrayResource就不能解析为一个URL。
- 5: getFile():返回当前资源对应的File。如果当前资源不能以绝对路径解析为一个File则会抛出异常。如ByteArrayResource就不能解析为一个File。
- 6: getInputStream():获取当前资源代表的输入流。除了InputStreamResource以外,其它Resource实现类每次调用getInputStream()方法都将返回一个全新的InputStream。
- A:ClassPathResource可用来获取类路径下的资源文件。假设我们有一个资源文件test.txt在类路径下(classpath路径),我们就可以通过给定对应资源文件在类路径下的路径path来获取它,new ClassPathResource(“test.txt”)。
- B: FileSystemResource可用来获取文件系统里面的资源。我们可以通过对应资源文件的文件路径来构建一个FileSystemResource。FileSystemResource还可以往对应的资源文件里面写内容,当然前提是当前资源文件是可写的,这可以通过其isWritable()方法来判断。FileSystemResource对外开放了对应资源文件的输出流,可以通过getOutputStream()方法获取到。
- C:UrlResource可用来代表URL对应的资源,它对URL做了一个简单的封装。通过给定一个URL地址,我们就能构建一个UrlResource。
- D: ByteArrayResource是针对于字节数组封装的资源,它的构建需要一个字节数组。
- E:ServletContextResource是针对于ServletContext封装的资源,用于访问ServletContext环境下的资源。ServletContextResource持有一个ServletContext的引用,其底层是通过ServletContext的getResource()方法和getResourceAsStream()方法来获取资源的。
- F:InputStreamResource是针对于输入流封装的资源,它的构建需要一个输入流。
调用getResource方法时可以在里面传递参数(”url”或者“classpath”,"file")前缀分别表示从不同的地方下载资源:(url表示从网上下载资源;classpath:表示从项目根路径;file表示从磁盘路径下载相应资源)