基于注解的DI

1
2
3
4
5
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.19</version>
</dependency>

加入此注解,也会间接加入spring-aop依赖

注解-创建对象

@component

用于创建对象,等同于bean功能,value是bean的id值,value值是唯一的,创建的对象在spring容器中就一个

创建对象

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
package com.zss.pojo;

import org.springframework.stereotype.Component;

/**
* @author zss
*/
//我们也可以不指定对象名称,spring默认指定对象名称,第一个字母小写

@Component(value = "myStudent")
public class Student {
String name;
Integer age;
School school;

public Student(String name, Integer age) {
this.name = name;
this.age = age;
}

public Student() {
}

public void setName(String name) {
this.name = name;
}

public void setAge(Integer age) {
this.age = age;
}

public void setSchool(School school) {
this.school = school;
}

@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", school=" + school +
'}';
}
}

扫描组件

1
2
3
4
5
6
7
8
9
<?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:component-scan base-package="com.zss.pojo"/>
</beans>

测试

1
2
3
4
5
6
7
8
@Test
public void test01() {
String config = "applicationContext.xml";
//通过无参构造方法进行设置
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(config);
Student student = (Student) applicationContext.getBean("myStudent");
System.out.println(student);
}

image-20220505103302621

其他

  1. @Repository(用在持久层上面):放在dao的实现类上面,表示创建dao对象,dao对象访问数据库
  2. @Service(用在业务层上面,放在service实现类上面),创建service对象,service对象是做业务处理,可以有事务等功能
  3. @Controller,用在控制器上面,创建控制器对象,接受用户的参数,显示请求的处理结果

以上的三个和@Component一样的,都能创建对象,但是还有额外的功能

注解-赋值

@Value简单类型赋值

在属性定义上,不需要set方法,当然也可以放到set方法上进行赋值

1
2
3
4
@Value("张三")
String name;
@Value("15")
Integer age;

引用数据类型赋值

@Autowired

自动注入,默认使用bytype注入

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
package com.zss.pojo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("myschool")
public class School {
@Value("北京大学")
String name;
@Value("北京")
String address;

public void setName(String name) {
this.name = name;
}

public void setAddress(String address) {
this.address = address;
}

@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
1
2
3
4
5
6
@Value("张三")
String name;
@Value("15")
Integer age;
@Autowired
School school;

image-20220505110723199

我们也可以设置为ByName的方式,需要加入@Qualifier进行指定@Qualifier(value=“bean的id”)

1
2
3
@Autowired
@Qualifier("myschool")
School school;

@Autowired拥有一个required的属性,默认为true,表示如果是没有这个属性值,则控制台报告错误,如果我们更改成为false,则表示如果没有这个值,则不会给该值赋值

@Resource

1
2
3
4
5
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>

这个注解来源于jdk,并不是来源于spring,默认byname,首先会使用byname,如果不符合,自动使用bytype方式

1
2
@Resource
School school;

如果我们一定要使用byname类型

1
2
@Resource(name = "myschool")
School school;

总结

xml文件和注解的方式,xml文件可以与源代码类独立分开,更改时比较简单,而注解的方法比较适合不经常更改的方式。