Spring3学习(2)__Bean&Resource

来源:互联网 发布:js怎么添加节点 编辑:程序博客网 时间:2024/06/17 07:00

1、Bean的初始化
 
 1)容器创建时,就初始化
  Spring容器会在创建容器时提前初始化singleton作用域的Bean,该Bean的实例在容器中是唯一的。
 
 2)延迟初始化  lazy-init
  针对花费资源较多,且在整个应用程序的过程中可能用不到的资源,可以延迟初始化,只有在真正使用时才创建。
  具体的方法:
  <bean>标签上指定lazy-init属性值为true;  <bean name="XXX" class = "XXXX" lazy-init="true"/>
 
 3)使用depends-on  指定Bean初始化及销毁时的顺序
  <bean name="initBean" class="InitBean"/>
  <bean name="doBean" class="DoBean" depends-on="initBean">
   <property name="initB" ref="initBean"/>
  </bean>
  说明:初始化时,首先初始化initBean,再初始化doBean;销毁时,先销毁doBean,再销毁initBean。
  例如要销毁initBean,必须首先要释放掉doBean对于initBean的引用。如此可避免资源不能释放或释放错误
 
 4)file
    <property name="file" value="D:/tt.txt"/>配置:Spring容器能自动把字符串转换为java.io.File。

 5)init-method和destroy-method
  init-method="init" :指定初始化方法,在构造器注入和setter注入完毕后执行。
  destroy-method="destroy":指定销毁方法,只有singleton作用域能销毁,prototype作用域的一定不能销毁,其他作用域根据情况而定;

 6)自动装配,由Spring来自动地注入依赖对象,自动装配通过配置<bean>标签的"autowire"属性来改变自动装配方式
  Spring3.0支持no、byName、byType、constructor四种自动装配
  
  #default:表示使用默认的自动装配,默认的自动装配需要在<beans>标签中使用default-autowire属性指定,其支持no、byName、byType、constructor四种自动装配
  
  #no,不支持自动装配,必须明确类间的依赖关系
  
  #byName,Bean定义属性autowire="byName",用于setter注入
   <bean id="bean" class="Hello"  autowire="byName"/>;
   bean类有setSay方法,那么Spring就会根据byName,查找名字为Say的Bean,并注入;如果没有找到,就不注入
   注意:在根据名字注入时,当前Bean是排除在外的,即不能注入上例中的Hello,即使有setHello方法
  
  #byType,设置Bean定义属性autowire="byType",意思是指根据类型注入,用于setter注入
   <bean id="bean" class="Hello"  autowire="byType"/>;
   bean类有setSay方法,那么Spring就会根据byType,查找类型为Say的Bean,并注入;如果没有找到,就不注入
   注意:|*|如果找到多个Bean将优先注入<bean>标签primary属性为true的Bean,否则抛出异常来表明有个多个Bean发现但不知道使用哪个
      |*|在根据类型注入时,当前Bean是排除在外的
  
  #constructor,设置Bean定义属性autowire="constructor",功能和byType功能一样,根据类型注入构造器参数
 
  #autodetect,自动检测是使用constructor还是byType自动装配方式,不推荐
 
  #依赖检查,检查Bean定义的属性是否都注入数据,针对所有自动或手动装配方式如果没有注入数据将报错,从而提前发现注入错误。只检查具有setter方法的属性
  依赖检查有none、simple、object、all四种方式
   |*| none,不检查
   |*| objects,检查除基本类型外的依赖对象。配置方式为:dependency-check="objects"
   |*| simple,对基本类型进行依赖检查,包括数组类型,其他依赖不报错。dependency-check="simple"
   |*| all,对所以类型进行依赖检查,配置方式为:dependency-check="all"
   
 7)方法注入,通过配置方式覆盖或拦截指定的方法,Spring提供查找方法注入和方法替换注入两种方式。
 
2、Bean的作用域
 1)singleton,每个Spring IoC容器中存在一个实例,而且其完整生命周期完全由Spring容器管理
 2)prototype,每次向Spring容器请求获取Bean都返回一个全新的Bean
 3)Web应用中的作用域
  #request作用域:表示每个请求需要容器创建一个全新Bean
  #session作用域:表示每个会话需要容器创建一个全新Bean
  #globalSession:类似于session作用域,只是其用于portlet环境的web应用。如果在非portlet环境将视为session作用域

