zoukankan      html  css  js  c++  java
  • SpringBoot常用注解使用

    1.RequestBody和ResponseBody注解

    @RequestMapping(“url”),这里的 url写的是请求路径的一部分,一般作用在 Controller的方法上,作为请求的映射地址。

    代码:

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

    那么 @ResponseBody呢?

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

    举个例子:

    前台异步请求:

    function loginAction() {
    
        // 获取用户输入的账号和密码
        var name = $('#count').val();
        var password = $('#password').val();
    
        $.ajax({
            url : 'account/login.do',
            type : 'post',
            // data对象中的属性名要和服务端控制器的参数名一致 login(name, password)
            data : {
                'name' : name,
                'password' : password
            },
            dataType : 'json',
            success : function(result) {
                if (result.state == 0) {
                    // 登录成功,设置cookie并跳转edit.html
                    addCookie('userId', result.data.id);
                    addCookie('nick', result.data.nick);
                    location.href = 'edit.html';
                } else {
                    // 登录失败
                    var msg = result.message;
                    $('#sig_in').next().html(msg);
                    $('#sig_in').next().css("color", "red");
                }
            },
            error : function(e) {
                alert("系统异常");
            }
        });
        $('#password').val("");
    }

    后台 Controller类中对应的方法:

     @RequestMapping("/login.do")
        @ResponseBody
        public Object login(String name, String password, HttpSession session) {
            user = userService.checkLogin(name, password);
            session.setAttribute("user", user);
            return new JsonResult(user);
        }

    @RequestBody呢?

          @RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 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);
        }

     2、@Controller
    @Controller对应表现层的Bean,也就是Action,例如:

        @Controller
        @Scope("prototype")
         public class UserAction extends BaseAction<User>{
        ……
        }
    • 使用@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应用

     3、@ 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”变量的类型必须是“UserServiceImpl”或者是其父类“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,那么当Action需要使用UserServiceImpl时,必须通过“UserService userService = new UserServiceImpl();”主动去创建实例对象,但使用了Spring之后,Action要使用UserServiceImpl时,就不用主动去创建UserServiceImpl的实例了,创建UserServiceImpl实例已经交给Spring来做了,Spring把创建好的UserServiceImpl实例给Action,Action拿到就可以直接用了。Action由原来的主动创建UserServiceImpl实例后就可以马上使用,变成了被动等待由Spring创建好UserServiceImpl实例之后再注入给Action,Action才能够使用。这说明Action对“UserServiceImpl”类的“控制权”已经被“反转”了,原来主动权在自己手上,自己要使用“UserServiceImpl”类的实例,自己主动去new一个出来马上就可以使用了,但现在自己不能主动去new“UserServiceImpl”类的实例,new“UserServiceImpl”类的实例的权力已经被Spring拿走了,只有Spring才能够new“UserServiceImpl”类的实例,而Action只能等Spring创建好“UserServiceImpl”类的实例后,再“恳求”Spring把创建好的“UserServiceImpl”类的实例给他,这样他才能够使用“UserServiceImpl”,这就是Spring核心思想“控制反转”,也叫“依赖注入”,“依赖注入”也很好理解,Action需要使用UserServiceImpl干活,那么就是对UserServiceImpl产生了依赖,Spring把Acion需要依赖的UserServiceImpl注入(也就是“给”)给Action,这就是所谓的“依赖注入”。对Action而言,Action依赖什么东西,就请求Spring注入给他,对Spring而言,Action需要什么,Spring就主动注入给他。

    4.@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取出指定用户时需要用到
        @Resource(name = "userDao")
         private BaseDao<User> userDao;

     5.@Autowired

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

     6.@ComponentScan

    在springboot配置类或启动类使用@ComponentScan注解
    (作用:扫描指定包中的所有接口,相当于在每一个接口上写@Service或@Component或@Repository或@Controller)

    @ComponentScan
    @MapperScan(basePackages = "com.longfor.dao")
     public class ApplicationConfig {
        
     }
  • 相关阅读:
    jQuery,from标签,歪路子小技巧
    UniApp随笔
    JS的一些操作
    文本环绕
    Dictionary 存储函数,方法
    GIT项目管理
    Vue2 学习记录
    VSCode + Vue 学习笔记
    Mysql,Insert,Select时自增长问题
    ASP.NET SignalR Troubeshooting
  • 原文地址:https://www.cnblogs.com/sjxbg/p/10280807.html
Copyright © 2011-2022 走看看