知识点
- 使用注解配置 Spring
- 使用注解之前配置文件必须配置组件扫描
- 注解
- Spring 实例化
- @Component 使用在类上用于实例化 Bean
- @Controller 使用在 web 层类上用于实例化 Bean
- @Service 使用在 service 层类上用于实例化 Bean
- @Repository 使用在 dao 层类上用于实例化 Bean
- @Scope bean 的作用范围
- @Value 基本数据类型赋值
- 引用数据类型注入
- @Autowired 引用数据类型属性类型自动注入 @Qualifier 属性名自动注入
- @Qualifier("") 配合 @Autowired 通过属性名赋值
- @Resource("") (新注解) 引用数据类型自动注入(属性类型、属性名)
- @PostConstruct 使用在方法上标注该方法是 Bean 的初始化方法
- @PreDestroy 使用在方法上标注该方法是 Bean 的销毁方法
- 复杂属性赋值必须通过配置文件或配置类
@Autowired 和@Resource 注解的区别
- 如果用@Autowired 属性注入的方式,只是按照 type 方式进行匹配注入,不会去匹配 name,如果涉及到 type 无法辨别注入对象时,就需要配合@Qualifier 或@Primary 注解一起用。而@Resource 注解默认是通过 byName 来匹配对象的,也可以指定 type 通过 byType 来匹配对象。 这是@Resource 注解比@Autowired 注解的一个优点吧。
代码示例
pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>priv.noby</groupId>
<artifactId>spring2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
</project>
Resource
<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="priv.noby.spring2.entity"/>
<context:property-placeholder location="classpath:db.properties"/>
</beans>
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/stage3?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123
entity
package priv.noby.spring2.entity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Scope("singleton")
public class Student {
@Value("${jdbc.driverClassName}")
private String name;
@Value("20")
private int age;
@Autowired
@Qualifier("school")
private School school;
@PostConstruct
public void init() {
System.out.println("Student.init");
}
@PreDestroy
public void destroy() {
System.out.println("Student.destroy");
}
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void setAge(int age) {
this.age = age;
System.out.println("调用了 setAge() 方法");
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", school=" + school +
'}';
}
}
package priv.noby.spring2.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class School {
@Value("100")
private int scId;
@Value("北京大学")
private String scName;
}
test
package priv.noby.spring2.entity;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class StudentTest {
@Test
public void student() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = (Student) applicationContext.getBean("student");
Student student2 = (Student) applicationContext.getBean("student");
System.out.println("这是单例模式吗?" + (student == student2));
System.out.println("student = " + student);
((ClassPathXmlApplicationContext) applicationContext).registerShutdownHook();
}
}