Spring注解

 Spring注解
    1 用于创建对象的注解;
        他们的作用就和在XML配置文件中编写一个<bean>标签实现的功能是一样的;
        @Component:
            作用:用于把当前类对象存入spring容器中;
            属性:
                value:指定bean的id。当我们不写时,它的默认值是当前类名,且首字母改小写。
        @Controller  一般用在表现层;
        @Service  一般用在业务层;
        @Repository  一般用在持久层;
        以上三个注解的作用和属性与Component是一模一样;
        以上三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰明了;
    
    2 用于注入数据的注解
        他们的作用就和在xml配置文件中的bean标签中写一个<property>标签的作用是一样的
        @Autowired:
            作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功
                    如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错。
                    如果Ioc容器中有多个类型匹配时:
            出现位置:
                可以是变量上,也可以是方法上
            细节:
                在使用注解注入时,set方法就不是必须的了。
        @Qualifier:
            作用:在按照类中注入的基础上再按照名称注入。它在给类成员注入时不能单独使用。在给方法参数注入时可以使用
            属性:
                value:指定注入bean的id。
            ....(@Qualifier("dataSource1") DataSource dataSource){}
        @Resource
            作用:直接按照bean的id注入。它可以独立使用
            属性:
                name:指定bean的id。
        以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现。
        另外,集合类型的注入只能通过XML来实现。
    
        @Value
            作用:注入基本类型和String类型的数据
            属性:
                value:用于指定数据的值。它可以使用spring中SpEL(也就是spring的el表达式)
                        SpEL的写法:${表达式}
    
    3 用于改变作用范围的
        他们的作用就和在bean标签中使用scope属性实现的功能是一样的
        @Scope
            作用:指定bean的作用范围
            属性:
                value:指定范围的取值。常用取值:singleton(单例) prototype(多例)
    
    4 和生命周期相关 了解
        他们的作用就和在bean标签中使用init-method和destroy-methode的作用是一样的
        @PreDestroy
            作用:指定销毁方法
        @PostConstruct
            作用:指定初始化方法
    5 用于指定配置的
      @Configuration
          作用:指定当前类是一个配置类
           细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。
    6 用于指定扫描包的
      @ComponentScan
         作用:用于通过注解指定spring在创建容器时要扫描的包
          属性:
            value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。
                我们使用此注解就等同于在xml中的配置:
                <context:component-scan base-package="com.test"></context:component-scan>
     @Bean
        作用:把当前方法的返回值作为bean对象存入spring的ioc容器中
        属性:
            name:指定bean的id。当不写时,默认值是当前方法的名称
        细节:
            当使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象。
            查找的方式和Autowired注解的作用是一样的,自动按类型注入
    7 导入其他配置类
      @Import
        作用:用于导入其他的配置类
        属性:
            value:指定其他配置类的字节码;
                    当使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类;
    8 用于指定读取配置文件的
      @PropertySource
        作用:指定properties文件的位置
        属性:
            value:指定文件的名称和路径。
                关键字:classpath,表示类路径下
    9 测试类注解
    使用Junit单元测试:测试当前的配置
    Spring整合junit的配置
        1、导入spring整合junit的jar(坐标)
        2、使用Junit提供的一个注解把原有的main方法替换了,替换成spring提供的
            @Runwith
          @RunWith(SpringJUnit4ClassRunner.class)
        3、告知spring的运行器,spring和ioc创建是基于xml还是注解的,并且说明位置
            @ContextConfiguration
            locations:指定xml文件的位置,加上classpath关键字,表示在类路径下
            classes:指定注解类所在地位置
        @ContextConfiguration(locations="classpath:testspringbean.xml")
Spring MVC 注解
    映射请求路径
    @RequestMapping(path="") 
    作用:建立请求URL和处理方法之间得对应关系
      1作用在类上,第一级得访问目录
      2作用在方法上,第二季的访问目录
  细节:路径可以不编写/表时应用的根目录开始
      ${pageContext.request.contextPath}也可以省略不写,但是路径上不能写/
   属性:     path: 指定请求的路径的url;     value: value属性和path属性是一样的;
    method: 指定该方法的请求方式
    consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;     produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;     params: 指定限制请求参数的条件;     headers: 发送的请求中必须包含的请求头。 * @requestParam(name="指定参数名")
    作用:把请求中的指定名称的参数传递给控制器中的形参赋值
    属性:
      value:请求参数中的名称
      required:请求参数中是否必须提供此参数,默认值是true,必须提供;

