Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring5.0源码深度解析之理解Configuration注解

Spring5.0源码深度解析之理解Configuration注解

作者头像
须臾之余
发布于 2019-07-30 07:46:38
发布于 2019-07-30 07:46:38
46300
代码可运行
举报
文章被收录于专栏:须臾之余须臾之余
运行总次数:0
代码可运行

一:Spring框架快速入门

1.什么是Spring框架

Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (控制反转) 和 AOP(面向切面编程)。 理念:每个bean与bean之间的关系统一交给SpringIOC容器管理 比如:创建对象, 通过spring可以通过扫包、注解形式注入 使用spring IOC容器帮助我们创建对象 底层大量反射机制。

2.Spring体系结构

1、Spring Core:主要组件是BeanFactory,创建JavaBean的工厂,使用控制反转(IOC) 模式 将应用程序的配置和依赖性规范与实际的应用程序代码分开。【重点分析】 2、Spring AOP:集成了面向切面的编程功能(AOP把一个业务流程分成几部分,例如权限检查、业务处理、日志记录, 每个部分单独处理,然后把它们组装成完整的业务流程。每个部分被称为切面), 可以将声明性事物管理集成到应用程序中。 3、Spring Context:一个核心配置文件,为Spring框架提供上下文信息。 4、Spring Do:Spring操作数据库的模块。 5、Spring ORM:Spring集成了各种orm(object relationship mapping 对象关系映射)框架的模块,集成mybatis 6、Spring Web集成各种优秀的web层框架的模块(Struts、Springmvc) 7、Spring web MVC:Spring web层框架

思考一个问题 为什么启动SpringBoot项目的时候需要加上Configuration、@ComponentScan

答案:Configuration的作用:方便在当前springboot启动类下注入第三方jar包,@ComponentScan作用在于扫描自己里面的需要注入的bean。

3.快速构建Spring环境

Maven依赖信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.0.RELEASE</version>
    </dependency>
</dependencies>

3.1 spring完全Xml方式环境搭建

applicationContext.xml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       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.xsd">
    <bean id="userEntity" class="com.mayikt.v1.entity.UserEntity">
        <property name="userId" value="10"/>
        <property name="userName" value="mayikt"/>
    </bean>
</beans>
Spring启动类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1.读取spring配置文件,创建IOC容器
ClassPathXmlApplicationContext classPath = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2.从SpringIoc容器获取userEntity
UserEntity userEntity = (UserEntity) classPath.getBean("userEntity");
System.out.println(userEntity.toString());

面试题分析:spring中在同一个配置文件中注入的beanid如果重复了会怎样?

答案:启动的时候会报错。 (bean已存在)

3.2 spring完全注解方式环境搭建

1.使用Configuration 配置容器(相当于spring.xml)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class MySpringConfig {
    //@Configuration 等同于配置的spring配置文件
    @Bean
    public UserEntity userEntity() {
        return new UserEntity(10, "mayikt");
    }
}
2.AnnotationConfigApplicationContext使用注解形式形式加载IOC
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static AnnotationConfigApplicationContext applicationContext;

public static void main(String[] args) {
    //注解方式
    applicationContext = new AnnotationConfigApplicationContext(MySpringConfig.class);
    UserEntity userEntity = applicationContext.getBean("userEntity", UserEntity.class);
    System.out.println(userEntity.toString());
}
3.@ComponentScan用法

扫包下注入springIOC容器中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
@ComponentScan("com.mayikt.v2")
public class MySpringConfig {
    //@Configuration 等同于配置的spring配置文件
    @Bean
    public UserEntity userEntity() {
        return new UserEntity(10, "mayikt");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static AnnotationConfigApplicationContext annotationConfigApplicationContext;

public static void main(String[] args) {
    annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MySpringConfig.class);
    UserService userService = annotationConfigApplicationContext.getBean("userService", UserService.class);
    System.out.println("userService:" + userService);
    System.out.println("以下为IOC容器注入成功的对象");
    String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
    for (int i = 0; i < beanDefinitionNames.length; i++) {
        System.out.println(beanDefinitionNames[i]);
    }
}
4.includeFilters

FilterType 有四种类型 ANNOTATION:注解类型 ASSIGNABLE_TYPE:ANNOTATION:指定的类型 ASPECTJ:按照Aspectj的表达式,基本上不会用到 REGEX:按照正则表达式 CUSTOM:自定义规则

5.包含扫包范围
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
@ComponentScan(value = "com.mayikt.v2", includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)}, useDefaultFilters = false)
public class MySpringConfig {
    //@Configuration 等同于配置的spring配置文件
    @Bean
    public UserEntity userEntity() {
        return new UserEntity(10, "mayikt");
    }
}
includeFilters 中配置了只有加了@Controller注解的类才会注入spring容器
6.排除扫包范围
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
@ComponentScan(value = "com.mayikt.v2", excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)}, useDefaultFilters = true)
public class MySpringConfig {
    //@Configuration 等同于配置的spring配置文件
    @Bean
    public UserEntity userEntity() {
        return new UserEntity(10, "mayikt");
    }
}

spring框架的四种作用域实现

默认情况Spring容器是单例的

  • singleton单例模式:全局有且仅有一个实例。【节约内存,使用多】
  • prototype原型模式:每次获取Bean的时候都会有一个新的实例。
  • request:request表示针对每次请求都会产生一个新的Bean对象,并且该Bean对象仅在当前Http请求内有效。
  • session:session作用域表示每次请求都会产生一个新的Bean对象,并且该Bean仅在当前Http session内有效。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UserService userService1 = annotationConfigApplicationContext.getBean("userService", UserService.class);
UserService userService2 = annotationConfigApplicationContext.getBean("userService", UserService.class);
System.out.println(userService1==userService2);
结果为true
思考问题:springbean对象在什么时候创建的?

