Spring5入门-08-使用注解开发
一、前言
-
参考视频:遇见狂神说-Spring5
-
参考文档:官方文档
-
参考书籍:Spring快速入门-崔彦威 卢欣欣 王倩
-
使用:
- IDEA 2019.3
- Maven
- Spring 5.2.9.RELEASE
- Junit 4.12
二、准备依赖
spring-webmvc由于继承的关系会有一张依赖网:
算是省心省力吧。
- 提示:使用注解必须用到aop的包
<!--Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!--JUnit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
三、常用注解介绍
@Componet
表明该类会作为组件类,并告知Spring要为该类创建bean。不过组件扫描默认是不开启的,要使其起作用,还需要显式地配置Spring,从而让Spring去找有@Componet
注解的类,并为其生成bean。这要在xml配置文件中配置。
下面是从【Spring快速入门-崔彦威 卢欣欣 王倩】中引用的一段介绍,下面这些类是放在成员变量、构造函数或者方法上面的:
- @Autowired:默认按类型匹配注入bean,可以对类成员变量、方法及构造器函数进行标注。完成自动装配的工作。在使用@Autowired时,首先在容器中查询对应类型的bean。如果查询结果刚好为一个,就将该bean装配给@Atuowired制定的数据;如果查询结果不止一个,那么@Autowired会根据名称来查找。如果查询结果为空,那么抛出异常。可以使用
required=false
解决。【但是会有可能造成空指针异常】- @Required:适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时填充;否则,容器会抛出一个BeanInitializationException异常。
- @Qualifier:@Autowired默认是单例的,但是在面向接口编程中,如果把一个属性设置为接口类型,一个接口就可能有多。种实现,那么到底注入哪一个呢?为了解决这个问题就有了@Qualifier。
- @Value:在xml配置属性时可以通过property的value设置默认值,@Valkue也可以为属性设置默认值。
- @Resource:默认按名称匹配注入bean。要求提供一个bean名称的属性,如果属性为空就自动采用标注处的变量名或方法名作为bean的名称。如果没有在使用@Resource时指定bean的名字,同时Spring容器中有没有该名字的bean,这时@Resource就会退化为@Autowired,即按类型注入
四、示例
4.1 路径
4.2 代码
Role.java
package com.duzhuan.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @Autord: HuangDekai
* @Date: 2020/9/30 14:30
* @Version: 1.0
* @since: jdk11
*/
@Component
public class Role {
@Value("2")
private int id;
@Value("User")
private String role;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
@Override
public String toString() {
return "Role{" +
"id=" + id +
", role='" + role + '\'' +
'}';
}
}
User.java
package com.duzhuan.pojo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @Autord: HuangDekai
* @Date: 2020/9/30 14:40
* @Version: 1.0
* @since: jdk11
*/
@Component
public class User {
@Value("1")
private int id;
@Value("duzhuan")
private String name;
@Autowired
private Role role;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", role=" + role +
'}';
}
}
bean.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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<context:component-scan base-package="com.duzhuan"/>
</beans>
4.3 测试样例
UserTest.java
package com.duzhuan.pojo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Autord: HuangDekai
* @Date: 2020/9/30 14:50
* @Version: 1.0
* @since: jdk11
*/
public class UserTest {
@Test
public void userTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = context.getBean("user", User.class);
System.out.println(user);
}
}
结果: