1. 在spring配置文件中,如果对一个property进行直接赋值,可使用<value>元素,spring负责将值转化为property指定的类型;也可以直接在property元素上使用value属性来赋值;

2. 构造函数注入,应使用<constructor-arg>元素来赋值,该元素有三个属性,你可以指定来对赋值的构造函数参数进行区分:type、index或者name,但是当你使用name属性时,你应该放置@ConstructorProperties annotation到构造函数上去显式的指定构造函数参数名;

3. spring中对于同名的bean,后一个会覆盖前一个;

4. 对于指定bean的名字,可以通过<bean>的id属性,也可以通过name属性,id属性只能指定一个名字,name属性可以指定多个,并且用逗号隔开;

5. 如果通过property注入,我们可以在schema上加上xmlns:p="http://www.springframework.org/schema/p",那么就可以在bean元素上直接加上p:propertyName="value"来进行赋值;同理,通过constructor来注入,则必须加上xmlns:c="http://www.springframework.org/schema/c"的schema,并在bean元素上加上c:argumentName="value"来赋值;

6. 我们在加载一个spring的配置文件,应该使用GenericXmlApplicationContext类,默认该类从classpath下面去加载配置文件;GenericXmlApplicationContext类的某个构造函数接受多个配置文件作为一个字符串的数组;

7. 为了引用其他的bean,你可以使用<ref bean="bean name"/>元素,ref元素中的bean属性可以引用到其他任何一个配置文件中的bean,如果只想引用相同xml文件中的bean,我们应该使用<ref local="bean name"/>,我们也可以在property元素或者constructor-arg元素上使用ref属性来引用其他的bean;对于schema,我们可以使用p:propertyName-ref="bean name"来引用其他的bean;

8. <bean/>元素的autowire属性,默认情况下只用于这个bean所有properties的autowire,它包含3个可能的值:

byName: 根据bean的属性名找到相同名的bean;

byType: 根据bean的属性类型找到相同类型的bean;

constructor: 用于bean的构造函数的autowire,它首先根据构造函数的参数类型找到相同类型的bean,然后再确定最佳的构造函数;

当使用autowire byType的时候,如果存在相同类型的多个bean,就会抛异常,那么可以在某一个bean的<bean>元素上加上primary="true",则这个bean在autowire byType时会优先使用;

对于autowire的bean属性,如果spring找不到响应的bean,那么spring就会设置一个null值;在用户使用该属性的时候,可能会得到NullPointerException异常;如此我们可以使用以下两种方法来规避:

a. 为某个property创建一个setter方法,并使用@Required annotation;

b. 为某个property加上@Autowired annotation,隐式的包涵了@Required;

对于某些bean,我们不想让其被其他bean autowire,我们可以在这个<bean>元素上加上autowire-candidate="false";

9. 我们可以在一个配置文件中,使用<import>标记去引用其他的配置文件;

10. spring提供了3个元素去定义集合:<list>、<set>、<map>;

对于集合<list>和<set>,其中的item可以是:<value>、<ref>、<bean>、<idref>、<null/>等元素;

对于<map>,其中的item必须是<entry>元素,<entry>元素中的key必须放在<key>元素下,value直接放在<entry>元素下面;无论是key或者value的值,可以是<value>、<ref>、<bean>、<idref>、<null/>元素中的任何一种;<entry>元素也包含有key、value、key-ref、value-ref等属性;

spring为java.util.Properties集合提供了<props>元素,该元素中的每一个item都必须是<prop>元素,该<prop>元素包含有key属性;

11. 对于上面提到的创建集合所使用的元素,他们不能被使用来创建一个独立的bean,如果要创建一个独立的bean,我们必须要使用util schema,我们需要加入xmlns:util="http://www.springframework.org/schema/util",并且在xsi:schemaLocation中加入http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd;然后我们就可以使用<util:list>、<util:set>、<util:map>来创建集合bean,这三种元素都提供了list-class、set-class、map-class属性来指定要创建集合的类型;

12. <bean>元素有一个scope属性,用来指定创建的bean实例的作用域;值可能是:

singleton: 在这个spring容器里面只有一个实例;

prototype: 每一次请求都会创建一个新的bean实例;

request: 每一次请求创建一个新的实例,在Web Application中有效;

session: 每一个session创建一个新的实例,在Web Application中有效;

global-session: 对每一个global HTTP session创建一个新的实例,在Web Application中有效;

13. 为了加载一个property文件进入spring容器,并让其他bean使用;spring提供了PropertySourcesPlaceholderConfigurer类,它的location属性用来指定property文件的位置;

然后我们就可以在配置文件中使用${key:default_value}方式来引用property文件中的property;

