注解的作用

@Service注解的使用

在applicationContext.xml文件中加一行 :

<context:component-scan base-package="com.hzhi.clas"/>

1、其中base-package为需要扫描的包(含所有子包),多个包可以用逗号分隔。
2、加上这一行以后,将自动扫描路径下面的包,如果一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了,
3、类似的还包括@Component、@Repository、@Controller。
4、注解是spring框架的东西

比如下面这个类:

@Service("courseDAO")//将对象注入到courseDAO属性中
@Scope("prototype")//修改对象的作用范围
public class CourseDAOImpl extends HibernateDaoSupport implements CourseDAO{

    ......
    
}

其作用就相当于applicationContext.xml文件里面的:

<bean id="courseDAO"
         class="com.hzhi.course.dao.CourseDAOImpl" scope="prototype">
         ......    
    </bean>  





*其他注解的作用



1. 用来注解类的:写在类上面(前四个注解功能差不多,但是各有区别)

  1. @controller 控制器(注入服务)(Web层)
    用于标注控制层,相当于struts中的action层,相当于 < bean id=“courseDAO” class=“com.hzhi.course.dao.CourseDAOImpl” >

  2. @service 服务(注入dao)(Service层)
    用于标注服务层,主要用来进行业务的逻辑处理

  3. @repository(实现dao访问)(Dao层)
    用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.

  4. @component (把普通pojo实例化到spring容器中,相当于配置文件中的 )
    泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。


前四个功能总结
@Service, @Controller , @Repository = {@Component + 一些特定的功能}。这个就意味着这些注解在部分功能上是一样的。

  1. @Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理
  2. @Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能
  3. @Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
  4. @Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
  5. @Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。
  6. 用这些注解对应用进行分层之后,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。

详见:https://github.com/giantray/stackoverflow-java-top-qa/blob/master/contents/whats-the-difference-between-component-repository-service-annotations-in.md




  1. @RestController(相当于@ResponseBody + @Controller合在一起的作用。)
    返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面
    如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
    注意:此注解写在方法上面和返回值上面作用是一样的

  2. @RequestMapping("/brand")(也可以注解在方法上面
    引号中填写的是访问路径,加入方法上面还有@RequestMapping("/add")类似这样的注解,那么访问路径就为:"…/brand/add"

  3. @Mapper(注解在接口上面;按理来说是Mybatis入门-01中的东西,但是确没有讲这个注解
    从mybatis3.4.0开始加入了@Mapper注解,目的就是为了不再写mapper映射文件
    为了让UserMapper能够让别的类进行引用,我们可以在UserMapper类上添加@Mapper注解:
    在这里插入图片描述



2.用来注解变量的: 写在变量上面

  1. @Autowired(推荐)
    自动封装,会去寻找已经存在的类,相当于< property name=“car” value=“car”/>
    @Autowired是根据类型进行自动装配的。如果当Spring上下文中存在不止一个car类型的bean时,就会抛出BeanCreationException异常;

  2. @Reference
    自动封装,他一般注入的是分布式的远程服务的对象,需要dubbo配置使用
             @Autowired是本地注入,spring家族的
             @Reference是远程注入,阿里巴巴dubbo

总结:一般使用第一种,但是分布式的时候可能会需要用到第二种


  1. @Resource
    自动封装,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找@Autowired按byType自动注入,而@Resource默认按 byName自动注入。

  2. @Value(“tom”)(这个要写在变量的set方法上面
    通过set方法赋值,推荐使用,直接写在变量上面破坏了它的封装性





3. 用来注解形参的:写在形参左边

  1. @RequestParam() (下面是里面的三个参数)

    • 注意:@PathVariable是获取url上数据的(RESTful支持)
    • 作用:@RequestParam获取请求参数的(包括post表单提交)
    • value:参数名字,即入参的请求参数名字,如value=“itemId”表示请求的参数 区中的名字为itemId的参数的值将传入
    • required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报错
      TTP Status 400 - Required Integer parameter ‘XXXX’ is not present
    • defaultValue:默认值,表示如果请求中没有同名参数时的默认值
例:
@RequestMapping("/itemEdit")
public String queryItemById(@RequestParam(value = "itemId", required = true, defaultValue = "1") Integer id,
		ModelMap modelMap) {
	// 根据id查询商品数据
	Item item = this.itemService.queryItemById(id);
	// 把商品数据放在模型中
	modelMap.addAttribute("item", item);
	return "itemEdit";
}

  1. @PathVariable(“id”)(SpringMvc中的注解,详见SpringMVC-02,一般在使用RESTful的时候使用
    这里value中的 “{id}”与形参Integer中的id名称要一直,不然就需要用@PathVariable(value=“id”)来修改形参的名称(这个路径的{id}值是形参传过来的)
    在这里插入图片描述

2. @RequestBody(详见SpringMVC-02中) >@RequestBody注解用于读取http 请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上。

*注解:@ResponseBody的作用
@ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端

注:如果不使用注解驱动<mvc:annotation-driven />,就需要给处理器适配器配置json转换器,参考之前学习的自定义参数绑定。





4. 用来注解方法的:写在形参左边

  1. @CrossOrigin(origins=“http://localhost:9105”,allowCredentials=“true”)
    springMVC的版本在4.2或以上版本,可以使用注解实现跨域, 我们只需要在需要跨域的方法上添加注解@CrossOrigin即可(详见 17. 跨域解决方案与提交订单)

  2. @RequestMapping("/brand")(也可以注解在类上面
    引号中填写的是访问路径,加入方法上面还有@RequestMapping("/add")类似这样的注解,那么访问路径就为:"…/brand/add"

注:上面两个都是spring的注解





*<c:forEach>标签的补充

<c:forEach items="${itemList }" var="item" varStatus="s">
<tr>
	<td><input type="checkbox" name="ids" value="${item.id}"/></td>
	<td>
		<input type="hidden" name="itemList[${s.index}].id" value="${item.id }"/>
		<input type="text" name="itemList[${s.index}].name" value="${item.name }"/>
	</td>
	<td><input type="text" name="itemList[${s.index}].price" value="${item.price }"/></td>
	<td><input type="text" name="itemList[${s.index}].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
	<td><input type="text" name="itemList[${s.index}].detail" value="${item.detail }"/></td>
	
	<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>

</tr>
</c:forEach>

${current} 当前这次迭代的(集合中的)项
${status.first} 判断当前项是否为集合中的第一项,返回值为true或false
${status.last} 判断当前项是否为集合中的最
varStatus属性常用参数总结下:
${status.index} 输出行号,从0开始。
${status.count} 输出行号,从1开始。
${status.后一项,返回值为true或false
begin、end、step分别表示:起始序号,结束序号,跳跃步伐。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值