Spring Framework 源码学习笔记(五)(上)

简介: Spring Framework 源码学习笔记(五)

Chapter 05

Section 01 - @Value赋值的应用

entity包下新建一个实体了News,

public class News {
    private Integer id;
    private String content;
    public News() {
        System.out.println("无参构造方法被调用");
    }
    public News(Integer id, String content) {
        System.out.println("有参构造方法被调用");
        this.id = id;
        this.content = content;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    @Override
    public String toString() {
        return "News{" +
                "id=" + id +
                ", content='" + content + ''' +
                '}';
    }
}
复制代码

新建一个配置类BeanValueConfig

@Configuration
public class BeanValueConfig {
    @Bean
    public News news(){
        return new News();
    }
}
复制代码

新建一个测试类BeanValueConfigTest

public class BeanValueConfigTest {
    @Test
    public void getBeanValued(){
        ApplicationContext context = new AnnotationConfigApplicationContext(BeanValueConfig.class);
        System.out.println("IoC容器初始化完成");
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
        News news = (News) context.getBean("news");
        System.out.println(news);
    }
}
复制代码

执行该测试,控制台打印如下,News的属性都为空

5926c37bc889490a8f2d3dd2773f3448_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

使用@Value进行赋值,可以赋值基本数据类型或者Spring的EL表达式

修改News实体类属性部分代码如下,增加@Value注解,并添加值

@Value("1")
private Integer id;
@Value("某头部主播发布道歉信")
private String content;
复制代码

执行BeanValueConfigTest测试,方法控制台打印如下

60f21747efbc47568ad50a9c56d68ee9_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

News对象创建完成之后两个属性都已经被赋值,但是这种情况数据和代码之间的耦合度比较高,因此可以将数据放在配置文件当中,实现数据和代码的解耦。在resources目录下新建config.properties配置文件

news.id=1
news.content=某头部主播各大平台账号被封
复制代码

修改News实体类属性定义部分的代码

@Value("${news.id}")
private Integer id;
@Value("${news.content}")
private String content;
复制代码

修改BeanValueConfig,加载配置文件,设置编码

@Configuration
@PropertySource(value = "classpath:config.properties", encoding = "utf-8")
public class BeanValueConfig {
    @Bean
    public News news(){
        return new News();
    }
}
复制代码

执行测试,控制台输出如下,中文可以正常输出

7b5cc2f83ee94777a1a5be2da6bc13c7_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

如果不设置编码格式,中文会出现乱码

726351e237854de8ae3d7e5cc6093e1b_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

配置文件被加载后是放在环境变量中即org.springframework.core.env.Environment类中,可以通过容器获取environemnt对象,通过getProperty获取配置文件中配置项的值 修改测试方法,增加获取environment对象的代码

// 获取环境变量
Environment environment = context.getEnvironment();
System.out.println(environment);
System.out.println("new.content配置项的值为:" + environment.getProperty("news.content"));
复制代码

执行测试,查看控制台打印的代码

361be8cdebf24f1c9805d363a1d24a73_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

Section 02 - @Autowired @Resource @Qualifier @Primary自动装配

项目中新建三个包dao,service,controller,分别增加三个类

@Repository
public class PersonDao {
}
复制代码
@Service
public class PersonService {
    // 自动装配的Bean personDao
    @Autowired
    private PersonDao personDao;
    public PersonDao getBeanByAutowire(){
        return personDao;
    }
}
复制代码
@Controller
public class PersonController {
    @Autowired
    private PersonService personService;
}
复制代码

新增配置类BeanAutoAssembleConfig,将新建的三个包中的Bean注册到容器中

@ComponentScan(basePackages = {"com.citi.dao","com.citi.service","com.citi.controller"})
public class BeanAutoAssembleConfig {
}



相关文章
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
2月前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
74 2
|
3月前
|
Java Kotlin 索引
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
47 0
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
133 2
|
3月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
97 9
|
3月前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
162 5
|
4月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
51 9
|
4月前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
36 1
|
4月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
157 2
|
4月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
495 1