Spring注解开发

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Spring注解开发是指使用注解来配置和管理Spring框架中的各种组件和功能。通过使用注解,我们可以在代码中直接声明和配置Spring的bean、依赖注入、AOP切面等,并且减少了传统XML配置文件的使用。

1、半注解开发

​ Spring注解开发是指使用注解来配置和管理Spring框架中的各种组件和功能。通过使用注解,我们可以在代码中直接声明和配置Spring的bean、依赖注入、AOP切面等,并且减少了传统XML配置文件的使用。

采用注解的方式开发步骤:

1.在类上使用注解

2、在applicationContext.xml中基包扫描,扫描指定包和它的子包的类

代码演示

1、在所有需要放到容器中的类,在类上使用@Component注解

@Component
public class BookDaoImpl implements BookDao {
   
    @Override
    public void save() {
   
        System.out.println("book dao save");
    }
}

2、核心配置文件中通过基包扫描加载bean(会扫描这个包和它所有的子包)

<context:component-scan base-package="org.demo"/>

Spring提供@Component注解的三个衍生注解:

  • @Controller:用于标识表现层bean定义
  • @Service:用于标识业务层bean定义
  • @Repository:用于标识数据层bean定义

2、全注解开发

上面的例子虽然是采用注解开发,但还是在application.xml配置了扫描包

Spring3.0开启了纯注解开发模式,使用Java类替代配置文件,开启了Spring快速开发赛道

使用说明

  • @Configuration注解用于设定当前类为配置类
  • @ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式
