Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入

一、注解开发定义Bean

  • 使用@Component定义bean:
@Component("bookDao")
public class BookDaoImpl1 implements BookDao {
    @Override
    public void save() {
        System.out.println("BookDao save...");
    }
}
  • 核心配置文件中通过组件扫描加载bean:
<context:component-scan base-package="com.practice"/>
  • 代码效果:
public class App1 {
    public static void main(String[] args) {
        ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext1.xml");
        BookDao bookDao = (BookDao) act.getBean("bookDao");
        System.out.println(bookDao);
        //按类型找
        BookService bookService = act.getBean(BookService.class);
        System.out.println(bookService);
    }
}


  • Spring提供@Component注解的三个衍生注解:
  • @Controller:用于表现层bean定义
  • @Service:用于业务层bean定义
  • @Repository:用于数据层bean定义

二、纯注解开发Bean

  • java类代替了Spring核心配置文件
  • Spring核心配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        ">
    <context:component-scan base-package="com.practice"/>
</beans>
  • java类:
@Configuration
@ComponentScan("com.practice")
public class SpringConfig {
}
  • @Configuration表示配置文件,当前类为配置类
  • @ComponentScan表示扫描包下的配置信息,设定扫描路径,此注解只能添加一次,多个数据请用数组格式。
@ComponentScan({"com.practice.dao","com.practice.service"})
  • 读取Spring核心配置文件初始化容器切换为读取Java配置类初始化容器对象
//读取Spring核心配置文件
ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext1.xml");
//读取Java配置类
ApplicationContext act = new AnnotationConfigApplicationContext(SpringConfig.class);

三、bean的管理

3.1bean的作用范围

  • 单例对象:
@Repository("bookDao1")
@Scope("singleton")
public class BookDaoImpl2 implements BookDao {
    @Override
    public void save() {
        System.out.println("BookDao save...");
    }
}
@Configuration
@ComponentScan("com.practice")
public class SpringConfig {
}
public class AppForAnnotation1 {
    public static void main(String[] args) {
        ApplicationContext act = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao1 = (BookDao) act.getBean("bookDao1");
        BookDao bookDao2 = (BookDao) act.getBean("bookDao1");
        System.out.println(bookDao1);
        System.out.println(bookDao2);
    }
}


  • 非单例:
@Repository("bookDao1")
@Scope("singleton")
public class BookDaoImpl2 implements BookDao {
    @Override
    public void save() {
        System.out.println("BookDao save...");
    }
}
@Configuration
@ComponentScan("com.practice")
public class SpringConfig {
}
public class AppForAnnotation1 {
    public static void main(String[] args) {
        ApplicationContext act = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao1 = (BookDao) act.getBean("bookDao1");
        BookDao bookDao2 = (BookDao) act.getBean("bookDao1");
        System.out.println(bookDao1);
        System.out.println(bookDao2);
    }
}


  • 使用@Scope("singleton")定义bean的作用范围

3.2bean的生命周期

  • 使用@PostConstruct@PreDestroy定义bean的生命周期
@Repository("bookDao1")
@Scope("singleton")
public class BookDaoImpl2 implements BookDao {
    @Override
    public void save() {
        System.out.println("BookDao save...");
    }
    @PostConstruct
    public void init() {
        System.out.println("BookDao init...");
    }
    @PreDestroy
    public void destroy() {
        System.out.println("BookDao destroy...");
    }
}


四、注解开发依赖注入

  • 使用@Autowired注解开启自动装配模式(按类型)
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;
    @Override
    public void save() {
        System.out.println("bookService save...");
        bookDao.save();
    }
}
  • 自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法
  • 自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法
  • 使用@Qualifier注解开启指定名称装配bean
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    @Qualifier("bookDao2")
    private BookDao bookDao;
    @Override
    public void save() {
        System.out.println("bookService save...");
        bookDao.save();
    }
}
  • 注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用
  • 使用@Value()实现简单注入
@Repository("bookDao")
public class BookDaoImpl1 implements BookDao {
    @Value("practice")
    private String name;
    @Override
    public void save() {
        System.out.println("BookDao save..." + name);
    }
}


  • 使用@PropertySource注解加载properties文件
@Configuration
@ComponentScan("com.practice")
@PropertySource({"jdbc3.properties"})
public class SpringConfig {
}
  • 注意:路径仅支持单一文件配置,多文件请使用数组格式配置,不能使用通配符*

五、bean管理

5.1第三方bean管理

  • 使用@Bean配置第三方bean
public class JdbcConfig {
    //1.定义方法获得要管理的对象
    //2.添加注解
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/mybatis");
        ds.setUsername("root");
        ds.setPassword("123456");
        return ds;
    }
}
  • 将独立的配置类加入核心配置
  • 方式一:导入式
