SpringMVC 注解类
- @RequestMapping注解,DispatcherServlet找到控制器并把请求分发到控制器
类定义处: 表示类中的所有响应请求的方法都是以该地址作为父路径
方法定义处:提供进一步的细分映射信息。 相对于类定义处的 URL
如果类上没有映射,那么url直接就是方法的映射;否则url为类上+方法上映射路径组合
@Controller
@RequestMapping("user") //类级别,可以不需要,如果要了,下面所有的请求路径前都需要加入 /user
public class LoginController {
//处理用户请求
@RequestMapping(value = "/login") //方法级别,必须有,决定这个方法处理哪个请求
public String doLogin() {
//此处省略处理逻辑
return "WEB-INF/page/login.jsp";
}
//处理用户退出登录请求
@RequestMapping("/logout") //方法级别,必须有,决定这个方法处理哪个请求
public String doLogout() {
//此处省略处理逻辑
return "WEB-INF/page/index.jsp";
}
}
下面这四大注解都是类级别的,可以不带任何参数,也可以带一个参数,代表bean名字,在进行注入的时候就可以通过名字进行注入了
- @Controller 注解定义控制器
- @Service 注解定义业务处理类
- @Repository 注解定义底层数据库处理接口
- @Component 是通用标注,在不清楚使用那个注解的时候,可以统统使用Component
当在spring中配置了<context:annotation-config/> 和<context:component-scan base-package="*">时,上述四种注解的组件都会由spring容器来创建为bean并由自己来管理.那么创建了上面这些组件后,又是如何来注入的呢,这时就由@autowired来配置了。只需要在private的属性上加上@autowired就可以自动把接口属性的实现类的bean注入,注意不需要setter,getter方法
@Service、@Repository注解是放到service或者dao类的实现类还是接口类中?
答案:要将@Service和@Repository放到实现类上面而不是接口类上面,接口只是一个规范,需要各种实现类去实现这个接口,我们要用的就是这些实用类的方法
- @Transactional 注解管理事务
1.不要在接口上声明@Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。
2.不要图省事,将@Transactional放置在类级的声明中,放在类声明,会使得所有方法都有事务。故@Transactional应该放在方法级别,不需要使用事务的方法,就不要放置事务,比如查询方法。否则对性能是有影响的。
3.使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)
4.使用了@Transactional的方法,只能是public,@Transactional注解的方法都是被外部其他类调用才有效,故只能是public。道理和上面的有关联。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但事务无效。