Spring IOC体验之—如何依赖注入

来源:互联网 发布:游泳馆软件 编辑:程序博客网 时间:2024/06/01 09:33

Spring依赖注入:

  • 属性注入

要求:

  • 每个Bean都需要提供一个默认的构造函数。
  • 对需要注入的属性提供一个 getter和setter方法。(spring只会检查Bean中是否有对应的Setter方法,至于Bean中是否有对应的属性变量不做要求)
  • 构造函数注入

保证一些必要的属性在Bean实例化初就得到设置,以便实例化之后就可以直接使用。

要求:Bean必须提供带参数的构造函数

1

 

 

2

 

Spring注入参数类型

  • 字面值:直接通过<value>指定注入
  • 引用其他的bean

3

 

 

  • 集合类型属性-List

4

 

 

List属性既可以通过<value>注入字符串,也可以通过<ref>注入其他bean

  • 集合类型属性-Map

5

 

 

简化配置方式

为了简化Xml的配置方式,自Spring2.5之后,越来越多的xml文件采用属性配置方式,引入了一个新的P命名空间。

例如:

6

 

 

自动装配(autowrite)

通过Spring的Bean配置可以了解所有的Bean信息,比如bean的构造方法,属性信息等。通过这些Spring容器就可以按照某种规则对容器中的bean进行自动装配,而无需显式进行配置。

 

基于注解的配置

@Component

@Service

@Repository

@Controller

这四个注解对类进行标注,然后就可以被Spring容器识别为Bean。不同的注解只是为了类本身用途的清晰,并特殊规定。

使用注解配置Bean需要在beans.xml里配置:

7

 

 

基于注解-自动装配Bean

 

8

 

 

使用@Qualifier指定Bean的名称,没有该注解时按类型自动注入。

经测试,使用注解配置时,初始化BeanFactory时需要用ClassPathXmlApplicationContext类进行读取配置文件的方式初始化:

 

9

 

 

具体原因暂未查明。

 

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的生命周期范围内。

--------------------------------------------------------------------------------------------------------------------------------------------

更多精彩文章请访问 刘召考的博客

0 0
原创粉丝点击