如果我们要读取一个文件的内容,spring提供了一个Resource类型,你只需在配置文件中将一个字符串赋值给这个类型的属性,spring容器会自动将其转换为Resource实例,这个字符串可以根据文件的不同位置指定不同的前缀,比如文件系统中的文件,就以file开始,classpath中的文件就以classpath开始;如果实在classpath中的一个特殊的包中,可以使用这样的形式来指定Resource:classpath:com/apress/springrecipes/shop/banner.txt;

14. 为了让Spring支持多语言化,Spring提供了通过特定的local去properties文件读取message的方式,这些message必须被放在properties文件里面,这样的文件被叫做resource bundle,这些文件应该被放置在classpath 的根目录下,并且文件名必须遵守messages_<language_code>_<country_code>.properties这样的约束,我们可以创建一个ReloadableRsourceBundleMessageSource的bean去读取message,但是由于必须让Application Context知道这是一个读取message的bean,所以这个bean的名字必须是messageSource,这个bean的basenames属性resource bundle文件的文件名(不包含language code和country code部分);

在Spring context中,如果一个bean需要使用到这些message,则需要把messageSource bean注入到那个bean里面;

15. Spring Container中bean的生命周期:

  • 通过构造函数或者工厂方法创建bean实例;
  • 设置bean的属性值;
  • 调用bean的初始化方法;
  • 使用bean;
  • 当container被关闭时;调用析构器方法;

在bean的定义中,初始化方法和析构器方法都是通过<bean/>元素的init-method和detory-method来指定的;

16. 一般而言,spring context中的所有bean会在Spring Container被启动后立即执行初始化;为了避免某些过渡消耗时间和资源的bean的创建,我们可以在这样的<bean>元素上设置lazy-init="true"属性;

17. 某些时候,一些bean要依赖自另外一些bean被创建后,才能被创建(两者之间可能并没有引用的关系);我们可以使用<bean/>元素的depends-on属性,该属性可以指定一个或多个bean names,并用逗号隔开;

18. 我们可能想在Spring Container中的每一个bean的初始化方法被调用之前或者之后执行一些任务,比如做一些属性验证等;我们可以创建一个类,并使之继承自BeanPostProcessor接口;

并实现该接口中的postProcessBeforeInitialization方法和postProcessAfterInitialization方法;这样bean的生命周期就成为:

  • 通过构造函数或者工厂方法创建bean实例;
  • 设置bean的属性值;
  • 将bean实例传递给BeanPostProcessor实现类的postProcessBeforeInitialization方法;
  • 调用bean的初始化方法;
  • 将bean实例传递给BeanPostProcessor实现类的postProcessAfterInitialization方法;
  • 使用bean;
  • 当container被关闭时;调用析构器方法;

BeanPostProcessor实现类必须被申明在spring配置文件中;

19. 除开Spring Container实现bean实例的初始化之外,Spring还提供了其他三种方式去创建Bean:

  • 静态工厂方法;
  • 实例工厂方法;
  • Spring FactoryBean

如果你想利用静态工厂方法来创建bean实例,你需要在<bean/>节点中通过class属性指定静态类的类型,在factory-method属性中指定方法名,然后通过<constructor-arg/>子元素传入方法参数;

如果你要使用实例工厂方法,你需要在<bean/>节点上通过factory-bean指定工厂方法所在的bean name,在factory-method属性中指定方法名,然后通过<constructor-arg/>子元素传入方法参数;

如果你要利用FactoryBean来创建bean实例,你需要继承AbstractFactoryBean抽象类,并复写createInstance()方法去创建目标bean实例,为了让其他的bean能autowire这个bean,还得实现getObjectType()方法去返回目标bean的类型;

每一次Spring Container去请求FactoryBean,得到的都是目标bean的实例,要想得到FactoryBean本身,需要在bean name前加上&符号;

20. 如果想根据不同的环境给予bean不同的初始值,你可以创建多个具有相同名字的bean,然后把它们放在不同的profile中,每一个profile都通过<beans/>元素的指定,<beans/>元素的profile属性说明了profile的名字;每一个<beans/>元素可以包含多个bean,也可以为其profile指定多个名字,并用逗号分割开来;

为了在Spring Container启动时指定加载哪一个profile,你可以通过以下3种方式来做到:

  • 在加载配置文件之前,调用GenericXmlApplicationContext类的getEnvironment().setActiveProfiles("","")
  • 在运行之前,传入JVM参数-Dspring.profiles.active="XXX,XXX"
  • 为war包的web.xml文件中的servlet传入spring.profiles.active初始化参数:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>spring.profiles.active</param-name>
<param-value>XXX</param-value>
</init-param>
</servlet>

