Spring框架从入门到入土(三):Spring之基于注解的DI(依赖注入)
注解的使用步骤:
- 加入maven的依赖,spring-context,在你加入spring-context的同时,间接加入了spring-aop的依赖。使用注解必须使用aop依赖。
- 在类中加入spring的注解(多个不同功能的注解)
- 在spring的配置文件中,加入一个组件扫描标签,说明注解在你项目中的位置。
定义Bean的注解@Comptent
@Component 创建对象的,等同于<bean>的功能
属性:value就是对象的名称,也就是bean的id值
value的值是唯一的,创建的对象在整个spring容器中就一个
位置:在类的上面
举例子:
- 创建Student类
package com.liar.ba01;
import org.springframework.stereotype.Component;
/**
* @author liar
* @date 编写时间: 2022/3/23 12:58
*
* @Component 创建对象的,等同于<bean>的功能
* 属性:value就是对象的名称,也就是bean的id值
* value的值是唯一的,创建的对象在整个spring容器中就一个
* 位置:在类的上面
*
*/
@Component(value = "myStudent")
public class Student {
private String name;
private Integer age;
public Student() {
}
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
- 声明组件
<?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">
<!--声明组件扫描器
base-package:指定注解在你项目中的包名
component-scan的工作方式:spring会扫描遍历base-package指定的包,
把包中和子包中所有的类,找到类中的注解,按照注解的功能创建对象,或者给属性赋值。
加入了component-scan标签,配置文件的变化:
1. 加入了一个新的约束文件spring-context.xsd
2. 给这个新的约束文件起个命名空间的名称
-->
<context:component-scan base-package="com.liar.ba01"/>
</beans>
- 测试方法
@Test
public void test01(){
String config = "applicationContext.xml";
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
//从容器中获取对象
Student student = (Student) context.getBean("myStudent");
//使用对象
System.out.println(student);
}
多注解分层
注解的写法:
//正统写法
@Component(value = "myStudent")
//省略写法
@Component("myStudent")
//默认不指定对象,由spring提供默认名称:类名的首字母小写
@Component
* spring中和@Component的功能一致,创建对象的注解还有:
* 1. @Repository(用在持久层上):放在dao的实现类上面,表示创建dao对象,dao对象是能访问数据库的。
* 2. @Service (用在业务层上):放在service的实现类上面,创建service对象,service对象是做业务处理的,有处理事务的功能。
* 3. @Controller(用在控制器的上面):放在控制器(处理器)类的上面,创建控制器对象,控制器对象,能够接受用户提交的参数,显示请求的处理结果。
*
* 以上三个注解的用法和Component一样的,但是这三个注解还有额外的功能
* @Repository,@Service,@Controller 是用来给项目的对象分层的
扫描多个包的方式
<!--指定多个包的三种方式-->
<!--第一种:使用多次组件扫描器,指定不同的包-->
<context:component-scan base-package="com.liar.ba01"/>
<context:component-scan base-package="com.liar.ba02"/>
<!--第二种:使用分隔符(;或者,)分隔多个包-->
<context:component-scan base-package="com.liar.ba01;com.liar.ba02"/>
<!--第三种:指定父包-->
<context:component-scan base-package="com.liar"/>
简单的类型属性注入@Value
/**
* @Value:简单类型的属性赋值
* 属性:value是String类型的,表示简单类型的属性值
* 位置:1. 在属性定义上面,无需set方法
* 2. 在set方法上面
*/
@Value(value = "张三")
private String name;
@Value(value = "18")
private Integer age;
@Value(value = "18")
public void setAge(Integer age) {
this.age = age;
}
引用类型@Autowired
byType自动注入@Autowired
/**
* 引用类型
* @Autowired: spring框架提供的注解,实现引用类型的赋值。
* spring中通过注解给引用类型赋值,使用的是自动注入原理,支持byName,byType
* 默认使用的是byType注入
*
* 位置:1. 在属性的定义上面,无需set方法,推荐使用
* 2. 在set方法上面
*/
@Autowired
private School school;
byName自动注入@Autowired和@Qualifier
- 如果要使用byName,需要做的是
- 在属性上面加入@Autowired
- 在属性上面加上@Qualifier(value = “bean的id”):表示要用指定名称的bean完成赋值
//这两个注解没有先后顺序
@Autowired
@Qualifier(value = "mySchool")
private School school;
引用类型Autowired的required属性
是一个布尔类型,默认是true
required=true:表示引用类型赋值失败,程序报错,并终止执行。
required=false:表示引用类型赋值失败,程序正常执行,引用类型是一个null。
推荐使用true,保证引用类型都是赋值成功的,会把问题尽早地暴露!!!
JDK注解@Resource自动注入
/**
* @Resource 来自jdk的注解,spring框架提供了对这个注解的功能支持,可以使他给引用类型赋值
* 使用的也是jdk自动注入原理,支持byName、buType,默认是byName
* 位置:1. 在属性定义的上面,无需set方法,推荐使用
* 2. 在set方法上面
*
* 先使用byName注入,如果byName失败,再使用byType
*/
@Resource
private School school;
- 如果只使用byName方式,需要增加一个属性值name
@Resource(name = "mySchool")
private School school;
使用${}解耦合
- 写配置文件
myName = 张三
myAge = 李四
- 配置路径
<context:property-placeholder location="xxxxxxxxxxxx"/>
- 引用
@Value(value = "${myNAme}")
private String name;
@Value(value = "$)
private Integer age;