引言-为什么需要注解式开发?
随着项目变得复杂,需要编写的业务组件增多:例如UserService、EmpService,...xxxService, UserAction、EmpAction...xxxAction。每写一个业务层,就需要在Spring.xml中通过bean标签使用 id 注册,这样很麻烦。并且要是忘记注册业务层,就会出现空指针异常。因此Spring为了让开发者更专注于开发,提高效率,因此提出办法:不需要在工厂中配置,就能完成对象的创建、注入,这种方法就是注解式开发。
一、注解(Annotation)式开发
定义:通过Spring框架提供的一系列相关注解
注解:Annotation 是 java中一种特殊的类, 类似于 Interface使用时:@注解类名(属性=参数)例如:@Param
1.1开启注解扫描配置
前置条件:必须在工厂配置文件中完成注解扫描
(需要让Spring工厂知道你在哪些类上加了注解!)
<!--开启注解扫描-->
<context:component-scan base-package="com.xxx.xxx"/>
1.2实例化相关注解
Spring 自2.5版本以后,提供了一些注解用来在使用spring时进行快速开发
创建对象的相关注解有:
@Component
作用:(通用的创建实例的注解) 用来负责对象的创建 相当于 <bean id=" " class = " ">
修饰范围:只能用在类上
注意:默认使用这个注解 在工厂中创建的对象的唯一标识为 类名首字母小写 例如在类名UserDAoImpl 上加了该注解, 那么 创建出来的对象的默认id 为 userDAOImpl
value属性作用: 用来指定创建的对象 在工厂中的唯一标识
默认ID 也可以指定,因为在@Component注解中存在一个value属性,可指定创建对象的名字。如果value属性存在,最好是以接口的首字母小写来命名
@Component("userDAO") 等价于 @Component(value="userDAO")
@Component是通用的注解,为了让开发者更清晰地知道当前注解创建的是什么对象,因此有了下面三个注解,其作用一样都能创建对象。
@Repository:
作用:一般用来创建DAO中组件的注解
@Service:
作用:一般用来创建Service中组件的注解
@Controller:
作用:一般用来创建 Controller 中组件的注解
总结:
这三个注解与@Component 都可以创建对象,但这三个注解还有其他的含义,@Service创建业务层对象,业务层对象可以加入事务功能,@Controller 注解创建的对象可以作为处理器接收用户的请求。
@Repository,@Service,@Controller 是对@Component 注解的细化,标注不同层的对象。即持久层对象,业务层对象,控制层对象。
1.3控制对象的创建次数的注解
工厂中创建对象默认是单例,
a.通过在配置文件中修改 <bean id = "" class ="" scope = "singleton | prototype">
b.注解中控制创建次数
@Scope
作用: 用来指定对象的创建次数,默认单例
修饰范围:只能加在类上
value属性:singleton (单例)| prototype(多例)
注意:在管理struts的action时必须加入@Scope注解,值必须为prototype
1.4属性注入的相关注解
a.Spring框架提供的
@Autowired (推荐使用)
作用:用于给类中成员变量赋值。当在成员变量上标注了此注解,就会自动在工厂中去找有无创建好的这个类对象
修饰范围:可以加在成员变量上,也可以加成员变量大的 GET / SET 方法上
注意:默认根据类型进行注入
b.javaEE中自带的
@Resource
作用:完成成员变量的赋值(注入)操作
修饰范围:用在类中的 成员变量 或者 类中成员变量的 GET / SET 方法上
注意:默认根据名称注入,名称找不到时自动根据类型注入
注意:使用注解进行注入时, 那么以后注入的成员变量 可以不用再提供 SET 方法
1.5控制事务的相关注解
@Transactional
注解作用:用来给类中方法加入事务,简化配置文件中两段配置:1)事务通知及事务细粒度配置 2)简化事务切面配置。
修饰范围:用在类上,主要用在业务层组件类上或者是方法上
局部优先原则
- 加在 类上 代表类中所有方法加入事务控制
- 加在 方法上 代表当前方法加入事务控制
- 类和方法上都有, 那么方法优先
使用要求:要想让 @Transactional
<!--开启注解式事务,才能生效-->
<tx:annotation-driven transaction-manager="transactionManager"/>
注解属性:
propagation 用来控制事务传播级别
Isolation 用来控制隔离级别
timeout 用来设置超时性
rollback-for 用来设置什么异常回滚
norollback-for 用来设置什么异常 不回滚
readonly 用于设置事务读写性