前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring5.0源码深度解析之理解Configuration注解

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

作者头像
须臾之余
发布2019-07-30 15:46:38
4480
发布2019-07-30 15:46:38
举报
文章被收录于专栏:须臾之余

一: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
复制
<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
复制
<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
复制
// 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
复制
@Configuration
public class MySpringConfig {
    //@Configuration 等同于配置的spring配置文件
    @Bean
    public UserEntity userEntity() {
        return new UserEntity(10, "mayikt");
    }
}
2.AnnotationConfigApplicationContext使用注解形式形式加载IOC
代码语言:javascript
复制
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
复制
@Configuration
@ComponentScan("com.mayikt.v2")
public class MySpringConfig {
    //@Configuration 等同于配置的spring配置文件
    @Bean
    public UserEntity userEntity() {
        return new UserEntity(10, "mayikt");
    }
}
代码语言:javascript
复制
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
复制
@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
复制
@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
复制
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
复制
@Service
@Lazy(true)
public class UserService {
    public UserService() {
        System.out.println("UserService无参数构造被加载...");
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一:Spring框架快速入门
    • 1.什么是Spring框架
      • 2.Spring体系结构
        • 3.快速构建Spring环境
          • 3.1 spring完全Xml方式环境搭建
          • 3.2 spring完全注解方式环境搭建
        • spring框架的四种作用域实现
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档