1、@Controller: 标注展示层组件(Bean),但是目前该功能与 @Component 相同,用来创建处理http请求的对象
   Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认
返回json格式
1.1)@RequestMapping
    类定义处: 提供初步的请求映射信息,相对于 WEB 应用的根目录。方法处: 提供进一步的细分映射信息,相对于类定义处的 URL。
    示列1:
    @Controller
    @RequestMapping("/fourthPage")
    public class FourthPageController extends CommonController {}
    
    示列2:包含.do,当访问路径中不包含.do后缀时,会报错404
    @RequestMapping(value = "/getLogo.do")
    @ResponseBody
    public void getLogo(HttpServletRequest request,HttpServletResponse response) throws IOException {}
    
    示列3:不包含do
    @RequestMapping(value = "/ajax/itemParameter/{partNumber:[\\d]+}_{cateGoryCode}","/ajax/itemPackageDetail/{supplierCode:[\\d]+}/{partNumber:[\\d]+}"})
    public String itemParameter(@RequestParam(value = "callback", required = false) String callback,
                                @PathVariable("partNumber") String partNumber,
                                @PathVariable("cateGoryCode") String cateGoryCode,
                                @RequestParam(value = "channel", required = false) String channel,
                                HttpServletResponse response) {

分析:
    a. @RequestMapping使用正则表达式
    @RequestMapping(value = "/ajax/itemParameter/{partNumber:[\\d]+}_{cateGoryCode}")
    partNumber:[\\d]+  表示:partNumber的传值必须是数字,匹配一次或多次,若果不是
    b. @RequestMapping中的value为2个请求,表示两个不同的请求共用该一个方法
   
1.2)@RequestParam
    用于将请求参数区数据映射到功能处理方法的参数上,如果接口传递过来的参数名和接收的不一致,可以可以用如下的方式进行接收。
    payWay 就是接口传递的参数,channel 就是映射 payWay 的参数名
    @RequestMapping(value = "/itemInfo.do")
    @ResponseBody
    public String itemParameter(@RequestParam(value = "payWay", required = false) String channel){
    
    }

1.3)@ModelAttribute
    示列1:用在有返回的方法上:
    当ModelAttribute设置了value,方法返回的值会以这个value为key,以参数接受到的值作为value,存入到Model中,如下面的方法执行之后,最终相当于 model.addAttribute("user_name", name);
    假如 @ModelAttribute没有自定义value,则相当于model.addAttribute("name", name);

@ModelAttribute(value="user_name")
    public String itemParameter(@RequestParam(value = "channel", required = false) String name,Model model,HttpServletResponse response) {
        return name;
    }
    示列2:用在没返回的方法上,需要手动增加model.addAttribute()方法
    @ModelAttribute
    public String itemParameter(@RequestParam(value = "channel", required = false) String name,Model model,HttpServletResponse response) {
        model.addAttribute("name",name);
    }
    示列3:标记在方法的参数上
    会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用.
    @RequestMapping(value = {"/ajax/itemPackageDetail/{partNumber:[\\d]+}","/ajax/itemPackageDetail/{supplierCode:[\\d]+}/{partNumber:[\\d]+}"})
    public String queryPackageDetail(@RequestParam(value = "callback", required = false) String callback,
                                     @PathVariable("partNumber") String partNumber,
                                     @ModelAttribute("supplierCode") String supplierCode,
                                     @RequestParam(value = "channel", required = false) String channel,
                                     HttpServletResponse response) {}
                                        
    
1.4)@PathVariable("partNumber")
    通过 @PathVariable 可以将URL中占位符参数{partNumber}绑定到处理器类的方法形参中@PathVariable(“partNumber“)
    备注:参看文章 https://mp.weixin.qq.com/s/wImduUsyy0dG0ZawmZab4g

