1.背景介绍
到目前为止,采用SSH框架,环境已经配置好。
2.通过注解的环境配置
1.添加命名空间
xmlns:context="http://www.springframework.org/schema/context"
命名空间的特点就是ns(namespace)结尾
xsd用来约束xml文件的语法和格式。
约束xml文件格式有两种标准:1.dtd(.dtd) 2.schema(.xsd)
默认的命名空间指向xsd,这个xsd规定了bean的语法。
2.指向xsd
那么添加的context命名空间也要指向一个xsd,所以在xsi:schemaLocation中添加
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
xsi:schemaLocation 声明了目标名称空间的模式文档.
xsi:schemaLocation属性的值由一个URI引用对组成,两个URI之间以空白符分隔。第一个URI是名称空间的名字,第二个URI给出模式文档的位置,模式处理器将从这个位置读取模式文档,该模式文档的目标名称空间必须与第一个URI相匹配。
3.添加开启注解配置标签
添加开启注解配置标签
<context:annotation-config/>
<context:annotation-config> 是用于激活那些已经在spring容器里注册过的bean(无论是通过xml的方式还是通过package sanning的方式)上面的注解。
3.通过注释初始化Dao的类
1.要在Dao层中实现类,
需要在要实现的类前面添加注解:
@Component(value="fileDAO")
@Scope(value="singleton")
@component (把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)
@scope 用来配置spring bean的作用域,它标识bean的作用域。一遍用到的值为:1.singleton 2.prototype
singleton: 当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。
prototype: prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的
getBean()
方法)都会产生一个新的bean实例,相当与一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。
scope的线程安全问题:
singleton是单态模式的 ,有ioc容器管理 ,当然不是线程安全的啦 ,不过所谓的线程安全也是相对的,
如果你的类是没有状态的(没有类的公用属性,不会同时被多个线程改变), 那用singleton 的性能要高一些 ,因为只有一个实例 。
如果你的类是有状态的(有公用属性,可能被不同的线程改变)
,那就必须显示的设置为prototype了。
4.spring的配置文件中添加配置项
现在注解也已经完成了,但是程序是怎么找到注解的位置的呢?需要在applicationContext.xml中添加配置项:
<context:component-scan base-package="要实例化的类所在的包名"></context:component-scan>
程序就会到指定的包名下去找初始化好的bean。
5.通过注释初始化Service的类
因为Dao层是要被Service层所调用的,而Service也要给别人调用。既然会被调用,那就需要初始化,所以在Service的1.实现类中也添加初始化注解:
@Component
(value=
"service"
)
@Scope
(value=
"singleton"
)
2.一旦初始化了类,那就需要去applicationContext.xml中添加配置项,告诉它去哪个包找bean对象。
3.除了添加注解之外,service因为调用到了Dao,所以需要把Dao装配进来,注入的方式有两种:
I.setter&getter注入 II.构造函数注入 III.接口注入(少用)
这里用
setter&getter的注入方式。(用构造函数注入,设置Resource会出错)
依赖注入(DI):两个对象之间的依赖关系在程序运行时由外部容器动态的注入依赖行为方式称为依赖注入 (DI) 。 DI 是 IOC 的一种形式。
你的类不会去查找或是实例化它们所依赖的类。控制恰好是反过来的,某种容器会设置这种依赖关系。
4.在setter方法前添加注解:
(区别一下:hibernate注解写在get方法上)
@Resource
(name=
"sqlDAO"
)
name表示把fileDAO传过来
@Resource 注解被用来激活一个命名资源(named resource)的依赖注入
5.通过注释调用之前的Service类
1.因为Action这一层调用到了Service类,所以在setter方法前添加注解:
@Resource
(name=
"service"
)
到这里注解的配置就已经结束了,因为注解配置需要写在源代码里边。当手头没有源代码的时候,就只能用xml配置。做个简单的总结,注解:
1.@component 在spring容器中初始化一个bean
2.@resource 装配bean
3.@scope 设置单实例与多实例