1、初始 Spring Boot
1、Spring Boot 的优点
- 简化配置
- 减少配置
- 优化配置 — 在 Spring Boot 项目中没有任何 XML 配置,大部分的配置信息都可以写入 一个单独的配置文件
- 配置信息更加集中,方便了对配置信息的管理
- 编写方便,可以使用代码提示的方式进行配置进行的编写
- 简化部署
- Spring Boot 有内置的 Web 容器。
- 简化监测
- 与主流框架的无缝集成
2、使用 Spring Boot 搭建一个 Web 项目
-
新建 Spring Boot 项目、
-
启动开发工具 IDEA,先创建 project,命名为 “ Spring Boot ”,然后创建 Module,依次单击菜单栏中 “File - New - Module”
-
-
在创建 Module 的窗口中,选择左侧菜单中的 “Spring Initializr”,选择Module SDK 为 JDK 1.8
-
-
傻瓜式操作,next
-
-
编写 Java 代码
-
创建一个 controller 包,里面创建一个控制器
-
@Controller public class HelloController { @RequestMapping(value = "/login", method = RequestMethod.GET) public String index(Map<String , Object> map){ map.put("name", "Steven"); return "index"; } }
-
-
启动并测试
2.-
-
打开网页
-
3、三个核心文件
-
pom 文件
-
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <artifactId>spring-boot-starter-web</artifactId> <groupId>org.springframework.boot</groupId> </dependency>
- 父依赖 spring-boot-starter-parent
- 限定 Java 的版本:Spring Boot xxx 版本所依赖的 JDK 版本为xx 以上
- 限定源码的文件编码方式,默认为 UTF-8
- 管理依赖:在父依赖中设置了一些公共依赖的版本号
- 打包支持:设置一些使用 Maven 对项目进行打包的规则
- 动态识别资源:可以识别一些特定名称的资源文件,比如 application.yml 文件
- 识别插件配置:比如 exec plugin、Git commit ID、shade 等
- 依赖 spring-boot-starter-web
- 依赖 spring-boot-starter-test
- 父依赖 spring-boot-starter-parent
-
-
启动类
- main() 方法 ---- 作用就是启动项目
- @SpringBootApplication 注解 ---- 是一个组合注解,它是由多个注解组合而成的注解
- 介绍3个注解
- @SpringBootConfiguration:可替换 Spring 的 applicationContext.xml 配置文件,被注解的类内部可以包含有一个或第一个被 @Bean 注解标注的方法,这些方法会被 Spring 的系统类扫描,并用于构建 Bean 定义,初始化 Spring 容器
- @EnableAutoConfiguration:可以启动 Spring Boot 的自动配置
- @ComponentScan:扫描启动同目录及子目录下的所有注解,是这些注解生效
- 介绍3个注解
-
application.properties 文件
-
关于 Spring Boot 项目的大部分配置信息可以在此文件中进行编写,是 Spring Boot 项目的配置文件
-
4、application.properties 文件
#启动的端口号
server.port=8080
#配置项目的访问根路径
server.servlet.context-path=/firstsb/
#配置日志的输出路径
logging.path=D:\\logs
#配置日志的输出格式
logging.pattern.file=%d-%msg%n
#也可以只写文件名或写相对路径。当只写文件名时,系统会以当前项目所在的盘符根路径作为起始目录,创建同名日志文件。
#写相对路径时,系统会以当前项目所在的盘符根路径作为起始目录,创建指定目录下的日志文件。
还可以使用application.yml 文件
server:
port: 8080
servlet:
context-path: /firstsb/
logging:
path: D:\\loogs
pattern:
file: %d-%msg-%n
在 YAML 文件编写配置信息需要注意以下几点
- 大小写敏感
- 缩进时不能使用 Tab 键,只允许使用空格
- 属性值和属性名之间要有空格隔开
5、Spring Boot 项目启动方式
支持3中内置容器:Tomcat、Jett、Undertow,默认的内置 Web 容器是 Tomcat
修改容器的步骤:
-
修改 pom.xml 文件
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
-
-
添加与 Web 容器 Jetty 相关的依赖
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
-
-
启动项目查看启动日志
1、Spring Boot 项目还有其他多种启动方式
-
本地 Web 容器中启动
-
使用 Maven 启动项目,如果想停止项目,可以使用 Ctrl + C 快捷键
2. -
使用 Java 命令启动项目
- 在当前目录下输入命令 java -jar xxxx.jar,即可启动项目,如果想停止项目,可以使用 Ctrl + C 快捷键
6、多模块项目
在企业级开发中,代码量大,项目庞大,即使使用三层架构的方式,搭建出来的项目也是比较复杂的,主要存在以下问题
- 结构不够清晰,开发人员不能从庞大的项目中快速定位自己负责的模块
- 项目庞大导致启动费时
- 部署时,无法分模块扩展项目,造成资源的浪费
为了解决这些问题,Maven 提出了一套多模块项目的方案。
步骤
- 创建 Maven 父模块 — 可以把 src 目录删除
- 创建子模块
- beans :存放实体类
- common:存放工具类,枚举类等项目中的核心类
- dao:存放数据访问层代码
- service:存放业务层代码
- controller:存放控制器层代码
- 配置模块之间的依赖
在多模块项目中,子模块继承父项目,所以可以在父项目中统一管理通用的依赖
那怎么管理依赖的版本号?
<dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</dependencyManagement>
使用聚合时,父项目的 pom 文件中 packaging 都是 pom
2、Spring Boot 实战技能
1、整合 JUnit 测试
代码测试是开发工作中一个非常重要的环节
实现步骤:
- 使用 IDEA 创建 Spring Boot 项目
- 创建工具类实现两个数相加
- 创建测试类并编写测试方法
- 为测试类添加 @RunWith 和 @SpringBootTest 注解
- @RunWith:使 @SpringBootTest 注解生效
- @SpringBootTest:创建 Spring 的 ApplicationContext,并将注入到测试类中
- 运行 测试类的方法对工具类进行测试
2、读取配置文件
可以通过 @PropertySource 和 @Value 注解实现该功能
实现步骤
- 创建 Spring Boot 项目
- 编写实体类 User,并为 User 类创建两个属性 userName 和 password
- 在 application.yml 文件中指定 userName 和 password 的值
- 通过 @Value 注解将 userName 和 password 的值注入给 User 实体类的对象
- 测试
User 实体类
@Component
public class User {
@Value("${user.userName}")
private String userName;
@Value("${user.password}")
private String password;
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", password='" + password + '\'' +
'}';
}
}
application.yml 配置文件
user:
userName: zhangsan
password: 123456
在真实的企业项目开发中,项目所需的配置的信息往往较多,开发者需要不断使用 @Value 注解读取配置,这就造成使用 @Value 注解读取配置文件有诸多不便。
另一种读取配置文件的方式----使用注解 @ConfigurationProperties
主要注意:
- 指定 prefix:由于实际开发中要读取的属性很多,不同实体类之间经常会存在属性相同的情况,所以在 application.yml 文件中配置属性时,需要添加前缀来标识对应的实体类,避免属性同名的问题
- 创建 setter 方法:@ConfigurationProperties 注解实际上通过属性的 setter 方法来进行注入
通过 @ConfigurationProperties 注解将 application.yml 文件中的属性值注入到 Java 实体类对应的属性
实现步骤
- 创建 Spring Boot 项目
- 编写实体类 User,并为 User 类创建两个属性 userName 和 password
- 在 application.yml 文件中指定 userName 和 password 的值
- 通过 @ConfigurationProperties 注解将 userName 和 password 的值注入给 User 实体类的对象。
- 测试
User 实体类
@Component
@ConfigurationProperties(prefix = "user")
public class User {
private String userName;
private String password;
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", password='" + password + '\'' +
'}';
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setPassword(String password) {
this.password = password;
}
}
application.yml 配置文件
user:
userName: zhangsna
password: 123456
3、多环境配置
在实际的项目开发中,往往会有多套运行环境,比如开发环境、测试环境和生成环境。
实现多环境配置有 properties 文件和 yml 文件两种方式
-
使用 properties 文件
-
使用 properties 文件实现多环境配置时,每个环境都需要有单独的 properties 文件。
-
注意点:
- 文件的命名方式,必须为 “application-环境名称.properties” 的形式,环境名称由开发者自行指定
- 由于两个配置文件只能有一个生效,所以需要指定当前环境启用的是哪个配置文件。
- 在 application.properties 文件中使用 spring.profiles.active 来进行此项配置
- 该属性的值须指定为配置文件名称 “application-环境名称.properties” 中的环境名称
-
-
使用 YAML 文件
-
使用 YAML 文件实现多环境配置只需要一个配置文件即可。所有的配置信息均可以放置在 application.yml 文件中
-
两套配置信息之间用 “—” 隔开,并通过 spring.profiles.active 配置了当前启用的 环境
-
spring: profiles: active: dev --- spring: profiles: dev autoconfigure: exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration mvc: view: prefix: /WEB-INF/jsp/ suffix: .jsp server: port: 8011 logging: config: classpath:logback-spring.xml --- spring: profiles: test server: port: 8082
-
4、Spring Boot 的自动配置
使用 Spring Boot 开发项目时,很多配置都是 Spring Boot 默认配置好的,然而在真实的项目开发中,项目需求是灵活多变的,为了实现某些需求,经常需要去调整这些默认配置。
当 Spring Boot 项目中引入了 spring-boot-starter-web 和 spring-boot-starter-test 这两个依赖之后,会在项目中添加两个与自动配置相关的 jar 包。展开这两个 Jar 包,会发现这个两个 Jar 下面都包含名为 “spring.factories” 的文件
打开 spring.factories 文件,会看到很多自动配置的类
4.1、自动配置类就是 Spring Boot 项目会自动配置的类
那么这些类是怎么被 Spring Boot 读取到的呢?
Spring Boot 项目的启动类上需要添加 @SpringBootApplication 注解,是复合注解,由多个注解组合而成,其中包含一个 @EnableAutoConfiguration 的注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
- 在@EnableAutoConfiguration 源码中通过 @Import 注解引入了 AutoConfigurationImportSelector 类。
- 在 AutoConfigurationImportSelector 类中,通过分析可以发现程序会去所有的自动配置包中查找 spring.factories 文件
- 从 spring.factories 文件中加载所有的自动配置类
@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@EnableConfigurationProperties({DataSourceProperties.class})
@Import({DataSourcePoolMetadataProvidersConfiguration.class, InitializationSpecificCredentialsDataSourceInitializationConfiguration.class, SharedCredentialsDataSourceInitializationConfiguration.class})
public class DataSourceAutoConfiguration {
public DataSourceAutoConfiguration() {
}
…………
4.2、DataSourceAutoConfiguration 类上添加了4个注解:
- @Configuration :让一个类变成一个配置类,拥有与 Spring 的配置文件相同的功能
- @ConditionalOnClass : 条件注解,是 @Conditional 的扩展注解。可以判断当某些类存在时进行后续代码的操作
- @EnableConfigurationProperties : 为某个类中的属性赋值
- @Import :将某个类的实例引入 Spring 的 IoC 容器。
@Conditional 的扩展注解 | 作用 |
---|---|
@ConditionalOnClass | 某个class位于类路径上,才会实例化一个Bean。 |
@ConditionalOnMissingClass | 某个class类路径上不存在的时候,才会实例化一个Bean。 |
@ConditionalOnBean | 当容器中有指定Bean的条件下进行实例化。 |
@ConditionalOnMissingBean | 当容器里没有指定Bean的条件下进行实例化。 |
@ConditionalOnProperty | 当指定的属性有指定的值时进行实例化。 |
@ConditionalOnResource | 当类路径下有指定的资源时触发实例化。 |
@ConditionalOnNotWebApplication | 不是web应用,才会实例化一个Bean。 |
@ConditionalOnWebApplication | 当项目是一个Web项目时进行实例化。 |
@ConditionalOnExpression | 基于SpEL表达式的条件判断,当表达式为true的时候,才会实例化一个Bean。 |
@ConditionalOnJava | 当JVM版本为指定的版本范围时触发实例化。 |
@ConditionalOnJndi | 在JNDI存在的条件下触发实例化。 |
@ConditionalOnSingleCandidate | 当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化。 |
理解:
- 当项目中没有添加 spring-boot-starter-jdbc 依赖时,项目中只有 DataSource.class,没有 EmbeddedDatabaseType.class
- 所以此时不满足执行 @EnableConfigurationProperties 的操作条件。
- 反之当项目中引入 spring-boot-starter-jdbc 依赖之后,由于此依赖中包含 EmbeddedDatabaseType.class,满足 @EnableConfigurationProperties 的操作条件,项目则执行 @EnableConfigurationProperties 注解的操作
- 就是给 DataSourceProperties 的属性进行赋值
- 在 DataSourceProperties 类的源码中可以发现其包含 url 属性。
- 由于并没有给 url 属性设置默认值,所以此时项目会去 application.yml 文件中寻找此属性的值。
4.3、关闭 Spring Boot 的自动配置有两种方式
-
注解的方式:比如要关闭 DataSourceAutoConfiguration 自动配置,可以在启动类的 @SpringBootApplication 注解上通过配置 exclude 属性来进行指定。如果需要关闭多个类的自动配置,可以在大括号中写多个类,并用逗号隔开。
-
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
-
-
配置文件的方式:开发者也可以在配置文件中关闭自动配置
-
spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
-
5、Spring Boot 整合 JSP
在 Web 开发中,前端数据展示是项目的重要组成部分。JSP 技术是常用的数据展示的模板引擎技术之一。
Spring Boot 默认支持的模板引擎有4种,分别为
- FreeMarker
- Groovy
- Thymeleaf
- Mustache
默认并不支持 JSP 模板引擎,但可以通过引入相关依赖来整合 JSP 模板引擎
具体的接入步骤:
-
添加依赖
-
<dependency> <artifactId>javax.servlet-api</artifactId> <groupId>javax.servlet</groupId> <scope>provided</scope> </dependency> <dependency> <artifactId>jstl</artifactId> <groupId>jstl</groupId> </dependency> <!-- tomcat 支持--> <dependency> <artifactId>spring-boot-starter-tomcat</artifactId> <groupId>org.springframework.boot</groupId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency>
-
配置视图解析器:在 application.yml 文件中添加
-
spring: mvc: view: prefix: /WEB-INF/jsp/ suffix: .jsp
-
-
编写控制器:在 Controller 类中
-
@Controller public class HelloController { @RequestMapping(value = "/login", method = RequestMethod.GET) public String index(Map<String , Object> map){ map.put("name", "Steven"); return "index"; } }
-
-
编写 JSP 页面,在项目 src/main 目录中添加 webapp/WEB-INF/jsp 目录,并在此目录下创建 index.jsp
-
<body> Message: ${name} </body>
-
-
启动项目测试
-
6、使用 XML 的配置
XML 配置是一种主流的配置方式,在 Spring Boot 项目中,可以使用 @ImportResource 注解读取 XML 配置文件
步骤:
- 将 @ImportResource 注解标注到启动类上,或者某个配置类
- 指定要引入的 XML 配置文件的位置。如:在资源目录下存在 applicationContext.xml 配置文件则可以通过 @ImportResource(value=“classpath:applicationContext.xml”) 读取
- 语法: @ImportResource(value=“配置文件的位置”)
7、LogBack 日志
日志是项目运行的监控和故障排查手段。在开发和调试阶段,日志可以帮助开发者更高效、便捷地定位问题。
在 Java 开发领域,常用的日志记录框架主要有三种:
- Log4j
- Log4j2
- LogBack
- 在性能上比 Log4j 更加高效。Spring Boot 官方把 LogBack 作为日志记录框架的首选。
Log4j2 和 LogBack 都是 Log4j 的升级版。
7.1、LogBack 日志配置
默认情况下,使用 IDEA 创建基于 Spring Boot 的 Web 项目时,默认集成了 LogBack。
分析输出的日志内容:
- 日志时间:精确到毫秒
- 日志级别:共有6种日志级别,日志级别从低到高依次为TRACE<DEBUG<INFO<WARN<ERROR<FATAL。默认为INFO
- 进程 ID:日志所属进程 ID,INFO 后的数字即为进程
- 分隔符:"----" 作为分隔符
- 线程名:使用中括号括起来的内容
- 日志名:默认使用源代码的类名
- 日志内容:冒号右侧的内容
日志配置项
属性 | 作用 |
---|---|
logging.config | 加载指定位置的日志配置文件 |
logging.file.max-history | 要保留的存档日志文件的最大数目 |
logging.file.max-size | 日志文件的最大占用空间,单位为MB |
logging.level.* | 设置某个范围下的日志级别,比如 logging.level.org.springframework=DEBUG |
logging.pattern.console | 设置在控制台输出的日志的格式 |
logging.pattern.dateformat | 设置在控制台输出的日志的日期格式 |
logging.pattern.file | 定义输出到日志文件的日志格式 |
logging.pattern.level | 定义日志的输出级别 |
在默认情况下,Spring Boot 项目可以读取 resources 资源目录中特定名字的日志配置文件,比如 logback-spring.xml、logback.xml。application.yml 文件可以通过 logging.config 属性,找到自定义日志配置文件的位置
语法:logging.config = 日志配置文件的位置和名称
注意:
Spring Boot 官方推荐使用带有-spring 的文件名作为日志配置,即使用 logback-spring.xml,而不是 logback.xml。
<configuration>
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout>
<pattern>
[%-5level]%d %thread - %msg%n
</pattern>
</layout>
</appender>
<!--输出日志到文件-->
<appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>DENY</onMatch>
</filter>
<encoder>
<pattern>
[%-5level]%d %thread - %msg%n
</pattern>
</encoder>
<!--指定文件的输出位置-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--定义把每一天的日志归档到一个文件中,其中用到了 property 定义的变量-->
<fileNamePattern>
<!-- ${logback.dir}/info.${logback.projname}.%d{yyyy-MM-dd}.log-->
${logback.dir}/%d{yyyy-MM-dd}.log
</fileNamePattern>
<!--只保留最近 90 天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,到了这个值,就会删除旧的日志-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileLog"/>
</root>
</configuration>
-
:配置文件的根元素节点。包含3个属性:scan、scanPerio、debug
- sacn:当此属性设置为 true 时表示如果配置文件发生改变,将被重新加载,反之则不对配置文件是否发生改变进行监测。scan的默认值为 true
- scanPeriod:设置监测日志配置文件是否有修改的时间间隔。当 scan 为 true 时,此属性有效,默认的时间间隔是1分钟
- debug:当此属性设置为 true 时,将输出 LogBack 默认日志信息。默认值为 false
-
:日志的上下文名称。此属性用于区分不同程序的日志。
-
<contextName>testLogback</contextName> <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender"> <layout> <pattern> [%-5level]%d %testLogback - %msg%n </pattern> </layout> </appender>
-
-
:设置变量值,在日志配置文件中使用。有两个属性——name 和 value
-
<property name="logback.dir" value="C:/logback/test"/> <property name="logback.projname" value="logbackproj"/>
-
-
:配置日志输出的策略。有两个属性——name 和 class,class 用来指定具体采用的输出策略
- :指定日志格式,在 ConsoleAppender 控制台输出策略中使用
- :指定日志格式,和 layout 的格式化方式相同,只是 encoder 须在 RollingFileAppender 文件输出策略中使用。
常用的日志格式及含义
配置 含义 %d{HH: mm:ss.SSS} 日志输出时间 %thread 输出日志的进程名字,这在Web应用以及异步任务处理中很有用 %-5level 日志级别,并且使用5个字符靠左对齐 %logger{36} 日志输出者的名字 %msg 日志消息 %n 平台的换行符 -
:日志过滤器,如可以过滤指定级别的日志等
- 一个 可以有多个过滤,这些过滤器按照配置顺序执行。
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--过滤 Error 级别的日志,只能写一个--> <level>ERROR</level> <!--匹配到 ERROR 级别的日志就禁止--> <onMatch>DENY</onMatch> <!--没有匹配到就允许--> <onMismatch>ACCEPT</onMismatch> </filter>
-
:当输出日志到文件时,指定文件的路径和文件名,可以是相对路径,也可以是绝对路径。如果上级目录不存在会自动创建,没有默认值。在 Windows 中,反斜杠 \ 需要转义,也可以使用正斜杠 /
-
:日志输出时的循环策略。
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--定义把每一天的日志归档到一个文件中,其中用到了 property 定义的变量-->
<fileNamePattern>
${logback.dir}/%d{yyyy-MM-dd}.log
</fileNamePattern>
<!--只保留最近 90 天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,到了这个值,就会删除旧的日志-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
3、Java 配置的方式
实现 Java 配置的方式,主要通过两个注解:@Configuration 和 @Bean
- 当 @Configuration 标注在一个 Java 类上时,此类便具有了和 Spring 的 IoC 配置文件相同的功能,即被 @configuration 标注的类,可以实现 Bean 组件的管理。
- 若要在 @Configuration 标注的类中实现 Bean 组件的管理,还需要 @Bean 注解,@Bean 注解用于标注在类的方法上,被 @Bean 注解标注的方法返回的类的实例,才能被称为 Bean 组件。
例如,实体类
public class Employee {
private String userName;//部门名称
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "Employee{" +
"userName='" + userName + '\'' +
", number='" + number + '\'' +
'}';
}
}
@Configuration
public class JavaConfig {
@Bean
public Employee employee(){
Employee employee = new Employee();
employee.setUserName("嘉龙");
employee.setNumber("007");
return employee;
}
}
@Bean 注解标注的方法名即 Bean 组件的 id 值。被标注的方法返回的类型,即配置 Bean 组件所需的 class 属性的值。
@Bean 注解提供了 name 属性,通过 name 属性也可以指定 Bean 组件的 id 值。
@Bean 注解没有 id 属性,而是用 name 属性来指定 Bean 组件的 id 值。
@SpringBootTest
class ChapterFourApplicationTests {
@Test
void contextLoads() {
System.out.println(123);
ApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
Employee employee = (Employee) context.getBean("employee");
System.out.println(employee.toString());
}
}
AnnotationConfigApplicationContext 类是 ApplicationContext 的实现类之一,用于管理 Java 配置的方式生成的 Spring 容器。
3.1、Java 配置的方式扩展
使用 @Scope 注解,@Scope 注解可以标注到方法上,与 @Bean 注解搭配使用。
使用 @Bean 注解的两个属性 initMethod 和 destoryMethod,可以实现初始化 Bean 和容器销毁之前的所做的操作。