2)@Service:    标注业务层组件(Bean),但是目前该功能与 @Component 相同
    示列:
    @Service("productSearchService")
    @Implement(contract = ProductSearchService.class)
    public class ProductSearchServiceImpl implements ProductSearchService {
        @Autowired
        @Qualifier("jedisClient")
        private JedisClientImpl jedisClient;
        
        @Autowired
        private CategoryBusiness                      categoryBusiness;
        
    }

3)@Repository: 标注存储层组件(Bean)
   import org.springframework.stereotype.Repository;
   为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用Bean 的自动扫描功能,这可以通过<context:component-
   scan/>实现
   
   @Repository 只能标注在 DAO 类上呢?这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring
   的数据访问异常类型。Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异
   常独立于底层的框架。
   示列:
   @Repository
   public class CmmdtySpecialInfoBusiness {
        @Autowired
        DalClient dalClient;
        
        @Autowired
        @Qualifier("cmmdtyDalClientRead")
        protected DalClient cmmdtyDalClientRead;    
   }
  
4)@Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次   
   
5)@Transactional 通常添加在service层
        a.所谓事务是指一组逻辑操作单元即一组sql语句。当这个单元中的一部分操作失败,整个事务回滚,只有全部正确才完成提交。判断事务是否配置成功
    的关键点在于出现异常时事务是否会回滚。
        b.如果我们的事务注解@Transactional加在dao层,那么只要与数据库做增删改,就要提交一次事务,如此做事务的特性就发挥不出来,尤其是事务的
    一致性,当出现并发问题是,用户从数据库查到的数据都会有所偏差。一般的时候,我们的service层可以调用多个dao层,我们只需要在service层加一个事务
    注解@Transactional,这样我们就可以一个事务处理多个请求,事务的特性也会充分的发挥出来。

6)@Qualifier注解
        qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的。当EmployeeService接口有两个serviceImp类service1 和service2时
    如果使用@Autowired对EmployeeService进行注入时,spring会因为不知道该绑定哪个实现类而报错。需要使用@Qualifier进行区分
        示列:
        @Autowired
        @Qualifier("service1")
        EmployeeService employeeService;
    
7)@Autowired和@Resource区别:
        a. @Autowired 是spring提供的注释,默认按byType注入。byName需要与@Qualifier("对象名")连用
        用来装配bean,可以写在字段上,或者方法上。默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,
        例如:@Autowired(required=false)

b. @Resource 是JAVA2EE提供的,同时支持byType和byName注入,默认按byName注入,如果默认情况下找不到就按类型找(name属性解析为bean的名字,
        而type属性则解析为bean的类型,如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略)
    推荐使用:@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与spring的耦合。这样代码看起就比较优雅。一般常用@Autowired
        示列:
            @Resource(name = "auditOrderSubmitServiceImpl")
            private OrderSubmitService<OrderInfo> auditOrderSubmitServiceImpl;
            
            @Autowired
            private OrderSubmitBusiness orderSubmitBusiness;
            
            public abstract class CommonBusiness {
                /** 用于增加、修改、删除、合并操作 */
                @Resource
                @Qualifier("dalClient")
                protected DalClient dalClient;
                /** 用于查询操作 */
                @Resource
                @Qualifier("dalClientRead")
                protected DalClient dalClientRead;
            }
    @Resource装配顺序:
    a.如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
    b.如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
    c.如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
    d.如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
   
8)@Scope 用来配置 spring bean 的作用域,它标识 bean 的作用域。默认值是单例
    a.singleton:单例模式,全局有且仅有一个实例
    b.prototype:原型模式,每次获取Bean的时候会有一个新的实例
    c.request:request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
    d.session:session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
    e.global session:只在portal应用中有用,给每一个 global http session 新建一个Bean实例