答案:默认情况下是非懒加载的。

@Lazy

  • Lazy表示为懒加载,当真正需要引用获取的时候才会被加载
  • True 表示为非懒加载 false表示为在IOC容器加载的时候被创建
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
@Lazy(true)
public class UserService {
    public UserService() {
        System.out.println("UserService无参数构造被加载...");
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​将Bean交给Spring容器管理有几种方式?
所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。
程序猿川子
2022/12/08
5150
​将Bean交给Spring容器管理有几种方式?
Spring源码从入门到精通---@Configuration&@Bean(一)
想了很久,决定整理份 连载 的Spring源码(良心干货),供大家参考学习,本文是连载的第一篇文章,主要从spring加载实例bean开始讲起。
keying
2022/07/26
2290
Spring源码从入门到精通---@Configuration&@Bean(一)
深度挖掘Spring IoC核心模块源码的宝藏
开始本文的内容之前你得要搭建好 Spring 源码的环境,不会搭建的可以去查阅查阅我之前写的 Spring源码编译:
杨不易呀
2023/09/25
6151
深度挖掘Spring IoC核心模块源码的宝藏
【Spring】Spring常用注解(上)
为了伟大的房产事业
2024/03/15
1260
Spring入门这一篇就够了
前面我们在写程序的时候,都是面向接口编程,通过DaoFactroy等方法来实现松耦合
乔戈里
2019/07/25
5180
Spring-IOC
今天开始学习我自己总结的 Java-学习路线 中的《Spring-IOC》,小简从 0 开始学 Java 知识,并不定期更新所学笔记,期待一年后的蜕变吧
小简
2023/01/04
5430
Spring-IOC
花了两天肝出来的Spring注解编程的发展历程,相信对每个小伙伴都会有帮助的,建议收藏哦。
  Spring对于每个Java程序员的重要性都是不言而喻的。但是对于Spring的注解编程的发展,我相信有很多小伙伴还是不清楚的,本文就彻底给大家梳理下。
用户4919348
2021/07/29
4770
花了两天肝出来的Spring注解编程的发展历程,相信对每个小伙伴都会有帮助的,建议收藏哦。
Spring之注解开发
细节:如果注解中有且只有一个属性要赋值时,且名称是 value , value 在赋值是可以不写。
楠羽
2022/11/18
4450
Spring之注解开发
IOC和AOP理解
控制:传统应用系统自己创建对象,使用spring后,由容器统一创建管理; 反转:程序不创建对象,被动接收对象,由调用者决定。 如:A对象依赖B对象,传统应用需要在A内部new B对象,使用spring后,通过依赖注入灵活调用这里用到了多态。
Java微观世界
2025/01/20
1470
Spring源码学习笔记(4)——注解扫描
有了@Filter注解和FilterType过滤类型,我们就可以指定自己的注解扫描过滤规则。
张申傲
2020/09/03
5460
Spring源码从入门到精通---@ComponentScan(二)
传统的在xml配置文件配置路径,配置之后,在此路径下的@Controller,@Service,@Repository,@Component类都能扫描到
keying
2022/07/26
3330
Spring源码从入门到精通---@ComponentScan(二)
Spring核心之控制反转IOC
第一个值默认值,singleton,表示单实例对象 第二个值prototype,表示是多实例对象
用户9615083
2022/12/25
5520
Spring核心之控制反转IOC
Spring5.0源码深度解析之Spring核心注解
1.为什么要使用@Import注解?Import注解的主要作用的将外部的jar包注入到springioc容器中
须臾之余
2019/07/30
7880
Spring5.0源码深度解析之Spring核心注解
02-Spring5 IOC容器
注意:因为P命名空间注入依赖于Set方法所以增加setter and getter
彼岸舞
2021/12/14
5590
02-Spring5 IOC容器
由浅入深,讲解 spring 实战详细使用——spring 源码篇
首先,这篇文章不会详细的深入底层源码,只是基于注解和配置来说说我们的 spring 的使用,别小看基础,保证有你没用过的注解和配置,走起。
淡定的蜗牛
2019/09/25
7440
Spring5
cheese
2023/10/25
4320
Spring5
Spring 简介和配置
通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换。
繁依Fanyi
2023/05/07
1740
Spring 简介和配置
Spring Framework 源码学习笔记(一)
&emsp;&emsp;Spring致力于J2EE的各种解决方案,而不仅仅专注于某一层解决方案。可以说Spring是企业应用开发的“一站式”选择, Spring贯穿于表现层、业务层、持久层,然而Spring并不想取代那些已经有的框架,而是以高度的开放性,与这些已有的框架进行整合。
RiemannHypothesis
2022/08/19
3550
Spring Framework 源码学习笔记(一)
【小家Spring】Spring注解驱动开发---向Spring Ioc容器中注册Bean的7种方式
Spring是一个非常强大的反转控制(IOC)框架,以帮助分离项目组件之间的依赖关系。因此可以说Spring容器对Bean的注册、管理可以说是它的核心内容,最重要的功能部分。
YourBatman
2019/09/03
6940
【小家Spring】Spring注解驱动开发---向Spring Ioc容器中注册Bean的7种方式
Spring: (一) -- 春雨润物之 核心IOC
作为一个Java人,想必都或多或少的了解过Spring。对于其优势也能道个一二,诸如方便解耦、支持AOP编程、支持声明式事务、方便测试等等。Spring也不仅仅局限于服务器端开发,它可以做非常多的事情,任何Java应用都可以在简单性、可测试性和松耦合等方面从Spring中受益。Spring丰富功能的底层都依赖于它的两个核心特性:
宋先生
2019/07/18
6740
相关推荐
​将Bean交给Spring容器管理有几种方式?
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验