有时候,为了防止用户忘记指定profiles导致出错,我们还可以指定DefaultProfiles:

  • 调用GenericXmlApplicationContext类的getEnvironment().setDefaultProfiles("","")
  • 传入JVM参数-Dspring.profiles.default="XXX,XXX"
  • 为war包的web.xml文件中的servlet传入spring.profiles.default初始化参数:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>spring.profiles.default</param-name>
<param-value>winter</param-value>
</init-param>
</servlet>

Spring学习笔记之一----基于XML的Spring IOC配置的更多相关文章

  1. Spring学习笔记之四----基于Annotation的Spring AOP编程

    你能使用@Aspect annotation将某个Java类标注为Aspect,这个Aspect类里的所有公有方法都可以成为一个Advice,Spring提供了5个Annotation去将某个方法标注 ...

  2. Spring学习笔记之三----基于Annotation的Spring IOC配置

    使用Annotation 来创建Bean有两种方式 在配置类中创建bean(配置类是指标注为@Configuration的类),在配置类中每一个创建bean的方法都应该标注为@Bean,可以在@Bea ...

  3. Spring学习笔记--环境搭建和初步理解IOC

    Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...

  4. Spring学习笔记(二) 初探Spring

    版权声明 笔记出自<Spring 开发指南>一书. Spring 初探 前面我们简单介绍了 Spring 的基本组件和功能,现在我们来看一个简单示例: Person接口Person接口定义 ...

  5. Spring学习笔记(7)——Bean的基本配置

            先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这样有什么坏处呢?其实很显然的,使用new那么就 ...

  6. Spring学习笔记(1)——初识Spring

    一.Spring是什么       通常说的Spring其实指的是Spring Framework,它是Spring下的一个子项目,Spring围绕Spring Framework这个核心项目开发了大 ...

  7. Spring 学习笔记(四):Spring AOP

    1 概述 本文主要讲述了AOP的基本概念以及在Spring中AOP的几种实现方式. 2 AOP AOP,即Aspect-Oriented Programming,面向切面编程,与OOP相辅相成.类似的 ...

  8. Spring 学习笔记(三):Spring Bean

    1 Bean配置 Spring可以看做是一个管理Bean的工厂,开发者需要将Bean配置在XML或者Properties配置文件中.实际开发中常使用XML的格式,其中<bean>中的属性或 ...

  9. Spring学习记录(十三)---基于xml文件配置AOP

    上一篇讲了用注解配置AOP,现在讲用xml怎么配置AOP 其实逻辑是一样的,只是用xml的方法,要把这种逻辑写出来,告诉spring框架去执行. 例子:这里的例子和上一篇的例子一样.换成xml方式 / ...

随机推荐

  1. Unity学习疑问记录之保卫伦敦塔学习体会

    1.生成的prefab如果要产生反向: Instantiate(Rocket, rocketPosition.position, Quaternion.Euler(new Vector3(0,0,18 ...

  2. C register

    1.register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度.例如下面的内存块拷贝代码, /* Procedure for the as ...

  3. elasticsearch之节点重启

    Elasticsearch节点重启时背后发生的故事有哪些,应该注意哪些配置内容,本篇文章做一个简单的探讨. 节点离开 在elasticsearch集群中,假设NodeA因为种种原因退出集群,在Node ...

  4. 一道无限级分类题的 PHP 实现

    今天有网友出了道题: 给出如下的父子结构(你可以用你所用语言的类似结构来描述,第一列是父,第二列是子),将其梳理成类似如图的层次父子结构. origin = [('A112', 'A1122'), ( ...

  5. MVC代码中如何调用api接口

    关于代码解释,为了方便读者浏览时更好理解代码的含义,我把注释都写在代码里面了.因为一开始我只考虑到功能上的实现并没有考虑代码的优化所以代码我就全写在一个页面了.至于那些生成扑克牌类.计算类等代码优化方 ...

  6. javascript立即执行函数

    javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花;当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解.  ( ...

  7. ajax+表单验证+验证码生成例子

    MainController.class.php <?php namespace AjaxYz\Controller; use Think\Controller; class MainContr ...

  8. oracle 中的cascade

    级联删除,比如你删除某个表的时候后面加这个关键字,会在删除这个表的同时删除和该表有关系的其他对象

  9. ORA-29275: partial multibyte character

    查询表报错 修改方式1 和字符集存储方式有关系 ,修改客户端和服务器的字符集存储方害死 修改方式2 修改表的字段由nvarchar2修改为varchar2

  10. Python学习笔记 for windows 二

    函数 abs(-20)                                        //结果为:20,绝对值函数 def 函数名称([参数1,参数2,参数3]): 执行语句 retu ...