十、Spring中常用注解-分层整理的更多相关文章

  1. Spring 中常用注解原理剖析

    前言 Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用 <bean/> 标签来配置 ...

  2. Spring中常用注解的介绍

    spring中使用注解时配置文件的写法: <?xml version="1.0" encoding="UTF-8"?> <span style ...

  3. Spring中常用注解

    1.@Component 创建类对象,相当于配置<bean/> 2.@Service @Service与@Component功能相同,写在ServiceImpl类上 3.@Reposito ...

  4. 0000 - Spring 中常用注解原理剖析

    1.概述 Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用 <bean/> 标签来 ...

  5. Spring -13 -Spring 中常用注解总结

    1.@Component 创建类对象,相当于配置<bean/> 2.@Service 与@Component 功能相同. 2.1都写在ServiceImpl 类上. 3.@Reposito ...

  6. spring 以及 spring mvc 中常用注解整理

    spring 以及 spring mvc 中常用注解整理 @RequestMapping(映射路径) @Autowired(注入 bean 对象) 例如: @Autowired private Bas ...

  7. spring注解开发中常用注解以及简单配置

    一.spring注解开发中常用注解以及简单配置 1.为什么要用注解开发:spring的核心是Ioc容器和Aop,对于传统的Ioc编程来说我们需要在spring的配置文件中邪大量的bean来向sprin ...

  8. Spring/SpringBoot常用注解总结

    转自:[Guide哥] 0.前言 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用法,掌握搞懂,使 ...

  9. Spring Boot常用注解总结

    Spring Boot常用注解总结 @RestController和@RequestMapping注解 @RestController注解,它继承自@Controller注解.4.0之前的版本,Spr ...

随机推荐

  1. QT+VS中使用qDebug()打印调试信息无法显示

    首先右键点击项目名称,找到最后一项属性 然后依次设置为如图所示即可 再次编译后,会弹出CMD窗口,出现qDebug的调试信息.

  2. QT+VS后中文字符乱码问题

    在VS中写QT项目会出现中文乱码现象,尤其是控件的中文乱码以及qDebug()时候中文乱码通用的解决办法: 在头文件(.h)前面加上如下代码: #ifdef WIN32 #pragma executi ...

  3. 当map的key为对象时,js无法解析key的属性值

    重写对象的toString方法,按照json数据的规则 然后前台string转json 控制台打印 这个方法不需要引入其他包 如果map的key属性过多,或者key是集合,可以在后台先转json,然后 ...

  4. Loppinha, the boy who likes sopinha Gym - 101875E (dp,记忆化搜索)

    https://vjudge.net/contest/299302#problem/E 题意:给出一个01 0101串,然后能量计算是连续的1就按1, 2, 3的能量加起来.然后给出起始的能量,求最少 ...

  5. bugku come_game

    首先打开游戏发现就是一个单纯的游戏但是当你闯过一关去的时候会发现会多一个文件 看一下玩游戏前 与玩游戏之后有什么变化 然后发现一个文件叫temp 然后用hxd进行分析一下然后尝试着将01改成02然后就 ...

  6. 小白艰难的Python图像的绘制

    1.贪吃蛇 代码: import turtle turtle.setup(650,350) turtle.penup() turtle.fd(-250) turtle.pendown() turtle ...

  7. P&R --From 陌上风骑驴看IC

    FLOORPLAN: 做好floorplan要掌握哪些知识技能 遇到floorplan问题,大致的debug步骤和方法有哪些 如何衡量floorplan的QA 以上是驴神提的五大点问题.鄙人狠狠地反驳 ...

  8. Wx-小程序-图片预览、保存

    点击图片预览 长按图片保存 点击按钮保存到手机相册 view: <!--wxml--> <text>点击图片预览.长按保存图片.点击按钮保存到系统相册</text> ...

  9. (VLAN)理解Hybrid接口的应用

    实验三:理解Hybrid接口的应用 实验原理: 实验内容: 某企业二层网络使用两台S3700交换机S1和S2,且两台设备在不同的楼层.网络管理员规划了3个不同VLAN, HR部门使用VLAN 10,市 ...

  10. 在虚拟机安装centos7

    因为工作需要,要经常用到虚拟机,以I前老让别人给装,可是老问人家也不好,自己整理一份比较适合小白用的教程,有点繁琐: 一.工具:VMware      CentOS7 的 ISO 文件 二.开始安装 ...