Spring5入门-08-使用注解开发

一、前言

  • 参考视频:遇见狂神说-Spring5

  • 参考文档:官方文档

  • 参考书籍:Spring快速入门-崔彦威 卢欣欣 王倩

  • 使用:

    • IDEA 2019.3
    • Maven
    • Spring 5.2.9.RELEASE
    • Junit 4.12


二、准备依赖

spring-webmvc由于继承的关系会有一张依赖网:

image-20200922215433508

算是省心省力吧。

  • 提示:使用注解必须用到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 路径

image-20200930194416201


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);
    }
}

结果:

image-20200930200614047

posted @ 2020-09-30 21:10  杜撰丶  阅读(133)  评论(0编辑  收藏  举报