/**
* 接收请求
* @return
*/
@RequestMapping(path="/hello")
public String sayHello(@RequestParam(value="username",required=false)String name) {
  System.out.println("aaaa");
  System.out.println(name);
  return "success";
}

 * @requestBody
    作用:用于获取请求体的内容(注意:get方法不可以)
    属性:
      required:是否必须有请求体,默认是true
    
/**

* 接收请求
* @return
*/
@RequestMapping(path="/hello")
public String sayHello(@RequestBody String body) {
  System.out.println("aaaa");
  System.out.println(body);
  return "success";
}

 * @ResponseBody
    作用:
       1 使用@RequestBody获取请求体数据
       2 @RequestBody注解把json的字符串转换成JavaBean的对象
       3 @ResponseBody注解把JavaBean对象转换成json字符串,直接响应
       4 json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包

   @PathVariable注解
      作用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符
      属性:
        value:指定url中的占位符名称
        Restful风格的URL
        请求路径一样,可以根据不同的请求方式去执行后台的不同方法
      restful风格的URL优点
        结构清晰
        符合标准
        易于理解
        扩展方便

/**
* 接收请求
* @return
*/
@RequestMapping(path="/hello/{id}")
public String sayHello(@PathVariable(value="id") String id) {
  System.out.println(id);
  return "success";
}


    @RequestHeader注解
      作用:获取指定请求头的值
      属性
        value:请求头的名称

@RequestMapping(path="/hello")
public String sayHello(@RequestHeader(value="Accept") String header) {
  System.out.println(header);
  return "success";
}

    @CookieValue注解
      作用:用于获取指定cookie的名称的值
      属性
        value:cookie的名称

@RequestMapping(path="/hello")
public String sayHello(@CookieValue(value="JSESSIONID") String cookieValue) {
  System.out.println(cookieValue);
  return "success";
}

    @ModelAttribute注解
      作用
        出现在方法上:表示当前方法会在控制器方法执行前先执行。
        出现在参数上:获取指定的数据给参数赋值。
      应用场景
        当提交表单数据不是完整的实体数据时,保证没有提交的字段使用数据库原来的数据。

/**
* 作用在方法,先执行
* @param name
* @return
*/
@ModelAttribute
public User showUser(String name) {
  System.out.println("showUser执行了...");
  // 模拟从数据库中查询对象
  User user = new User();
  user.setName("哈哈");
  user.setPassword("123");
  user.setMoney(100d);
  return user;
}
/**
* 修改用户的方法
* @param cookieValue
* @return
*/
@RequestMapping(path="/updateUser")
public String updateUser(User user) {
  System.out.println(user);
  return "success";
}

/**
* 作用在方法,先执行
* @param name
* @return
*/
@ModelAttribute
public void showUser(String name,Map<String, User> map) {
  System.out.println("showUser执行了...");
  // 模拟从数据库中查询对象
  User user = new User();
  user.setName("哈哈");
  user.setPassword("123");
  user.setMoney(100d);
  map.put("abc", user);
}

/**
* 修改用户的方法
* @param cookieValue
* @return
*/
@RequestMapping(path="/updateUser")
  public String updateUser(@ModelAttribute(value="abc") User user) {
  System.out.println(user);
  return "success";
}


@SessionAttributes注解
  作用:用于多次执行控制器方法间的参数共享;
  属性
    value:指定存入属性的名称;

   只能作用在类上;

@Controller
@RequestMapping(path="/user")
@SessionAttributes(value= {"username","password","age"},types=
{String.class,Integer.class}) // 把数据存入到session域对象中
public class HelloController {
/**
* 向session中存入值
* @return
*/
@RequestMapping(path="/save")
public String save(Model model) {
  System.out.println("向session域中保存数据");
  model.addAttribute("username", "root");
  model.addAttribute("password", "123");
  model.addAttribute("age", 20);
return "success";
}
/**
* 从session中获取值
* @return
*/
@RequestMapping(path="/find")
public String find(ModelMap modelMap) {
String username = (String)modelMap.get("username");
String password = (String)modelMap.get("password");
Integer age = (Integer)modelMap.get("age");
System.out.println(username + " : "+password +" : "+age);
return "success";
}
/**
* 清除值
* @return
*/
@RequestMapping(path="/delete")
public String delete(SessionStatus status) {
status.setComplete();
return "success";
}
}

原文地址:https://www.cnblogs.com/zxh06820/p/12501304.html