Spring | 注解开发

简介: Spring | 注解开发

一、前言


这篇文章主要介绍spring中有关注解开发的知识

二、内容


1.注解开发定义bean


步骤

1.使用@component注解定义bean的名字

d1a11d2c8288494a8c5b004d4887e994.png

2.在核心配置文件使用context:component-scan标签扫描组件

29f98002716a48c7a167851886510689.png

3.验证bean是否创

144c182f4c38450a8f244d9dd1302f76.png

05b577486e544eff8febb379f44b0b46.png


可以看到运行结果中出现了BookDaoImpl类中的重写方法的内容,说明使用@Component注解定义bean成功。


等价写法


spring提供@Component注解的三个衍生等价注解


@Repository @Service @Controller分别对应dao层,service层和controller层。


3f3fdd843ca64cc487ed069f195f51e9.png


注意事项:

当注解中没有写bean的名字时,只能通过类型获取bean,此时要保证该类型的bean唯一

383ac444a09149efa4a588d466683fc4.png


2.纯注解开发


步骤


1.编写配置类

@Configuration
@ComponentScan("demo3.service")
public class SpringConfig {
}


使用@Configuration注解代替配置文件中的默认内容,使用@ComponentScan注解代替context:component-scan标签。


2.加载配置类并获取bean


public class App_2 {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); // 加载配置类,使用的是AnnotationConfigApplicationContext类
        BookService service = context.getBean(BookService.class); // 获取bean
        service.bookSerSay();
    }
}


运行结果

32081f726ddc4484aa3a57b7257d7f49.png


3.如果要扫描多个包,@ComponentScan的值采用字符串数组的形式

47ba3adb89044e3f9b7bdc767789866c.png


3.注解定义bean的作用范围和生命周期函数


作用范围


使用@Scope注解声明bean的作用范围

4b0e7c91befc4673b1c0b766dc33d6a3.png


生命周期函数


包括自定义初始化函数和销毁函数

定义初始化函数,使用@PostConstructor注解;定义销毁函数 使用@PreDestroy注解。


    @PostConstruct
    public void init() {
        System.out.println("init");
    }
    @PreDestroy
    public void destroy() {
        System.out.println("destroy");
    }

注意:


在Java9之后这两个注解已经被淘汰了,要使用这两个注解,首先在pom.xml中加入一下依赖:


<!--        java注解相关依赖-->
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>

下面来看主类和运行结果

f62d5020d917432aadd422521dc8c42b.png

41fea93af7354cec91d24c87d34a3475.png


4.依赖注入


自动装配和读取properties文件


自动装配 读取properties文件
引用类型 简单类型
@Autowired注解(按类型) @Value注解
当有多个相同类型的bean时,报错,此时再使用@Qualifier注解指定其中一个 读取properties文件时使用${},注意此时仍然可能读取到系统属性


5e9a2b6c5f2746cd88e5a8549e3c534f.png

d17642ad990442e0b220c123468d618a.pngd21ce389c46449d38f6bc404122b7713.png

读取properties文件内容,首先要在配置类中,使用@PropertySource注解告知spring有哪些文件

db5abae10963409ea2d89f944433e6bb.png


5.第三方bean管理(以DruidDataSource为例)


步骤

1.在pom.xml中导入Druid坐标

<!--        druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.0</version>
        </dependency>


2.在配置类中写要获取的对象类型的方法(在方法上加@Bean注解)


@Configuration
@ComponentScan({"demo3.service","demo3.controller","demo3.dao"})
public class SpringConfig {
    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("mysql:jdbc://localhost:3306/daily?useSSL=false");
        dataSource.setUsername("root");
        dataSource.setPassword("@123456");
        return dataSource;
    }
}


3.获取bean


public class App_5 {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        DataSource dataSource = context.getBean(DruidDataSource.class); //通过方法的返回值类型获取这个bean
        System.out.println(dataSource);
    }
}


4.查看运行结果

c5f50355d7564bfbb1be71bfd3fc083f.png


可以看到第三方bean对象已成功创建


注意事项


1.一般情况下不会把JDBC配置信息放在spring配置类中,而是新建一个JdbcConfig类


5ff26eb2e8814d0884ca7a9b97c4d46c.png


2.在SpringConfig中使用@Import注解导入这个类

5188e7f04fb749ca9fdddcae7270ef33.png

运行结果和上面的运行结果是一致的,如果不是使用@Import注解,需要在JdbcConfig类上加@Configuration注解,在SpringConfig类上的@ComponentScan注解上加上这个config包。


3.@Import注解只能使用一次,如果要导入多个配置类,要使用数组的格式

7290bc9b14b54b1e9cb7698fd16c3068.png

6.第三方bean依赖注入


简单类型 引用类型
@Value注解+成员变量 方法形参

9421acebc65145739fa3862379fc0ef0.png


45a6b949c5214c748d7cbeb4920bb70a.png


如果没有形参这个类型的bean,就会报错。


7.xml配置与注解配置对比

af13e082d6bb4110ab7b5e631045b11e.png

三、结语


这篇文章主要讲了:


spring中如何使用@Component注解开发,以及@Component注解的三个衍生注解;

不使用配置文件,而使用配置类的注解开发;

bean的作用范围@Scope和声明周期函数@PostConstructor和@PreDestroy;

依赖注入中使用到@Autowired和@Value注解分别注入引用类型和简单类型;

如何使用第三方bean和注入依赖,并对比了xml和注解方式的异同。


相关文章
|
12天前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
272 127
|
27天前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
271 0
|
1月前
|
Java 测试技术 API
将 Spring 的 @Embedded 和 @Embeddable 注解与 JPA 结合使用的指南
Spring的@Embedded和@Embeddable注解简化了JPA中复杂对象的管理,允许将对象直接嵌入实体,减少冗余表与连接操作,提升数据库设计效率。本文详解其用法、优势及适用场景。
214 126
|
2月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
13天前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
111 12
|
26天前
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
106 1
使用Spring的@Retryable注解进行自动重试
|
26天前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
探索Spring Boot的@Conditional注解的上下文配置
|
26天前
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
Spring中最大化@Lazy注解,实现资源高效利用