@ComponentScan({
   com.demo.service","com.demo.dao"})
  • 取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象
//加载配置类初始化容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

代码演示

1、定义配置类代替配置文件

@Configuration
@ComponentScan("org.demo")
public class SpringConfig {
   

}

2、在测试类中加载配置类,获取Bean对象并使用

public class Main {
   
    public static void main(String[] args) {
   
        //1、创建IOC容器
        AnnotationConfigApplicationContext aac = new AnnotationConfigApplicationContext(SpringConfig.class);

        //2、获取bean对象
        BookService bean = aac.getBean(BookService.class); 

        //3、调用方法
        bean.save();

        //4、关闭容器
        aac.close();
    }
}

3、bean的作用范围注解

bean作用范围注解配置

  • 使用@Scope定义bean作用范围
@Component
@Scope("singleton")
public class BookUtils {
   
}

bean生命周期注解配置

  • 使用@PostConstruct、@PreDestroy定义bean生命周期
@Component
@Scope("singleton")
public class BookUtils {
   
    public BookUtils() {
   
        System.out.println("book constructor ...");
    }
    @PostConstruct
    public void init(){
   
        System.out.println("book init ...");
    }
    @PreDestroy
    public void destroy(){
   
        System.out.println("book destory ...");
    }
}

注意:@PostConstruct和@PreDestroy注解是jdk中提供的注解,从jdk9开始,jdk中的javax.annotation包被移除了,也就是说这两个注解就用不了了,可以额外导入一下依赖解决这个问题。

<dependency>
  <groupId>javax.annotation</groupId>
  <artifactId>javax.annotation-api</artifactId>
  <version>1.3.2</version>
</dependency>
  • 测试类
@Test
public void testPureAnnotation() {
   
    //AnnotationConfigApplicationContext加载Spring配置类初始化Spring容器
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
    BookUtils bookUtils = (BookUtils) ctx.getBean("bookUtils");
    System.out.println(bookUtils);
    //关闭容器
    ctx.close();
}

4、依赖注入

使用@Autowired注解开启自动装配模式(默认按类型,如果有多个类型相同的按名称)

@Service
public class BookServiceImpl implements BookService {
   

    @Autowired
    private BookDao bookDao;

    @Override
    public void save() {
   
        System.out.println("bookService 保存数据");
        bookDao.save();
    }
}

注意:

  • 自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法
  • 自动装配建议使用无参构造方法创建对象(默认)

使用@Qualifier注解开启指定名称装配bean

@Service
public class BookServiceImpl implements BookService {
   

    @Autowired
    @Qualifier("bookDao")
    private BookDao bookDao;

    @Override
    public void save() {
   
        System.out.println("bookService 保存数据");
        bookDao.save();
    }
}

​ 不管是使用配置文件还是配置类,都必须进行对应的Spring注解包扫描才可以使用。@Autowired默认按照类型自动装配,如果IoC容器中同类的Bean有多个,那么默认按照变量名和Bean的名称匹配,建议使用@Qualifier注解指定要装配的bean名称

简单类型注入

使用@Value实现简单类型注入

@Repository("bookDao")
public class BookDaoImpl implements BookDao {
   
    //@Value:注入简单类型(无需提供set方法)
    @Value("${name}")
    private String name;

    public void save() {
   
        System.out.println("book dao save ..." + name);
    }
}

使用@PropertySource注解加载properties文件,在配置类上面

@Configuration
@ComponentScan("org.demo")
@PropertySource("classpath:DataSource.properties")
public class SpringConfig {
   

}

注意:路径仅支持单一文件配置,多文件请使用数组格式配置,不允许使用通配符*

@Component
public class BookUtils {
   
    @Value("${name}")
    private String num;

    @Override
    public String toString() {
   
        return "BookUtils{" +
                "num=" + num +
                '}';
    }
}

5、注解导入第三方bean

方式一:使用@Bean配置第三方bean

@Bean
public DataSource dataSource(){
   
    DruidDataSource druidDataSource = new DruidDataSource();
    druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    druidDataSource.setUrl("jdbc:mysql://localhost:3306/spring_db?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true");
    druidDataSource.setUsername("root");
    druidDataSource.setPassword("123456");
    return druidDataSource;
}

方式二:将独立的配置类加入核心配置

@Configuration
public class JdbcConfig {
   
    @Bean
    public DataSource dataSource(){
   
        DruidDataSource ds = new DruidDataSource();
        //相关配置
        return ds;
    }
}

​ 使用@Import注解手动加入配置类到核心配置,此注解只能添加一次,多个数据请用数组格式

@Configuration
@Import(JdbcConfig.class)
public class SpringConfig {
   
}

6、第三方Bean注入资源

简单类型依赖注入

public class JdbcConfig {
   

    @Value("com.mysql.jdbc.Driver")
    private String driver;
    @Value("jdbc:mysql://localhost:3306/spring_db")
    private String url;
    @Value("root")
    private String userName;
    @Value("123456")
    private String password;

    //1.定义一个方法获得要管理的对象
    //2.@Bean:表示当前方法的返回值是一个bean对象,添加到IOC容器中
    @Bean
    public DataSource dataSource(){
   
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(userName);
        ds.setPassword(password);
        return ds;
    }
}

说明:如果@Value()中使用了EL表达式读取properties属性文件中的内容,那么就需要加载properties属性文件。

引用类型依赖注入

//Spring会自动从IOC容器中找到BookDao对象赋值给参数bookDao变量,如果没有就会报错。
@Bean 
public DataSource dataSource(BookDao bookDao){
   
    System.out.println(bookDao);
    DruidDataSource ds = new DruidDataSource();
    ds.setDriverClassName(driver);
    ds.setUrl(url);
    ds.setUsername(userName);
    ds.setPassword(password);
    return ds;
}

说明:引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
17天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
23天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
36 4
|
5天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
23 4
SpringBoot必须掌握的常用注解!
|
29天前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
59 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
7天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
41 2
|
7天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
25 1
|
16天前
|
XML Java 数据格式
提升效率!Spring Boot 开发中的常见失误轻松规避
本文深入探讨了在 Spring Boot 开发中常见的失误,包括不当使用注解、不良异常处理、低效日志记录等,提供了有效的规避策略,帮助开发者提升代码质量和系统性能,构建更健壮、高效的应用程序。
|
22天前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
2天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
6 0
|
26天前
|
XML Java 数据库
Spring boot的最全注解
Spring boot的最全注解