1、@controller 控制器(注入服务)
用于标注控制层,相当于struts中的action层
2、@service 服务(注入SERVICES)
用于标注服务层,主要用来进行业务的逻辑处理
3、@repository(实现DAO访问)
用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.
4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的
<bean id="" class=""/>)
泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。
案例:
<context:component-scan base-package=”com.*”>
上面的这个例子是引入Component组件的例子,其中base-package表示为需要扫描的所有子包。
共同点:被@controller 、@service、@repository 、@component 注解的类,都会把这些类纳入进spring容器中进行管理
延伸阅读1: @Component注解和@Bean注解的作用,以及两者的区别:
@Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。
@Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。
两者的目的是一样的,都是注册bean到Spring容器中。
区别:
@Component(@Controller、@Service、@Repository)通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。
而@Bean注解通常是我们在标有该注解的方法中定义产生这个bean的逻辑。
@Component 作用于类,@Bean作用于方法。
总结:
@Component和@Bean都是用来注册Bean并装配到Spring容器中,但是Bean比Component的自定义性更强。可以实现一些Component实现不了的自定义加载类。
延伸阅读2:spring注解中的@Autowired和@Component基本作用
1.我们在初次写spring的demo程序的时候,一定会觉得很繁琐,我要用一个类,直接new不就行了么,搞这么麻烦?
但是当我们用的稍微多了些的时候,就会发现,当我们需要的对象很多的时候,管理这些对象很复杂,很麻烦!!
所以,spring框架给了我们很好的方法去简化操作,@Autowired和@Component简直就是一对兄弟搭档
2. @Autowired
作用:@Autowired表示被修饰的类需要注入对象,spring会扫描所有被@Autowired标注的类,然后根据 类型 在ioc容器中找到匹配的类注入。
示例代码:
Java代码
@Autowired public class Car(Brand benz) { this.brand=benz; }
Car这个类被标注了,那么spring扫描到之后,发现需要Brand这个类的实例对象,那么spring会去ioc容器中找到类型匹配的对象注入。基本流程就是这样的,至于其他更复杂的问题,比如同一个类型的类有多个不同的bean,注入哪个,请百度吧。 当然,实现这种功能需要在ApplicationContext.xml中进行配置。
3. @component
作用:把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
虽然有了@Autowired,但是我们还是要写一堆bean的配置文件,相当麻烦,而@Component就是告诉spring,我是pojo类,把我注册到容器中吧,spring会自动提取相关信息。那么我们就不用写麻烦的xml配置文件了,yeah!
当然,实现这种功能需要在ApplicationContext.xml中进行配置。
4.spring有2种注册bean的方式,一种是xml文件配置,另外一个是通过注解完全去除xml文件中的bean配置,
找了一天,发现一篇很好的文章
http://blog.csdn.net/xyh820/article/details/7303330/
延伸阅读3:@Controller和@RestController的区别?
知识点:@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
1) 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
2) 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
例如:
1.使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面
若返回json等内容到页面,则需要加@ResponseBody注解
@CrossOrigin @Controller public class FileUploadController { //跳转到上传文件的页面 @RequestMapping(value="/gouploadimg", method = RequestMethod.GET) public String goUploadImg() { //跳转到 templates 目录下的 uploadimg.html return "uploadimg"; }
//处理文件上传 @RequestMapping(value="/testuploadimg", method = RequestMethod.POST) public @ResponseBody String uploadImg(@RequestParam("file") MultipartFile file, HttpServletRequest request) { System.out.println("调用文件上传方法"); String contentType = file.getContentType(); String fileName = file.getOriginalFilename();
2.@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面
@CrossOrigin @RestController /* @Controller + @ResponseBody*/ public class HospitalController { //注入Service服务对象 @Autowired private HospitalService hospitalService; /** * 查询所有医院信息(未分页) */ @RequestMapping(value = "findAllHospital",method = RequestMethod.GET) public List<Hospital> findAllHospital(){ List<Hospital> hospitalList= hospitalService.findAllHospital(); return hospitalList; }