public class JdbcConfig {
    //1.定义方法获得要管理的对象
    //2.添加注解
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/mybatis");
        ds.setUsername("root");
        ds.setPassword("123456");
        return ds;
    }
}
  • 使用注解手动加入配置类到核心配置,此注解只能添加一次,多个数据采用数组形式
@Import({JdbcConfig.class})
public class SpringConfig {
}
  • 将独立的配置加入核心配置
  • 方式二:扫描式
@Configuration
public class JdbcConfig {
    //1.定义方法获得要管理的对象
    //2.添加注解
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/mybatis");
        ds.setUsername("root");
        ds.setPassword("123456");
        return ds;
    }
}
  • 使用注解扫描配置类所在的包,加载对应的配置类信息
@Configuration
@ComponentScan("com.practice")
public class SpringConfig {
}

5.2第三方bean依赖注入

5.2.1简单依赖注入

public class JdbcConfig {
    @Value("com.mysql.jdbc.Driver")
    private String driver;
    @Value("jdbc:mysql://localhost:3306/mybatis")
    private String url;
    @Value("root")
    private String userName;
    @Value("123456")
    private String passWord;
    //1.定义方法获得要管理的对象
    //2.添加注解
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(userName);
        ds.setPassword(passWord);
        return ds;
    }
}

5.2.2引用依赖注入

  • 引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象
@Bean
    public DataSource dataSource(BookService bookService){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(userName);
        ds.setPassword(passWord);
        return ds;
    }


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
人工智能 Java 数据库
飞算 JavaAI:革新电商订单系统 Spring Boot 微服务开发
在电商订单系统开发中,传统方式耗时约30天,需应对复杂代码、调试与测试。飞算JavaAI作为一款AI代码生成工具,专注于简化Spring Boot微服务开发。它能根据业务需求自动生成RESTful API、数据库交互及事务管理代码,将开发时间缩短至1小时,效率提升80%。通过减少样板代码编写,提供规范且准确的代码,飞算JavaAI显著降低了开发成本,为软件开发带来革新动力。
|
2月前
|
前端开发 Java UED
从基础到进阶:Spring Boot + Thymeleaf 整合开发中的常见坑与界面优化
本文深入探讨了 **Spring Boot + Thymeleaf** 开发中常见的参数绑定问题与界面优化技巧。从基础的 Spring MVC 请求参数绑定机制出发,分析了 `MissingServletRequestParameterException` 的成因及解决方法,例如确保前后端参数名、类型一致,正确设置请求方式(GET/POST)。同时,通过实际案例展示了如何优化支付页面的视觉效果,借助简单的 CSS 样式提升用户体验。最后,提供了官方文档等学习资源,帮助开发者更高效地掌握相关技能。无论是初学者还是进阶用户,都能从中受益,轻松应对项目开发中的挑战。
100 0
|
2月前
|
人工智能 Java 定位技术
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
本文详细讲解了Java开发者如何基于Spring AI Alibaba框架玩转MCP(Model Context Protocol),涵盖基础概念、快速体验、服务发布与调用等内容。重点包括将Spring应用发布为MCP Server(支持stdio与SSE模式)、开发MCP Client调用服务,以及在Spring AI Alibaba的OpenManus中使用MCP增强工具能力。通过实际示例,如天气查询与百度地图路线规划,展示了MCP在AI应用中的强大作用。最后总结了MCP对AI开发的意义及其在Spring AI中的实现价值。
964 9
|
3月前
|
Java Spring
Spring Boot的核心注解是哪个?他由哪几个注解组成的?
Spring Boot的核心注解是@SpringBootApplication , 他由几个注解组成 : ● @SpringBootConfiguration: 组合了- @Configuration注解,实现配置文件的功能; ● @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项 ● @ComponentScan:Spring组件扫描
|
2月前
|
人工智能 缓存 自然语言处理
保姆级Spring AI 注解式开发教程,你肯定想不到还能这么玩!
这是一份详尽的 Spring AI 注解式开发教程,涵盖从环境配置到高级功能的全流程。Spring AI 是 Spring 框架中的一个模块,支持 NLP、CV 等 AI 任务。通过注解(如自定义 `@AiPrompt`)与 AOP 切面技术,简化了 AI 服务集成,实现业务逻辑与 AI 基础设施解耦。教程包含创建项目、配置文件、流式响应处理、缓存优化及多任务并行执行等内容,助你快速构建高效、可维护的 AI 应用。
|
3月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
80 0
|
3月前
|
前端开发 Java 数据库
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
111 0
|
3月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
113 0
|
3月前
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
56 0