3、ResourceLoader接口,用于返回Resource对象;其实现可以看作是一个生产Resource的工厂类
 核心方法:
  
  #Resource getResource(String location);
  location: "classpath:path"表示返回ClasspathResource,"http://path"和"file:path"表示返回UrlResource资源,不加前缀则需要根据当前上下文来决定
  
  #ClassLoader getClassLoader();     
  Spring提供了一个适用于所有环境的DefaultResourceLoader实现,可以返回ClassPathResource、UrlResource和Web环境的ServletContextResourceLoader
    
  #源码示例
  ResourceLoader loader = new DefaultResourceLoader();
  //ClassPathResource  classpath:XXX
    Resource resource = loader.getResource("classpath:cn/com/spring/test.txt");  
    //UrlResource   file:XXX  
    Resource resource2 = loader.getResource("file:cn/com/spring/test1.txt");
   
    #Spring定义的所有ApplicationContext都实现了ResourceLoader
     ClassPathXmlApplicationContext:不指定前缀将返回默认的ClassPathResource资源,否则将根据前缀来加载资源;
     FileSystemXmlApplicationContext:不指定前缀将返回FileSystemResource,否则将根据前缀来加载资源;
     WebApplicationContext:不指定前缀将返回ServletContextResource,否则将根据前缀来加载资源;
     其他:不指定前缀根据当前上下文返回Resource实现,否则将根据前缀来加载资源。

4、ResourceLoaderAware接口
 标记接口,用于通过ApplicationContext上下文注入ResourceLoade;
 void setResourceLoader(ResourceLoader resourceLoader);
 
5、使用路径通配符加载Resource
 
 #通配符
 "?":匹配一个字符,如"config?.xml"将匹配"config1.xml";
 "*":匹配零个或多个字符串,如"cn/*/config.xml"将匹配"cn/com/config.xml",但不匹配匹配"cn/config.xml";而"cn/config-*.xml"将匹配"cn/config-service.xml";
 "**":匹配路径中的零个或多个目录,如"cn/**/config.xml"将匹配"cn/config.xml",也匹配"cn/com/spring/config.xml";而"cn/com/config-**.xml"将匹配"cn/com/config-service.xml",即把"**"当做两个"*"处理。
 
 #加载多个Resource:ResourcePatternResolver接口加载多个Resource,Resource[] getResources(String locationPattern) throws IOException;
   |*|classpath,加载类路径(包括jar包)中的一个且仅一个资源
   Resource[] resources=resolver.getResources("classpath:cn/tt.txt");//加载一个匹配的文件tt.txt
   Resource[] resources=resolver.getResources("classpath:cn/*.txt");   //即使有多个,也仅加载一个匹配的文件
   |*|classpath*,加载类路径(包括jar包)中的所有匹配的资源
   使用"ClassLoader"的"Enumeration<URL> getResources(String name)"方法来查找通配符之前的资源,然后通过模式匹配来获取匹配的资源。
   如"classpath*:source/*.txt"将首先加载通配符之前的目录"source",然后再遍历路径进行子路径匹配从而获取匹配的资源*.txt
   说明:如果要返回jar包里面的资源文件,通配符之前必须有目录,否则就只加载classpath的资源。由于classLoader的getResources(String name)方法的限制,对于name为空将只返回文件系统的类路径,不会包换jar包根路径
   |*|file*,加载一个或多个文件系统中的Resource。如"file:D:/*.txt"将返回D盘下的所有txt文件
   |*|无前缀:通过ResourceLoader实现加载一个资源,AppliacationContext提供的getResources方法将获取资源委托给ResourcePatternResolver实现

6、AppliacationContext实现对各种Resource的支持

 #ClassPathXmlApplicationContext,通过classpath进行加载返回ClassPathResource
 #FileSystemXmlApplicationContext,加载相对于当前工作目录的"configLocation"位置的资源
 #源代码
 //linux系统,第一个将相对于当前vm路径进行加载;  第二个则是绝对路径方式加载 
 ctx.getResource ("tt/config.xml"); 
 ctx.getResource ("/home/confg.xml"); 
 //windows系统,第一个将相对于当前vm路径进行加载;第二个则是绝对路径方式加载 
 ctx.getResource ("tt/config.xml"); 
 ctx.getResource ("d:/tt/confg.xml"); 
   
    

原创粉丝点击