程序员社区

13. Spring 基于注解的开发

Spring 注解

  基于 XML 配置文件的方式在之前的系列文章中已经介绍得非常详尽了,而在实际的开发工作中,注解往往比 XML 配置使用得更为频繁,理由也很简单,使用注解能极大减少开发过程中的配置工作,每次创建 XML 文件,写标签对于大规模的项目来说,是比较繁琐的。

Spring IoC 常用注解

什么是注解?注解是 Java 提供的一种特殊的类,专门用来标注某些任务的,现在我们把原本通过 XML 配置对象的方式,现在改为通过注解配置的方式。

第一步:创建实体类,并且在实体类前面添加 @Component注解;

package com.trainingl.entity;

import lombok.Data;
import org.springframework.stereotype.Component;

import java.util.List;

@Data
@Component
public class Student {
    private Integer id;
    private String name;
    private Double score;
}

第二步:在测试类中直接获取 student 对象

package com.trainingl.test;

import com.trainingl.entity.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
        //1.加载spring容器(扫描com.trainingl.entity包下的所有类信息)
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext("com.trainingl.entity");
        //2.获取对象
        Student stu = (Student)applicationContext.getBean("student");
        System.out.println(stu);
    }
}

在这里插入图片描述

可以发现,与XML 的配置方式不同的是不再需要将对象的信息在 XML 文件中进行配置了,只需要在创建实体类时,在实体类前添加注解 @Component

  1. 给目标类添加注解,相当于一个标记;
  2. 启动 IoC,指定一个包(全类名),Spring 会自动扫描这个包下的所有类,判断哪些类添加了注解,如果发现某个类添加了该注解,则创建该类的对象,并且对象标识是类名的首字母小写字符串。

所以获取对象时,applicationContext 调用 getBean() 指定的字符串 student ,就是 Student 类名的首字母小写之后的值,标识对象的 id。如果是写成其他字符串,比如:student1,则会有如下报错信息:

在这里插入图片描述

与注解 @Component 类似的方式还有一个注解是 @Bean,但是 @Bean 不能直接添加到实体类中,因为 @Bean 只能添加到方法上,源码提示如下:

在这里插入图片描述

下面介绍 @Bean 注解的用法:

第一步:创建实体类,包括无参构造和有参构造;

package com.trainingl.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private Integer id;
    private String name;
    private Double score;
}

第二步:创建配置类,配置类提供获取对象的方法,给这个方法添加 @Bean 注解;

package com.trainingl.Annotation;

import com.trainingl.entity.Student;
import org.springframework.context.annotation.Bean;

public class StudentConfiguration {
    
    @Bean
    //提供返回对象的方法
    public Student student(){
        //还可以全参初始化操作
        return new Student(1,"张三",85.0);
    }
}

第三步:在测试类中直接获取 student 对象;

package com.trainingl.test;

import com.trainingl.Annotation.StudentConfiguration;
import com.trainingl.entity.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        //1.加载spring容器
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(StudentConfiguration.class);
        //2.获取对象
        Student stu = (Student)applicationContext.getBean("student");
        System.out.println(stu);
    }
}

在这里插入图片描述

@Component@Bean 注解的区别:

  1. @Component 直接添加到实体类前,只需要一个实体类就可以完成 IoC 的注入;
  2. @Bean 不能添加到实体类中,因为 @Bean 只能添加到方法上,所以 @Bean 不仅要结合实体类,还需要同时结合一个配置类,配置类提供方法返回对象,给该方法添加 @Bean
赞(0) 打赏
未经允许不得转载:IDEA激活码 » 13. Spring 基于注解的开发

一个分享Java & Python知识的社区