Spring依赖注入:
-
属性注入
要求:
- 每个Bean都需要提供一个默认的构造函数。
- 对需要注入的属性提供一个 getter和setter方法。(spring只会检查Bean中是否有对应的Setter方法,至于Bean中是否有对应的属性变量不做要求)
-
构造函数注入
保证一些必要的属性在Bean实例化初就得到设置,以便实例化之后就可以直接使用。
要求:Bean必须提供带参数的构造函数
Spring注入参数类型
- 字面值:直接通过<value>指定注入
- 引用其他的bean
- 集合类型属性-List
List属性既可以通过<value>注入字符串,也可以通过<ref>注入其他bean
- 集合类型属性-Map
简化配置方式
为了简化Xml的配置方式,自Spring2.5之后,越来越多的xml文件采用属性配置方式,引入了一个新的P命名空间。
例如:
自动装配(autowrite)
通过Spring的Bean配置可以了解所有的Bean信息,比如bean的构造方法,属性信息等。通过这些Spring容器就可以按照某种规则对容器中的bean进行自动装配,而无需显式进行配置。
基于注解的配置
@Component
@Service
@Repository
@Controller
这四个注解对类进行标注,然后就可以被Spring容器识别为Bean。不同的注解只是为了类本身用途的清晰,并特殊规定。
使用注解配置Bean需要在beans.xml里配置:
基于注解-自动装配Bean
使用@Qualifier指定Bean的名称,没有该注解时按类型自动注入。
经测试,使用注解配置时,初始化BeanFactory时需要用ClassPathXmlApplicationContext类进行读取配置文件的方式初始化:
具体原因暂未查明。
Bean的作用域
- Singleton:在Spring IOC容器中只会存在一个共享的bean实例,Bean以单实例的方式存在。
注意:Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置: <bean …… scope=”singleton”>
- Prototype:每次从容器中调用Bean时都会创建一个新的bean实例。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
- request:即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于WebApplicationContext下有效。
考虑下面bean定义:<bean ……. scope=”request”/>
针对每次HTTP请求,Spring容器会根据loginAction bean定义创建一个全新的LoginAction bean实例, 且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态, 而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。 当处理请求结束,request作用域的bean实例将被销毁。
- session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的WebApplicationContext下有效。
考虑下面bean定义:<bean …… scope=”session”/>
针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例, 且该userPreferences bean仅在当前HTTP Session内有效。 与request作用域一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例, 将不会看到这些特定于某个HTTP Session的状态变化。
当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。
- global session:在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。
考虑下面bean定义:<bean …… scope=”globalSession”/>
global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。
--------------------------------------------------------------------------------------------------------------------------------------------
更多精彩文章请访问 刘召考的博客