3.1-常用注解和@SpringBootApplication标注分析
注解与业务逻辑无关,也不是程序本身,但可以对程序做出解释,程序中的类/方法/变量/参数/包等都可以被注解,完成编译检查工作,减少配置,减少重复工作等等。
常用注解
注解 | 标注位置 | 功能 |
@Autowired | 成员变量 | 自动注入依赖 |
@Bean | 方法 | @Bean用于注册Bean,@Bean标注方法时,等价于在XML中配置Bean |
@Component | 类 | 用于注册组件,当不清楚注册类属于哪个模块时就用这个注解 |
@ComponentScan | 类 | 开启组件扫描器 |
@Configuration | 类 | 声明配置类 |
@ConfigurationProperties | 类 | 用于加载额外的properties配置文件 |
@Controller | 类 | 声明控制器类 |
@ControllerAdvice | 类 | 用于声明全局异常处理类和全局数据处理类 |
@EnableAutoConfiguration | 类 | 开启项目的自动配置功能 |
@ExceptionHandler | 方法 | 声明处理全局异常的方法 |
@Import | 类 | 用于导入一个或多个@Configuration注解标注的类 |
@ImportResource | 类 | 用于加载xml配置文件 |
@PathVariable | 方法参数 | 让方法参数从URL中的占位符中取值 |
@Qualifier | 成员变量 | 与@Autowired配合使用,当Spring容器中有多个类型相同的Bean时,可以用@Qualifier("xxx")来做别名处理,指定注入别名的那个Bean |
@RequestMapping | 方法 | 指定方法可以处理哪些URL请求 |
@RequestParam | 方法参数 | 让方法参数从URL参数中取值 |
@Resource | 成员变量 | 与@AutoWired功能相似,但是有name和type两个参数,可以根据Spring配置的Bean的名称进行注入 |
@ResponseBoby | 方法 | 表示返回的结果直接写入到Http response body中,如果返回是字符串,则直接显示该字符串 |
@RestController | 类 | @Controller与@ResponseBoby的合集,表示这个控制器下面所有的方法都被@ResponseBoby标注 |
@Service | 服务的实现类 | 用于声明服务的实现类 |
@SpringBootApplication | 主类 | 用于声明项目主类 |
@Value | 成员变量 | 动态注入,支持"#{}"和"${}"表达式 |
@SpringBootApplication标注分析
启动类必须被@SpringBootApplication注解标注,从而启动一个SpringBoot项目的SpringApplication.run()方法。
@SpringBootApplication注解使用简单,但功能复杂,主要是它本质是多个功能强大的注解组合而成,最核心的三个注解为:
- @SpringBootConfiguration注解:让项目采用基于java注解的配置方式,而不是传统的xml方式
- @EnableAutoConfiguration注解:开启自动配置,这样项目启动时将自动加载所有的配置文件和配置类
- ComponentScan注解:启动组件扫描器,这样项目才能自动发现并创建各个组件的Bean,包括Web控制器(@Controller),服务(@Service),配置类(@Configuration)和其他组件(@Conponent)
注意注意:@SpringbootApplication只能扫描其所在的包及其子包中的代码,如果是其他目录下的各类组件类,那么就需要额外的添加扫描路径-@ComponentScan(basePackages = "包名")。
3.2-Bean的注册和获取
Bean是什么?
Bean是SpringBoot根据配置文件的数据信息创建并可管理的对象。简单来说,就是SpringBoot项目启动时,SpringBoot首先会自动扫描所有的组件,自然注册所有的Bean,最后把这些自动创建的Bean注入到各自的使用场景中。
Bean注册
1,让SpringBoot发现@Bean
要让Bean被SpringBoot发现,那么Bean所在的类必须是能被扫描的组件
- @Configuration:声明配置类
- @Controller:声明控制器类
- @Service:声明服务接口类
- @Repository:声明数据仓库类
- @Componnent:声明组件类,通常用这个
当然也可以不用这些注解,直接将使用了@Bean所在的类使用@Import注解注册到SpringBoot项目上.
package com.sun.test.bean;//@Component 注释掉
public class BeanTest {@Beanpublic String getMyName() {return "Mr_Sun_01";}
}@SpringBootApplication
@Import({com.sun.test.bean.BeanTest.class})//多个类就逗号分隔接着写即可
public class TestApplication {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);}
}
2,@Bean的使用方法
源码分析:
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {@AliasFor("name")String[] value() default {};@AliasFor("value")String[] name() default {};/** @deprecated */@DeprecatedAutowire autowire() default Autowire.NO;boolean autowireCandidate() default true;String initMethod() default "";String destroyMethod() default "(inferred)";
}
1,value和name属性的作用是一样的,就是给Bean起别名,让SpringBoot可以区分多个类型相同的Bean。(注意注意:SpringBoot管理的Bean是以类为主体)
使用过程最好根据场景设置别名(如果没设置别名,则默认以方法名为Bean的别名)
2,autowireCandidate属性 表示Bean是否采用默认的匹配机制,默认为true(表示以类来找),设置为false则根据别名来匹配查找,这个属性如果用了别名了一般也用不上。
获取Bean
1,如果当前类型只有一个Bean,可以直接使用@AutoWired注解(如果Bean的方法名和注入的变量名一样也可以直接用@AutoWired)
2,@AutoWired也可以组合@Qualifier("别名")进行指定别名的Bean
3,如果涉及多个Bean,用@Resource(name="别名")即可完成注入。
4,@Value也可以完成注入
1,将常量注入到info中,跟等号赋值效果一样@Value("hello_SpringBoot")String info;2,注入Bean,跟@Resource(name="name")效果一样@Value("#{myName}")String name;3,注入配置文件中的信息,使用${pswd}可以把application.properties文件中指定名称的配置信息的值完成注入@Value(${pswd})String password;
3.3-为SpringBoot项目添加依赖
pom.xml是Maven构建项目的核心配置文件,开发人员在此文件中为项目添加新的依赖,格式如下
<dependency><groupId>所属团队</groupId><artifactId>项目ID</artifactId><version>版本号</version> <scope>使用范围(可选)</scope>
</dependency>
查询依赖的版本号
1,在MVNrepository的官网进行查询(https://mvnrepository.com)
2,在阿里云云效MAVEN进行版本查找(仓库服务)
3.4-SpringBoot的命名规范
1,配置类包名-config
主要保存所有被@Configuration标注的配置类
2,公共类包名-common
主要保存供其他模块使用的组件、工具、枚举等代码。
包中存放所有被@Component标注的组件类,包名也可以用component
包中存放所有的工具类,包名也可以叫utils或者tools
3,控制器类-controller
4,服务类-service
存放所有实现业务的服务接口或者服务类
这些接口的实现类都应该放在service包下的子类impl中
5,数据库访问接口包-dao
数据库访问接口也就是持久层接口,专门执行读写数据库,持久层接口通常命名为xxxDao
6,Mybatis持久层包-mapper
如果项目使用Mybatis作为持久层框架,Mybatis会把持久层接口命名为mapper(映射器),包名也会叫mapper
如果数据库访问接口也有具体的实现层,这些实现类应该放在数据库访问接口包的impl子包下面
7,数据实体包-bean/model/entity
早期,实体类放在bean包下
SpringMVC阶段,一般放在model下
Mybatis框架也会放在entity下
8,过滤器包-filter
9,监听器包-listener