基本注解详解-@Data,@Configuration
1.@Data注解
@Data 注解的主要作用是提高代码的简洁,使用这个注解可以省去代码中大量的get()、 set()、 toString()等方法;
==引入lombok==
要使用 @Data 注解要先引入lombok,lombok 是什么,它是一个工具类库,可以用简单的注解形式来简化代码,提高开发效率。
org.projectlombok
lombok
1.18.4
provided
使用
直接在相应的实体类上加上@Data注解即可;
比如一个简单的Person类,用常规的写法:
public class Person {
private String name;
private String address;
private Integer age;
private String hobbit;
private String phone;
public Person() {
}
public Person(String name, String address, Integer age, String hobbit, String phone) {
this.name = name;
this.address = address;
this.age = age;
this.hobbit = hobbit;
this.phone = phone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getHobbit() {
return hobbit;
}
public void setHobbit(String hobbit) {
this.hobbit = hobbit;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", age=" + age +
", hobbit='" + hobbit + '\'' +
", phone='" + phone + '\'' +
'}';
}
}
用@Data的写法:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private String address;
private Integer age;
private String hobbit;
private String phone;
}
自动生成相关的方法:
Person.png
常用的几个注解:
@Data : 注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法
@AllArgsConstructor : 注在类上,提供类的全参构造
@NoArgsConstructor : 注在类上,提供类的无参构造
@Setter : 注在属性上,提供 set 方法
@Getter : 注在属性上,提供 get 方法
@EqualsAndHashCode : 注在类上,提供对应的 equals 和 hashCode 方法
@Log4j/@Slf4j : 注在类上,提供对应的 Logger 对象,变量名为 log
原理
Lombok本质上就是一个实现了“JSR 269 API”的程序。在使用javac的过程中,它产生作用的具体流程如下:
javac对源代码进行分析,生成了一棵抽象语法树(AST)
运行过程中调用实现了“JSR 269 API”的Lombok程序
此时Lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点
javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点(代码块)
优缺点
优点:
能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
让代码变得简洁,不用过多的去关注相应的方法
属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等
缺点:
不支持多种参数构造器的重载
虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度
像 lombok 这种插件,已经不仅仅是插件了,它在编译器编译时通过操作AST(抽象语法树)改变字节码生成,变相的说它就是在改变java语法,它改变了你编写源码的方式,它不像 spring 的依赖注入一样是运行时的特性,而是编译时的特性。如果一个项目有非常多这样的插件,会极大的降低阅读源代码的舒适度。
lombok 只是省去了一些人工生成代码的麻烦,但是这些getter/setter等等的方法,用IDE的快捷键也可很方便的生成。况且,有时通过给getter/setter加一点点业务代码(但通常不建议这么加),能极大的简化某些业务场景的代码。
2. @Configuration注解
-
@Configuration是Spring的注解,不是SpringBoot的!早在Spring框架的时候就有使用,但是由于那个时候配置文件还是比较流行,因此@Configuration注解并没有太盛行,甚至很多人就认为它是SpringBoot的注解。
-
@Configuration注解的作用:声明一个类为配置类,用于取代bean.xml配置文件注册bean对象。
- 底层代码就两个属性,一个用于声明配置类的名称,一个用于声明是否是代理对象方法(重点)。
- 由于有@Component注解的加持,那么被声明的配置类本身也是一个组件!
-
基本使用
-
@Configuration注解常常一起搭配使用的注解有@Bean、@Scope、@Lazy三个比较常见:
- @Bean:等价于Spring中的bean标签用于注册bean对象的,内部有一些初始化、销毁的属性…
- @Scope:用于声明该bean的作用域,作用域有singleton、prototype、request、session。
- @Lazy:标记该bean是否开启懒加载。
这里准备两个类User和Dog类
@Data @AllArgsConstructor @NoArgsConstructor public class User { private String name; private int age; private Dog dog; }
@Data @NoArgsConstructor @AllArgsConstructor public class Dog { private String name; private int age; }
-
使用@Bean注解
@Configuration public class MyConfig { @Bean("user") public User getUser(){ System.out.println("User对象进行创建!"); return new User("用户", 22, getDog()); } @Bean("dog") public Dog getDog(){ System.out.println("Dog对象进行创建!"); return new Dog("金毛", 3); } }
- 这样就声明配置了两个bean,在Spring中相当于注册到xml配置文件中
- 默认情况下是以饿汉单例的形式进行创建,即IOC容器创建时立即创建这两个bean。
-
在主类中拿对象:
@SpringBootApplication public class MainApplication { public static void main(String[] args) { // 获取IOC容器 ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); System.out.println("===================================================="); User user = run.getBean("user", User.class); System.out.println(user.toString()); Dog dog = run.getBean("dog", Dog.class); System.out.println(dog.toString()); System.out.println("===================================================="); } }
-
@Configuration注解的属性
-
@Configuration注解中有@Component注解的加持,因此它自己本身也是一个bean对象,可以通过Context的进行获取。
-
@Configuration中的属性proxyBeanMethods是及其重要的,设置true/false会得到不同的效果。
@Configuration(proxyBeanMethods = false) public class MyConfig { } MyConfig bean = run.getBean(MyConfig.class); System.out.println(bean); /* 输出: com.splay.config.MyConfig@c9d82f9 */ @Configuration(proxyBeanMethods = true) public class MyConfig { } MyConfig bean = run.getBean(MyConfig.class); System.out.println(bean); /* 输出: com.splay.config.MyConfig$$EnhancerBySpringCGLIB$$eefc6c50@3605c4d3 */
- 值为false:那么MyConfig类是一个lite的配置类,没有代理功能
- 值为true:该类是一个Full的配置类,使用cglib代理!
————————————————
版权声明:本文为CSDN博主「Splaying」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43808717/article/details/118155699
-
-