Spring2.5版本发布后,由于支持注解配置,易用性大幅提升
Spring3.0版本更加完善,实现对struts2的超越
【Struts2缺点:采用了值栈,OGNL表达式,struts2标签库,导致应用性能下降
Struts2优点:多层拦截器,多实例action性能都很好】
Spring3:
先从实体开始:实体的写法:现在都用标注:需要oORM框架,依然使用hibernate
所以需要引入jar包:hibernate-jpa-2.0.api.xxx.jar
SessionFactory 用到hibernate-core-4.1.8.Final.jar
首先,使用 @Repository 将 DAO 类声明为 Bean 【】
其次,在 XML 配置文件中启动 Spring 的自动扫描功能
<context:component-scan base-package=”bookstore.dao” />
所有标注了 @Repository 的类都将被注册为 Spring Bean。
为什么 @Repository 只能标注在 DAO 类上呢?
因为该注解的作用
1.不只是将类识别为Bean,同时它还能
2.将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。
Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,
用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。
Spring 2.5 在 @Repository的基础上增加了功能类似的额外三个注解:
@Component、@Service、@Constroller,它们分别用于软件系统的不同层次:
- @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
- @Service 通常作用在业务层,但是目前该功能与 @Component 相同。
- @Constroller 通常作用在控制层,但是目前该功能与 @Component 相同。
1.Spring会自动创建相应的 BeanDefinition 对象,
2.注册到
ApplicationContext 中。这些类就成了 Spring受管组件
当一个Bean被自动检测到时,会根据那个扫描器的BeanNameGenerator策略生成它的bean名称
默认的BeanNameGenerator策略是:
情况一:如果包含name属性:把name取值作为Bean的名字
情况二:如果不包含name属性或者其他被自定义过滤器发现的组件:默认Bean名称为:小写字母开头的非限定类名。
情况三:自定义命名策略。具体实现BeanNameGenerator接口,确认包含一个默认的无参构造方法,然后在配置扫描器时提供一个全限定类名,
<beans ...> <context:component-scan base-package="a.b" name-generator="a.SimpleNameGenerator"/> </beans>
与通过 XML 配置的 Spring Bean 一样,通过上述注解标识的Bean,其默认作用域是"singleton",
为了配合这四个注解,在标注 Bean 的同时能够指定 Bean 的作用域,Spring2.5 引入了
@Scope 注解。使用该注解时只需提供作用域的名称就行了,如下所示:
@Scope("prototype") @Repository public class Demo { … } |
如果你想提供一个自定义的作用域解析策略而不使用基于注解的方法,只需
实现 ScopeMetadataResolver接口,确认包含一个默认的没有参数的构造方法。然后在配置扫描器时提供全限定类名:
<context:component-scan base-package="a.b" scope-resolver="footmark.SimpleScopeResolver" />