@Autowired

这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。

<bean id="userDao" class="..."/>
<bean id="userService" class="..."> 
<property name="userDao"> <ref bean="userDao"/> </property></bean>

这样你在userService里面要做一个userDao的setter/getter方法。但如果你用了@Autowired的话,你只需要在UserService的实现类中声明即可。

@Autowiredprivate IUserDao userdao;

@Qualifier

@Qualifier 注释指定注入 Bean 的名称,@Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。

Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释

在Spring2.5中引入了更多的典型化注解,@Repository ,@Service,@Controler是@Component的细化。分别表示持久层,服务层,控制层。建议使用这个注解来取代@Component

在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。 Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked 如果遇到checked意外就不回滚。

// 如果有事务,那么加入事务,没有的话新建一个(不写的情况下)
     @Transactional(propagation=Propagation.REQUIRED) 
     // 容器不为这个方法开启事务
     @Transactional(propagation=Propagation.NOT_SUPPORTED)
     // 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
     @Transactional(propagation=Propagation.REQUIRES_NEW) 
     // 必须在一个已有的事务中执行,否则抛出异常
     @Transactional(propagation=Propagation.MANDATORY)
     // 必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
     @Transactional(propagation=Propagation.NEVER) 
     // 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
     @Transactional(propagation=Propagation.SUPPORTS)