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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 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;
    }


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
21天前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
119 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
9天前
|
XML Java 数据格式
spring复习02,xml配置管理bean
详细讲解了Spring框架中基于XML配置文件管理bean的各种方式,包括获取bean、依赖注入、特殊值处理、属性赋值、集合类型处理、p命名空间、bean作用域及生命周期和自动装配。
spring复习02,xml配置管理bean
|
12天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
559 7
|
9天前
|
XML Java 数据格式
spring复习03,注解配置管理bean
Spring框架中使用注解配置管理bean的方法,包括常用注解的标识组件、扫描组件、基于注解的自动装配以及使用注解后的注意事项,并提供了一个基于注解自动装配的完整示例。
spring复习03,注解配置管理bean
|
XML Java API
Spring 依赖注入的方式,你了解哪些?
前言 依赖查找和依赖注入是 Spring 实现 IoC 容器提供的两大特性,相对于依赖查找,Spring 更推崇的是使用依赖注入,本篇先对 Spring 中依赖注入的几种方式进行介绍,后续再分享其实现。
224 0
Spring 依赖注入的方式,你了解哪些?
|
Java 测试技术 开发者
Spring 有哪几种依赖注入方式?官方是怎么建议使用的呢?
IDEA 提示 Field injection is not recommended 在使用IDEA 进行Spring 开发的时候,当你在字段上面使用@Autowired注解的时候,你会发现IDEA 会有警告提示:
288 0
Spring 有哪几种依赖注入方式?官方是怎么建议使用的呢?
|
9天前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
Java Spring 容器
Spring中IoC两种接口和两种依赖注入方式的比较
spring是一个开源框架,是为了解决企业应用程序开发的复杂性而创建的,为J2EE应用程序开发提供集成的框架。简单来说,spring是一个轻量级的控制反转IOC和面向切面AOP的容器框架。spring框架会对定义在配置文件中的bean实例自动管理,这个bean也就是Java实例,Java组件,spring既可以管理标准的javabean,又可以管理普通的Java组件。   spring
1874 0
下一篇
无影云桌面