目录
什么是注解?
注解(Annotation)是JDK1.5以及之后的版本引入的.
使用在创建文档,代码的依赖性,执行基本编译时检查,是以@注解名的形式在代码中实现.
根据参数个数可分为三类:
- 标记注解
- 单值注解
- 完整注解
注解不会影响到程序,只作为一个标识的形式存在,可以通过反射机制访问
为什么使用注解?
传统的Spring做法使用xml文件来注入bean,配置等,这样做会有两个缺点:
- 如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低。
- 在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率.
为了解决这两个问题,Spring引入了注解.
好处:通过"@XXX"的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。
Spring常用注解
- @Component :标注一个普通的spring Bean类。
- @Repository:标注一个DAO层组件类。
- @Service:标注一个业务逻辑组件类。
- @Controller:标注一个控制器组件类。
日常开发Spring中这些注解很常见@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。
@Component可以代替@Repository、@Service、@Controller,因为这三个注解是@Component标注的.
SpringMVC常用注解
- @Controller
- @RequestMapping
- @Resource
- @Autowired
- @ModelAttribute
- @SessionAttributes
- @PathVariable
- @requestParam
- @ResponseBody
- @Repository
@Controller
@Controller声明该类为SpringMVC中的Controller用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。
@Autowired
@Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。
@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。
@Resource
@Resource注解与@Autowired注解作用非常相似
@Resource的装配顺序:
- @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
- 指定了name或者type则根据指定的类型去匹配bean
- 指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错
@Autowired和@Resource的区别
区别:
1.@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
2.@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了
建议:
Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。
总结:
相同点: @Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。
不同点:
(1)提供方
@Autowired是Spring的注解,@Resource是javax.annotation注解,而是来自于JSR-250,J2EE提供,需要JDK1.6及以上。
(2) 注入方式
@Autowired只按照Type 注入;@Resource默认按Name自动注入,也提供按照Type 注入.
(3):属性
@Autowired注解可用于为类的属性、构造器、方法进行注值。默认情况下,其依赖的对象必须存在(bean可用),如果需要改变这种默认方式,可以设置其required属性为false。