@SpringBootApplication
标明启动类的注释,也就是标明项目程序入口,实际上集成了非常多的注释
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
@Data、@AllArgsConstructor、@NoArgsConstructor
这几个都是由Lombok库提供的(可以在idea下载插件,假设用maven管理需要在pom.xml里引入),@Data修饰类会生成getter、setter以及equals()、hashCode()、toString()等方法。@NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor修饰类的话可以制定构造函数,不用自己写了。
@Autowired
自动装配对象的,可以标注在属性上、方法上和构造器上
具体来说,参考了这篇,假设标注在属性上,那么会自动注入Bean对象,默认是按照类型注入的,但假设此时Car为接口,很有可能不止一个类实现了接口,就会报错,Spring并不知道应当引用哪个实现类。可以再加一个@Qualifier(“BMW”)注释,代表是注入BMW实现的Car接口类。
@Service
public class CarFactory
{
@Autowired
private Car car;
public String toString()
{
return car.carName();
}
}
但是官方不推荐在属性上标注@AutoWired,因为类成员的初始化顺序不同,静态成员 ——> 变量初始化为默认值——>构造器——>为变量赋值。如果标注在属性上,则在构造器中就不能使用这个属性(对象)的属性和方法。所以推荐在构造器上标注@AutoWired
@Component、@Controller、@Service、@Repository
这个博文讲的不错,本质上@Controller、@Service、@Repository本质都是@Component,即Spring容器中的一个组件。因为@Controller、@Service、@Repository实际上都被@Component注释了。在Spring源码中,注解会一级一级向上递归搜索,搜索所有的注解信息,即被以上注解注解的类在Spring看来都会包含@Component注解。
- @Component:通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component
注解标注。 - @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
- @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
- @Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。
// 以下都是简略版代码
@Component
public @interface Controller {
@AliasFor(annotation = Component.class)
String value() default "";
}
@Component
public @interface Service {
@AliasFor(annotation = Component.class)
String value() default "";
}
@Component
public @interface Repository {
@AliasFor(annotation = Component.class)
String value() default "";
}
那么问题来了,假设都相同的话,那为啥不直接用@Component还要分这么多?
相信做过java web的都知道MVC的概念,都知道一个基于MVC的java web项目一般可以简单划分为:Controller、Service、Dao、Util等,如果给Controller、Service、Dao都使用@Component那么不利于逻辑分层,添加这三个注解的主要目的就是为了逻辑分层,无论开发者给Controller命名为XxxYyyZzz还是AaaBbbCcc,只要注解有@Controller,那么可以理解为祖传代码的意思就是这一块就是Controller层。
@RestController
@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器 bean,并且是将函数的返回值以 JSON 或 XML 形式写入HTTP 响应体(Response)中,以json为多,是 REST 风格的控制器。因为纯@Controller基本不用了,它是对应一个前后端不分离的情况
@Builder
可以简化builder(创建型)设计模式,例如考虑一个 User 类,包含 name、age 和 email 这三个字段。如果我们希望通过 Builder 模式创建 User 对象,那么可以这样做:
import lombok.Builder;
import lombok.ToString;
@Builder
@ToString
public class User {
private String name;
private int age;
private String email;
}
然后,我们可以通过下面的方式来创建 User 对象:
User user = User.builder()
.name("Tom")
.age(25)
.email("tom@example.com")
.build();
可以看出Lombok 生成了一个名为 builder 的静态方法,以及 name,age 和 email 的链式设置方法,最后通过 build 方法来构建 User 对象。