文章目录
在学习注解模式前,建议先阅读我的前一篇XML模式下的Spring博文,注解模式相较于XML模式来说,更加的简单、简洁。
1. 框架部署
1.1 添加依赖
添加 Spring
的依赖以及 lombok
的依赖。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.13.RELEASE</version>
</dependency>
1.2 自定义模板
自定义模板文件,文件名为 spring-ioc-annotation
,后缀为 xml
,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 声明使用注解配置 -->
<context:annotation-config/>
<!-- 声明Spring工厂注解的扫描范围 -->
<context:component-scan base-package="com.mr.beans"/>
</beans>
1.3 创建Spring配置文件
因为 Spring
容器初始化时,只会加载 applicationContext.xml
文件,那么我们在实体类中添加的注解就不会被 Spring
扫描,所以我们需要在 applicationContext.xml
声明Spring的扫描范围,以达到 Spring
初始化时扫描带有注解的实体类并完成初始化工作。
使用 spring-ioc-annotation
模板来创建 applicationContext.xml
文件。
2. 常用注解
2.1 @Component
- 类注解,声明此类被Spring容器进行管理,相当于
bean
标签的作用 - 也可以使用
value
属性用于指定当前bean
的id ,@Component(value="stu")
,相当于bean标签的id属性;value
属性也可以省略,如果省略当前类的id
默认为类名首字母改小写 - 除了
@Component
之外@Service
、@Controller
、@Repository
这三个注解也可以将类声明给Spring
管理,他们主要是语义上的区别@Controller
注解主要声明将控制器类配置给Spring管理,例如Servlet@Service
注解主要声明业务处理类配置Spring管理,Service接口的实现类@Repository
直接主要声明持久化类配置给Spring管理,DAO接口@Component
除了控制器、servcie和DAO之外的类一律使用此注解声明
- Bean类
@Component(value = "stu")
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {
private String stuNum;
private String stuName;
private String stuGender;
private int stuAge;
private Date enterenceTime; //入学日期
}
- 测试类
public class Test1 {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Student student1 = (Student) context.getBean("stu");
System.out.println(student1);
}
}
运行后的输出如下:
可以发现,注释比一般形式更加方便。
2.2 @Scope
- 类注解,用于声明当前类单例模式还是 非单例模式,相当于bean标签的scope属性;
@Scope("prototype")
表示声明当前类为非单例模式(默认单例模式)。
2.3 @Lazy
- 类注解,用于声明一个单例模式的Bean是否为懒加载;
@Lazy(true)
表示声明为懒汉模式,默认为false
。
2.4 @PostConstruct
方法注解,声明一个方法为当前类的初始化方法(在构造器之后执行),相当于bean标签的 init-method
属性。
2.5 @PreDestroy
方法注解,声明一个方法为当前类的销毁方法(在对象从容器中释放之前执行),相当于bean标签的 destory-method
属性。
2.6 @Autowired
- 属性注解、方法注解(set方法),声明当前属性自动装配,默认
byType
@Autowired(required = false)
通过requried
属性设置当前自动装配是否为必须(默认必须——如果没有找到类型与属性类型匹配的bean则抛出异常)@Autowired
默认使用byType
来装配属性,如果匹配到类型的多个实例,再通过byName
来确定Bean。
2.7 @Qualifier
@Qualifier
限定哪个bean应该被自动注入。当Spring无法判断出哪个bean应该被注入时,@Qualifier
注解有助于消除歧义bean的自动注入。示例如下:
若定义了两个 bean
标签的实例,如下,
<bean id="stu1" class="com.mr.bean.Student"></bean>
<bean id="stu2" class="com.mr.bean.Student"></bean>
引用实例时
public class clazz
{
@Autowired
private Student stu;
}
如果按照上面的程序运行的话,Spring会不知道注入那个实例,该程序会进行报错,而按照下面进行 @Qualifier
注解的话就不会进行报错。
public class clazz
{
@Autowired
@Qualifier("stu1")
private Student stu;
}
2.8 @Resource
- 属性注解,也用于声明属性自动装配
- 默认装配方式为
byName
,如果根据byName
没有找到对应的bean,则继续根据byType
寻找对应的bean,根据byType
如果依然没有找到Bean或者找到不止一个类型匹配的bean,则抛出异常。