Spring 注解
基于 XML 配置文件的方式在之前的系列文章中已经介绍得非常详尽了,而在实际的开发工作中,注解往往比 XML 配置使用得更为频繁,理由也很简单,使用注解能极大减少开发过程中的配置工作,每次创建 XML 文件,写标签对于大规模的项目来说,是比较繁琐的。
Spring IoC 常用注解
什么是注解?注解是 Java 提供的一种特殊的类,专门用来标注某些任务的,现在我们把原本通过 XML 配置对象的方式,现在改为通过注解配置的方式。
第一步:创建实体类,并且在实体类前面添加 @Component
注解;
package com.trainingl.entity;
import lombok.Data;
import org.springframework.stereotype.Component;
import java.util.List;
@Data
@Component
public class Student {
private Integer id;
private String name;
private Double score;
}
第二步:在测试类中直接获取 student 对象
package com.trainingl.test;
import com.trainingl.entity.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
//1.加载spring容器(扫描com.trainingl.entity包下的所有类信息)
ApplicationContext applicationContext = new AnnotationConfigApplicationContext("com.trainingl.entity");
//2.获取对象
Student stu = (Student)applicationContext.getBean("student");
System.out.println(stu);
}
}
可以发现,与XML 的配置方式不同的是不再需要将对象的信息在 XML 文件中进行配置了,只需要在创建实体类时,在实体类前添加注解 @Component
。
- 给目标类添加注解,相当于一个标记;
- 启动 IoC,指定一个包(全类名),Spring 会自动扫描这个包下的所有类,判断哪些类添加了注解,如果发现某个类添加了该注解,则创建该类的对象,并且对象标识是类名的首字母小写字符串。
所以获取对象时,applicationContext
调用 getBean()
指定的字符串 student
,就是 Student
类名的首字母小写之后的值,标识对象的 id。如果是写成其他字符串,比如:student1
,则会有如下报错信息:
与注解 @Component 类似的方式还有一个注解是 @Bean,但是 @Bean 不能直接添加到实体类中,因为 @Bean 只能添加到方法上,源码提示如下:
下面介绍 @Bean
注解的用法:
第一步:创建实体类,包括无参构造和有参构造;
package com.trainingl.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private Integer id;
private String name;
private Double score;
}
第二步:创建配置类,配置类提供获取对象的方法,给这个方法添加 @Bean
注解;
package com.trainingl.Annotation;
import com.trainingl.entity.Student;
import org.springframework.context.annotation.Bean;
public class StudentConfiguration {
@Bean
//提供返回对象的方法
public Student student(){
//还可以全参初始化操作
return new Student(1,"张三",85.0);
}
}
第三步:在测试类中直接获取 student 对象;
package com.trainingl.test;
import com.trainingl.Annotation.StudentConfiguration;
import com.trainingl.entity.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//1.加载spring容器
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(StudentConfiguration.class);
//2.获取对象
Student stu = (Student)applicationContext.getBean("student");
System.out.println(stu);
}
}
@Component
和 @Bean
注解的区别:
@Component
直接添加到实体类前,只需要一个实体类就可以完成 IoC 的注入;@Bean
不能添加到实体类中,因为@Bean
只能添加到方法上,所以@Bean
不仅要结合实体类,还需要同时结合一个配置类,配置类提供方法返回对象,给该方法添加@Bean
。