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

一: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依赖信息

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.0.RELEASE</version>
    </dependency>
</dependencies>

3.1 spring完全Xml方式环境搭建

applicationContext.xml

<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启动类

// 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)

@Configuration
public class MySpringConfig {
    //@Configuration 等同于配置的spring配置文件
    @Bean
    public UserEntity userEntity() {
        return new UserEntity(10, "mayikt");
    }
}

2.AnnotationConfigApplicationContext使用注解形式形式加载IOC

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容器中

@Configuration
@ComponentScan("com.mayikt.v2")
public class MySpringConfig {
    //@Configuration 等同于配置的spring配置文件
    @Bean
    public UserEntity userEntity() {
        return new UserEntity(10, "mayikt");
    }
}
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.包含扫包范围

@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.排除扫包范围

@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内有效。
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容器加载的时候被创建
@Service
@Lazy(true)
public class UserService {
    public UserService() {
        System.out.println("UserService无参数构造被加载...");
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券