Spring之路(12)--在注解配置中装配bean

简介: 本文目录1. 背景2. 按名称自动装配2.1 定义歌手类,并通过@component注解为其生成对应bean。2.2 定义舞台类,并指定名称装配其属性2.3 配置xml文件,开启对bean的扫描2.4 测试3. 按类型自动装配3.1 定义歌手类和舞者类3.2 通过类型自动装配舞台bean3.3 测试运行4. 总结

1. 背景

上一篇讲了xml配置中如何装配bean,其实注解配置中装配bean的原理与xml一模一样,而且达到的效果也是相同的,不过是采用了不同的方式而已。


所以本篇我们也并不更换实例,还是以在舞台中注入歌手、舞者为例,进行装配。由于注解情况下,都是直接在类、属性上添加注解,没有必要显示指定bean的包路径+类名,所以都是自动装配。


2. 按名称自动装配

我们对bean进行命名,同时在装配时指定装配的bean名称。


2.1 定义歌手类,并通过@component注解为其生成对应bean。

package org.maoge.annotationassemble;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Component;

@Component("liujia") // 通过注解指定Dancer类生成的bean名称为liujia

public class Dancer {

@Value("刘迦") // 通过注解注入姓名

private String name;

public String getName() {

 return name;

}

public void setName(String name) {

 this.name = name;

}

}


package org.maoge.annotationassemble;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Component;

@Component("daolang") // 通过注解指定Singer类生成的bean名称为daolang

public class Singer {

@Value("刀郎") // 通过注解注入姓名

private String name;


public String getName() {

 return name;

}

public void setName(String name) {

 this.name = name;

}

}


此处再次解释下@Component("xxx")注解的作用,Spring容器在启动时,会扫描该注解标注的类,并生成一个命名为xxx的bean对象放入容器中。如果使用注解@Component标注,则生成bean的命名为类的首字母转小写。


2.2 定义舞台类,并指定名称装配其属性

可以通过@Autowired使bean通过指定规则注入进来,同时使用@Qualifier("xxx")装配命名为xxx的bean,代码如下:


package org.maoge.annotationassemble;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

//舞台类,注意舞台也要生成一个bean

@Component("stage")

public class Stage {

@Autowired//表示自动注入

@Qualifier("daolang")//指定要装配名称为daolang的bean

private Singer singer;

@Autowired

@Qualifier("liujia")//指定要装配名称为liujia的bean

private Dancer dancer;

public Singer getSinger() {

 return singer;

}

public void setSinger(Singer singer) {

 this.singer = singer;

}

public Dancer getDancer() {

 return dancer;

}

public void setDancer(Dancer dancer) {

 this.dancer = dancer;

}

}


2.3 配置xml文件,开启对bean的扫描

不要忘记使用注解配置bean时,还是需要一个xml文件,其中要开启对bean所在包的扫描,所以spring.xml文件如下:


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xmlns:context="http://www.springframework.org/schema/context"

  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-4.0.xsd">

  <context:component-scan

   base-package="org.maoge.annotaionassemble" />

</beans>


2.4 测试

启动主类,从容器中获取舞台,会发现舞台中的歌手和舞者均已装配成功。


package org.maoge.annotationassemble;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

public static void main(String[] args) {

 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(

   "/org/maoge/annotationassemble/spring.xml");

 Stage stage = (Stage) context.getBean("stage");

 System.out.println(stage.getSinger().getName());

 System.out.println(stage.getDancer().getName());

}

}


输出结果:


刀郎

刘迦


3. 按类型自动装配

这个就更加简单了啊,因为使用注解时,一般一个类就生成一个bean(一个注解加到一个类上,生成一个对应bean)。


所以按类型匹配基本上很稳啊,没啥问题,也非常流程。目前这种方式应该是非常非常流行的,不论是SSM项目还是SpringBoot项目,这种方式都使用的非常多。


看例子:


3.1 定义歌手类和舞者类

package org.maoge.annotationassemble;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Component;

@Component // 未指定命名,所以默认命名应为singer

public class Singer {

@Value("刀郎") // 通过注解注入姓名

private String name;

public String getName() {

 return name;

}

public void setName(String name) {

 this.name = name;

}

}


package org.maoge.annotationassemble;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Component;

@Component // 未指定命名,所以默认命名应为dancer

public class Dancer {

@Value("刘迦") // 通过注解注入姓名

private String name;

public String getName() {

 return name;

}

public void setName(String name) {

 this.name = name;

}

}


3.2 通过类型自动装配舞台bean

不用加@Qualifier,默认就是自动按类型装配,因为太常用了。


package org.maoge.annotationassemble;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

@Component

public class Stage {

@Autowired // 按类型自动装配

private Singer singer;

@Autowired // 按类型自动装配

private Dancer dancer;

public Singer getSinger() {

 return singer;

}

public void setSinger(Singer singer) {

 this.singer = singer;

}

public Dancer getDancer() {

 return dancer;

}

public void setDancer(Dancer dancer) {

 this.dancer = dancer;

}

}


3.3 测试运行

还是同样的xml和Main.java,直接运行Main进行测试,依然没问题。


4. 总结

在使用注解时,实现了装配的高度自动化,非常锋利。


装配这个事,并不复杂,就是往一个bean的属性中注入其他bean。


自动装配,就是指定要装配的bean的类型或者名称,然后指定自动装配的规则(名称/类型),然后由容器自动将相应bean注入被装配bean的属性。

相关文章
|
7天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
25 0
|
26天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
4天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
20 0
|
28天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
35 0
|
21天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
10天前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
14天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
40 4
SpringBoot必须掌握的常用注解!
|
14天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
27 1
|
16天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
56 2
|
16天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
32 1