前面有写过spring框架的演进历程,得出一个结论就是我们都是面向spring编程的,这里讲另一个结论:我们都是面向spring注解开发的。spring框架的核心设计理念是简化java开发,而这一路的发展越来越多的是基于注解的方式,本篇博客讲介绍一下spring注解驱动开发。
讲解本文主题之前我们需要了解一下注解,从JDK5.0新增了注解(Annotation),也叫元数据。与类、接口、枚举是在同一个层次,它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
这里我们了解一下元注解的概念,元注解是用于修饰其它注解的注解,如下所示有四种元注解:
@Documented:指定了被修饰的注解是可以Javadoc等工具文档化
@Retention:指定了被修饰的注解的生命周期
@Target:指定被修饰的注解的作用范围
@Inherited:指定了被修饰的注解修饰程序元素的时候是可以被子类继承的
我们自定义注解的时候必须标注这些元注解,另外定义好注解之后我们还需要有注解解析器去使用定义的注解。
平时我们在做J2EE开发的时候都是采用的mvc的架构,其中如下图简单demo所示:
以上展示的代码的写法我们再熟悉不过了,可以看出来一套下来都是基于注解的方式。这里只是写了个简单的demo,spring只从引入了JavaConfig之后,我们的配置也从xml配置文件也被替代了,这样一来,J2EE开发过程就可以完全以基于注解的方式开发了。
上面阐述了基于spirng注解这一开发现状,本节将总结一下我们在开发过程中常用的注解和作用。以下根据注解的功能分类介绍一下常用的注解。
@Controller
对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。
@RestController
@RestController = @Controller + @ResponseBody 这是一个组合的注解,这样控制层我们就不用写两个注解了
@Service
标注业务应用层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
@Component
通用的注解,可标注任意类为 Spring Bean。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。
@Repository
对应持久层即 Dao 层,主要用于数据库相关操作。我们在日常开发中也使用mybatis的@Mapper注解。
@Configuration
用来声明配置类,这就是上面提到的JavaConfig,也就是使用Java类替代了Xml配置文件,通常配置类里会结合@Bean注解声明对象,把返回的对象注入到容器中
@RequestMapping
它用于映射客户端的访问地址,可以被应用于类和方法上面。
可以指定请求的类型get,post,put,delete
@GetMapping
等价于@RequestMapping(value="",method=RequestMethod.GET)
@PostMapping
等价于@RequestMapping(value="",method=RequestMethod.POST)
@PutMapping(value="/users/{userId}")
等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)
@DeleteMapping("/users/{userId}")
等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)
@PathVariable
用于获取路径参数,通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中。
@RequestParam
用于controller层,是Spring的注解,用于获取查询参数,解决前台参数名称与后台接收参数变量名称不一致的问题。
@Param
用于dao层,是mybatis中的注解。
使得mapper.xml中的参数与后台的参数对应上,也增强了可读性。
@Entity
声明一个类对应一个数据库实体
@Table
@Table注解默认情况下只会完成表和实体之间的映射,声明才对象映射到数据库的数据表,通过它可以为实体指定表(table)。
常用属性:name 指定表 @Table(name = "test")
@Id
声明一个字段为主键。所有的实体类都要有主键,@Id注解表示该属性是一个主键。
@Column
声明字段,可以设置字段的属性,字段名、是否为空。
生成的表中字段的名称就是实体类中属性的名称,通过@Column注解可以定制生成的字段属性,name表示该属性对应的数据表中字段的名称,nullable表示该字段非空。
@Transient
声明不需要与数据库映射的字段,在保存的时候不需要保存进数据库。
@Transient注解表示在生成数据库中的表时,该属性被忽略,即不生成对应的字段
@Autowired
自动按照类型注入,只要容器中有唯一一个 bean 对象类型和要注入的变量类型匹配,就可以注入成功。
如果有多个类型匹配,先匹配类型,然后根据变量名称去对应,如果变量名称和 bean 名称相同,就注入。
@Resource
默认使用byName方式,就是根据变量名去匹配bean的id属性,而byType则是变量类型去匹配bean的class属性。
@Autowired和@Resource的区别:
@Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的;
@Autowird注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入;
@Autowired注解注入的对象需要在IOC容器中存在,否则需要加上属性required=false,表示忽略当 前要注入的bean,如果有直接注入,没有则会跳过,不会报错
@Value
用于注入基本类型和 String 类型的数据
@Transactional:事务注解,注解一般用在可以作用在类或者方法上
@After 在方法执行之后执行
@Before 在方法执行之前执行
@Around 在方法执行之前与之后执行
@AfterReturning当前方法作为返回后通知
@AfterThrowing当前方法作为异常后通知
@Aspect:声明一个切面
@PointCut:声明切点
@EnableAspectJAutoProxy:开启Spring对AspectJ代理的支持
本篇博客主要是讲述了我们平常开发都是基于注解的方式进行的,这也是J2EE开发技术发展现阶段的情况,注解的作用是标记,对于业务来说侵入性非常低,同时使用上灵活性非常高,相对于之前xml配置的方式,基于注解驱动开发更加灵活了。