文章目录
- Spring Boot 注解简介
- 1、五大类注解的作用
- 2、五大类注解的关系
- 3、通过注解获取对象
- 4、获取Bean对象名规则解析
Spring Boot 注解简介
Spring Boot的核心就是注解。Spring Boot通过各种组合注解,极大地简化了Spring项目的搭建和开发。五大类注解是Spring Boot注解中的关键,接下来就给大家做详细的介绍。
使用注解的优势:
1.采用纯java代码,不在需要配置繁杂的xml文件
2.在配置中也可享受面向对象带来的好处
3.类型安全对重构可以提供良好的支持
4.减少复杂配置文件的同时亦能享受到springIoC容器提供的功能
1、五大类注解的作用
想要将对象存储到Spring当中,有两种注解类型可以实现
1、五大类注解:@Controller、@Service、@Repository、@Component、@Configuration(控制器,服务,存储,组建,配置)
2、方法注解:@Bean(下节介绍)
-
@Controller(控制器):归属业务逻辑层,用来控制用户行为,用来检查用户参数的有效性,前端的请求合理性负责
-
@Service(服务):归属服务层,调用持久化类实现相应的功能,对前端请求的合理性负责【不直接和数据库交互的,类似于控制中心】
-
@Repository(仓库):归属持久层,是直接和数据库进行交互的,通常每一个表都会对应一个仓库类,对数据库的某一个表负责(@Repository)
-
@Configuration(配置):归属配置层,是用来配置当前项目的信息的,项目全局配置负责
-
@Component(组件):归属于公共工具类,提供某些公共的方法
2、五大类注解的关系
首先查看一下Controller的定义,首先在IDEA中敲一个@Controller,使用Command + 左键查看定义
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {@AliasFor(annotation = Component.class)String value() default "";
}
可以发现@Controller注解继承了@Component注解,查看其他非@Component的剩下三大类注解,发现它们都继承了@Component注解,所以我们可以认为@Component注解是其他四大类注解的父类
3、通过注解获取对象
1、使用注解向spring注入ArticleController
package com.demo.componect;
import org.springframework.stereotype.Controller;@Controller
public class ArticleController {public String sayHello() {return "Hello Article Controller";}
}
2、获取ArticleController对象
public class App {public static void main(String[] args) {// 获取上下文ApplicationContext context = newClassPathXmlApplicationContext("spring-config.xml");// 从Spring汇总获取Bean对象ArticleController articleController = context.getBean("articleController", ArticleController.class);System.out.println(articleController.sayHello());}
}
规则:获取注解注入对象的名称需要将类名第一个字母小写
问题
-
一、如果类名首字母小写,如何从Spring中会去Bean?和首字母大写一样,直接将类名首字母小写来获取对象
-
二、如果首字母和第二个字母都是大写,会怎么样? 当使用默认规则,首字母小写获取Bean对象,失败! 使用原类名获取Bean对象 成功!
-
三、项目中没有目录,全部写在java根目录下?
spring-config.xml base-package = "**"
通配符匹配
结论:当使用5大类注解时,默认情况下获取Bean对象,只需要将类名首字母小写即可。当然Bean对象首字母和第二个字母都是大写时,此时需要原类名才能正确的获取到Bean对象
4、获取Bean对象名规则解析
Spring获取Bean对象的规则是如何实现的,我们需要通过阅读Spring源码进行理解
1、shift + shift 全局搜索
2、搜索BeanName进行筛选,查看找到AnnotationBeanNameGenerator(注解 Bean 名称生成)
3、使用Structure查看类方法,找到公有函数generateBeanName,然后一层层的查找
4、找到最终结果decapitalize()
函数
若名称为空字符串或Null则直接返回,若名称大于两个字符,并且第二个字母大写,第一个字母也大写则直接返回名称,否则将名称的第一个字符小写后返回
public static String decapitalize(String name) {if (name == null || name.length() == 0) {return name;}// 首字母和次字母大写,则返回原名称if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&Character.isUpperCase(name.charAt(0))){return name;}// 首字母小写返回char chars[] = name.toCharArray();chars[0] = Character.toLowerCase(chars[0]);return new String(chars);}