基于上篇总结的第一种基于XML的DI,本篇总结DI的第二种,也是更为常见和应用更为广泛的基于注解的DI。
基于注解的DI
对于使用注解的 DI 操作,将不再需要在 spring 配置文件中声明bean实例。spring中使用注解,需要在原有spring运行环境基础上再做一些改变。
需要在spring配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。
使用注解的步骤:
1.加入maven的依赖spring-context ,在你加入spring-context的同时,间接加入spring-aop的依赖。使用注解必须使用spring-aop依赖
2.在类中加入spring的注解(多个不同功能的注解)
3.在spring的配置文件中,加入一个组件扫描器的标签,说明注解在你的项目中的位置
学习的注解:
@Component
@Repository
@Service
@Controller
@Value
@Autowired
@Resource
定义Bean的注解 @Component
需要在类上使用注解 @Component,该注解的value属性用于指定该bean 的id值。
Student类文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| package com.thorine.ba01;
import org.springframework.stereotype.Component;
@Component public class Student { private String name; private Integer age;
public Student() { System.out.println("Student 无参构造方法执行..."); }
public void setName(String name) { this.name = name; }
public void setAge(Integer age) { this.age = age; }
@Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
|
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <?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 https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.thorine.ba01" />
<context:component-scan base-package="com.thorine.ba01" /> <context:component-scan base-package="com.thorine.ba02" />
<context:component-scan base-package="com.thorine.ba01;com.thorine.ba02" />
<context:component-scan base-package="com.thorine" />
</beans>
|
简单类型属性注入@Value
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| package com.thorine.ba02;
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;
@Component("myStudent") public class Student {
@Value("张飞") private String name; @Value("29") private Integer age;
public Student() { System.out.println("Student 无参构造..."); }
@Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
|
自动注入@Autowired
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| package com.thorine.ba03;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;
@Component("myStudent") public class Student {
@Value("张飞") private String name; @Value("29") private Integer age;
@Autowired(required = false) private School school;
public Student() { System.out.println("Student 无参构造..."); }
@Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", school=" + school + '}'; } }
|
JDK注解@Resource 自动注入
spring提供了对jdk中@Resource注解的支持。@Resource注解既可以按名称匹配Bean,也可以按类型匹配Bean,默认是按名称注入。@Resource可在属性上,可在set方法上。
1 2 3 4 5 6 7
|
@Resource(name = "school") private School school;
|
注解与XML的对比
需要经常改变值用xml,不需要或不经常改变值的用注解。
注解更直观方便,查看类代码就能知道该类对象的信息。