Spring和SpringBoot中的注解

一.Spring中的常用注解:

1.@RequestMapping(“url”):

这里的url是请求路径的一部分,一般作用在controller方法上,作为请求的映射地址。

@RequestMapping (value="/test")//类别级映射,可以没有,一般用于减少书写量
public class myController{
@RequestMapping (value="/aaa")//方法级别映射,必须有,这个方法的访问地址就是/test/aaa,请求到的页面就是test.jsp(当然,这里的.jsp需要在配置文件中配置)
public String getMyName(){
return "Lvfz";
   }
}

2.@ResponseBody:

@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】。在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。

3.@RequestBody:

@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,将 HTTP 请求正文插入方法中,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,将请求个体封装到某个对象形参上。

@RequestMapping("/login.do")
@ResponseBody
public Object login(@RequestBody User loginUuser, HttpSession session) {
      user = userService.checkLogin(loginUser);
      session.setAttribute("user", user);
      return new JsonResult(user);
}

4.@controller:

用于定义控制器类,对应表现层的Bean,也就是Action,例如:

@Controller
@Scope("prototype")
public class UserAction extends BaseAction<User>{
……
}

在Spring项目中由控制其负责将用户发来的URL请求转发到对应的服务接口(service层),一般注解在类上面,通常方法要配合注解@RequestMapping。

使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为"userAction"的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value=“UserAction”)】或者【@Controller(“UserAction”)】,则使用value作为bean的名字。

这里的UserAction还使用了@Scope注解,@Scope(“prototype”)表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式(scope=“singleton”),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope=“prototype” 可以保证当有请求的时候都创建一个新的Action对象。

spring中bean的scope属性,有如下5种类型:
    1.singleton 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例
    2.prototype表示每次获得bean都会生成一个新的对象
    3.request表示在一次http请求内有效(只适用于web应用)
    4.session表示在一个用户会话内有效(只适用于web应用)
    5.globalSession表示在全局会话内有效(只适用于web应用

5.@RestController:

用于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集。

(一般控制器类用到的注解有:@RestController(或者@ResponseBody+@Controller),@RequestMapping,@ResponseBody)

6.@Service:

@Service对应的是业务层Bean,例如:

@Service("userService")
public class UserServiceImpl implements UserService {
 ………
}

@Service(“userService”)注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Action:在Action只需要声明一个名字叫“userService”的变量来接收由Spring注入的"userService"即可,具体代码如下:

// 注入userService
@Resource(name = "userService")
private UserService userService;

Action中的声明的“userService”变量使用了@Resource注解去标注,并且指明了其name = “userService”,这就等于告诉Spring,说Action要实例化一个“userService”,让Spring快点帮忙实例化好给我,当Spring看到(扫描到)userService变量上的@Resource的注解时,根据其指明的name属性可以知道,Action中需要用到一个UserServiceImpl的实例,此时Spring就会把自己创建好的名字叫做"userService"的UserServiceImpl的实例注入给Action中的“userService”变量,帮助Action完成userService的实例化,这样在Action中就不用通过“UserService userService = new UserServiceImpl();”这种最原始的方式去实例化userService了。体现了Spring的控制反转,依赖注入。

7.@Repository:

@Repository对应数据访问层Bean ,例如:

@Repository(value="userDao")
public class UserDaoImpl extends BaseDaoImpl<User> {
………
}

@Repository(value=“userDao”)注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = “userDao”)注解告诉Spring,Spring把创建好的userDao注入给Service即可,例如:

// 注入userDao(从数据库中根据用户Id取出指定用户时需要用到userDao对象)
@Resource(name = "userDao")
private BaseDao<User> userDao;

8.@Autowired:

  • @Autowired(required=true):当使用@Autowired注解的时候,其实默认就是@Autowired(required=true),表示注入的时候,该bean必须存在,否则就会注入失败。
  • @Autowired(required=false):表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错。

9.@ComponentScan:

在springboot配置类或启动类使用@ComponentScan注解,扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。是以前的context:component-scan(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。所以我们写的类及方法为何会被spring容器管理,例如:

@ComponentScan
@MapperScan(basePackages = "com.longfor.dao")
public class ApplicationConfig {
 ………
}

10.@PathVariable:

@PathVariable是用来获得请求url中的动态参数,即url地址中的某一部分的值。
在路由中定义变量规则后,通常我们需要在处理方法(也就是@RequestMapping注解的方法)中获取这个URL的具体值,并根据这个值(例如用户名)做相应的操作,SpringMVC提供的@PathVariable可以帮助我们。

11.@RequestParam:

@RequestParam用来获取请求参数,将请求参数绑定至方法参数。

*12.@pathVariable和RequestParam的区别:

RequestParam 汉语意思就是: 请求参数。顾名思义,就是获取参数的 。
PathVariable 汉语意思是:路径变量。顾名思义,就是要获取一个url 地址中的一部分值,哪部分呢?RequestMapping 上说明@RequestMapping(value="/emp/{id}"),就是想获取URL地址 /emp/ 的后面的那个 {id}的。

PathVariable是从路径中获取变量,也就是把路径当做变量,RequestParam是从请求里面获取参数,从请求来看: /Springmvc/user/page.do?pageSize=3&pageNow=2
pageSize和pageNow应该是属于参数而不是路径,所以应该添加@RequestParam的注解。
如果url是这样:someUrl/{paramId},这里的paramId是路径中的变量,应使用@pathVariable

代码实例 :   地址1:http://localhost:8989/SSSP/emps?pageNo=2   如果想获取地址1中的 pageNo的值 ‘2’ ,则使用 @RequestParam ,
  如果想获取地址2中的 emp/7 中的 ‘7 ’ 则使用 @PathVariable
代码如下:

@RequestMapping(value="/getTaobao")
public List<Taobao> doAddTaobao(@RequestParam(required = false) Integer status){
    return taobaoService.getTaobao(status);
}
@RequestMapping(value = "/auditTaobao/{id}")
public void doAuditTaobao(@PathVariable Integer id){
    taobaoService.auditTaobao(id);
}

二.SpringBoot中的特殊注解:

1.@SpringBootApplication:

@SpringBootApplication是一个复合注解,包括@ComponentScan,@SpringBootConfiguration,@EnableAutoConfiguration。

1.@SpringBootConfiguration:继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。

2.@EnableAutoConfiguration:的作用启动自动的配置。@EnableAutoConfiguration注解的意思就是Springboot根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web,来判断你的项目是否需要添加了webmvc和tomcat,就会自动的帮你配置web项目中所需要的默认配置。一些简单的demo实际还没有用到该注解。

3.@ComponentScan:见上文。