极简SpringBoot指南-Chapter01-如何用Spring框架声明Bean
仓库地址
Chapter01-如何用Spring框架声明Bean
前言
在上一章中,我们已经掌握了Spring最基本的使用方式:
- 通过使用
@Component
注解标记我们的类作为一个Bean组件。 - 使用Spring上下文对象从IOC容器中拿到Bean组件。
在这一章中,我们将进一步学习使用Spring框架声明Bean的三种方式:
@Component
注解- XML配置声明
- Java类配置声明(
@Configuration
)
PS:Spring声明Bean的方式不止这三种,请自行搜索了解:Spring声明Bean的方式。
一 使用@Component
注解
@Component
注解我们已经很熟悉了,这里还是需要简单提一下。创建类Apple:
// 使用注解 @Component 标记,并且我们还自定义了Bean的名称
@Component("myApple")
public class Apple {
public Apple() {
System.out.println("Apple 无参构造函数");
}
}
获取并打印:
@SpringBootApplication
public class Chapter01App {
public static void main(String[] args) {
ConfigurableApplicationContext context =
SpringApplication.run(Chapter01App.class, args);
// 注意BeanName我们填写的"myApple",和 @Component("myApple") 对应
Object myApple = context.getBean("myApple");
System.out.println(myApple);
}
}
二 Java类配置声明
Java类配置声明是指,我们使用某个Java作为Spring的配置,通过Java代码本身来定义Bean。这样做的好处我们后文会提到。
首先编写我们的Bean类:
/**
* Banana类,不需要使用任何注解
*/
public class Banana {
public Banana() {
System.out.println("Banana 无参构造函数");
}
}
然后,我们编写一个配置类,其特征是在类上有注解@Configuration
:
@Configuration // 添加注解表明是一个Spring配置类
public class Chapter01Configuration {
@Bean // 使用'@Bean'在方法上,表明我们声明了一个Bean
public Banana myBanana() { // 方法名即为Bean的名称
System.out.println("进入Banana Bean创建函数");
return new Banana();
}
}
最后,我们在启动类上添加注入,表明扫描该配置类:
@SpringBootApplication
// '@Import' 注解用于指定我们需要的配置类
// 默认情况下,会自动扫描当前启动类所在包及其子包的Configuration,
// 所以不需要特别指定,这里主要是演示
@Import(Chapter01Configuration.class)
public class Chapter01App {
public static void main(String[] args) {
ConfigurableApplicationContext context =
SpringApplication.run(Chapter01App.class, args);
Object myBanana = context.getBean("myBanana");
System.out.println(myBanana);
}
}
在这个例子中,各位读者可能会比较绕,这里再整理以下思路。
首先,我们创建了一个普普通通的Java类Banana,对于这个类,我们没有用到任何有关Spring框架的东西。
其次,我们创建了一个配置类Chapter01Configuration,通过类名我们知道,Spring对于配置类的名称没有任何的限制,只要是合法的都行。这个类与Spring框架唯一的联系就是使用了注解@Configuration
,意味着我们标记了这个类为一个Spring的配置类。
那么配置类能干什么呢?就是我们第三步的操作:我们在配置类中编写了一个方法public Banana myBanana();
,并且在其方法上使用了注解@Bean
,通过该注解,表明我们定义了一个Bean,这个Bean的名称就是方法名"myBanana",这个Bean的类型就是Banana。
三 XML配置声明Bean(选读)
还记得上面的我们通过注解的形式来声明我们的Bean吗?实际上,初期的Spring的IOC容器的初始化,是通过配置文件进行的,尽管如今Spring以及SpringBoot项目绝大多数情况都使用的是注解方式以及Java类配置,但是使用XML的配置方式,我也希望大家能够了解。
首先,我们依然创建一个普通的Java类Coconut:
public class Coconut {
/**
* 定义字段:重量,可以通过下面的getter和setter获取和设置该值
*/
private int weight;
public Coconut() {
System.out.println("Coconut 无参构造函数");
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
}
从这个类可以看到,我们没有使用任何的有关Spring相关的注解(尤其是@Component
注解),但是注意,这个类我们稍微添加了些内容,增加了一个字段weight,用于记录Coconut的重量。那么接下来,Spring的IOC容器,如何初始化我们的Coconut实例呢?只需两步:
- 创建一个xml文件,在xml文件中,使用Spring框架约定的格式定义Bean
- 在启动类上,指定Spring框架加载该xml
首先我们看步骤1,创建xml文件。在项目目录/src/main/resources
目录下,创建任意自定义的名称的XML文件,为了便于我们识别,本人创建的是:chapter01_03_use_xml_beans.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
PS:使用IDEA的时候,可以在相关文件夹上右键 — New — XML Configuration File — Spring Config
来快速创建具有初始内容的xml。
可以看到xml初始内容的根节点<beans>
就可以猜测到我们可以在其中添加子节点<bean>
。OK,我们来定义我们的bean:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!-- 定义了一个Bean,名称是myCoconut -->
<bean name="myCoconut" class="com.compilemind.guide.chapter01._03_use_xml.Coconut">
<!-- 对于Coconut的weight属性,我们设置它的初始值100 -->
<property name="weight" value="100"/>
</bean>
</beans>
其实,通过xml,我认为不需要赘述什么。我们首先使用节点<bean>
来定义我们的Bean,指明了他的name,以及他是由哪个类来创建的。并且,我们还在其子节点<propertiy>
定义了Coconut的weight的初始值。
现在,我们已经通过xml,配置好了我们的Bean。怎么让Spring框架识别并初始化我们的Bean呢?很简单,只需要使用@ImportResource
来配置我们要加载的xml是哪个即可:
@SpringBootApplication
// '@ImportResource' 注解用于加载我们指定的xml配置
@ImportResource("classpath:chapter01_03_use_xml_beans.xml")
public class Chapter01App {
public static void main(String[] args) {
ConfigurableApplicationContext context =
SpringApplication.run(Chapter01App.class, args);
Object myCoconut = context.getBean("myCoconut");
if (myCoconut instanceof Coconut) {
int weight = ((Coconut) myCoconut).getWeight();
System.out.println("Coconut重量是:" + weight);
}
}
}
PS:对于classpath:xxx
的知识点,请自行了解,搜索关键字:Spring classpath
。
极简SpringBoot指南-Chapter01-如何用Spring框架声明Bean的更多相关文章
- 极简SpringBoot指南-Chapter03-基于SpringBoot的Web服务
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- 极简SpringBoot指南-Chapter02-Spring依赖注入的方式
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- 极简SpringBoot指南-Chapter00-学习SpringBoot前的基本知识
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- 极简SpringBoot指南-Chapter05-SpringBoot中的AOP面向切面编程简介
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- 极简SpringBoot指南-Chapter04-基于SpringBoot的书籍管理Web服务
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- 黑科技抢先尝(续2) - Windows terminal中Powershell Tab的极简美化指南
目录 安装python 安装git 安装powerline字体 主题定制 安装oh-my-posh 查看策略组的执行权限 使用choco 安装终端模拟器 - ConEmu 优化 PowerShell ...
- Spring框架的Bean管理的配置文件方式
1. id属性和name属性的区别 * id -- Bean起个名字,在约束中采用ID的约束,唯一 * 取值要求:必须以字母开始,可以使用字母.数字.连字符.下划线.句话.冒号 id:不能出现特殊字符 ...
- spring框架中Bean的生命周期
一.Bean 的完整生命周期 在传统的Java应用中,bean的生命周期很简单,使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了.一旦bean不再被使用,则由Java自 ...
- 黑科技抢先尝(续) - Windows terminal中WSL Linux 终端的极简美化指南
目录 修改默认源,为apt-get安装提速 安装python 和 python pip 安装 zsh 安装powerline-font中的特定字体 安装powerline-shell 修改~目录下的配 ...
随机推荐
- Mac Ideal 常用快捷键
智能提示 ⌘ -> command ⇧ -> shift ⌥ -> option -> 上箭头 -> 下箭头 ⌃ -> Control mac的option键 = ...
- mzy git学习,分支冲突,以及冲突解决(五)
冲突解决: 先尝试制造冲突: 首先我:git checkout -b mzy 创建一个mzy的分支 然后在其中修改readme.txt文件,随便加上一点东西. vim readme.txt wri ...
- jdbc操作mysql(三):利用注解封装
案例五:利用注解封装 重复步骤 我们使用jdbc操作mysql时发现,操作不同表中数据,所写的方法基本相同:比如我们根据id向用户表添加数据,根据id删除商品表的数据,或者查询所有数据并用list集合 ...
- Mysql for Mac 安装及环境配置
一.下载及安装 首先去官网下载mac对应版本的Mysql,尾缀为.dmg的程序包 下载地址:https://dev.mysql.com/downloads/mysql/ 下载完毕后,一步步傻瓜式安装即 ...
- JS 之 每日一题 之 算法 ( 划分字母区间 )
题目详解: 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 例子: 示例 1: 输入:S = &quo ...
- Django——实现评论功能(包括评论回复)
提示:(1)功能不全面,仅仅实现评论(2)样式简单 1.项目目录结构 2.模型 from django.db import models from django.contrib.auth.models ...
- MySQL——优化
MySQL数据库优化: 1.优化角度 安全: 数据可持续性 性能: 数据的高性能访问 2.优化范围(优化顺序---->) (1)存储.主机和操作系统: 主机架构稳定性 I/O规划及配置 swap ...
- adb 常用命令大全(4)- 应用管理
查看应用列表 语法格式 adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER] ...
- (xxl_job | quartz):XXL_JOB 对比 Quartz 一决高下!
概述: XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展. 现已开放源代码并接入多家公司线上产品线,开箱即用. 官方地址中文版:http://www.x ...
- AWVS13批量添加目标脚本
# -*-coding:utf-8-*- # @Author:malphite.tang import json import requests from queue import Queue req ...