Spring5源码分析------基础知识了解(一)

项目目录
在这里插入图片描述

1.对于Spring的理解
Spring框架是java应用最广的框架,它的成功来源于理念,它的理念包括ioc和aop(理念:每个bean与bean之间的关系统一交给SpringIOC容器管理)。
Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC
2.Spring与传统对象管理的区别
在传统中,我们使用对象都是通过new xxx()来进行对象的实例化,而在Spring框架中,一般通过扫包、注解的形式来创建对象,在创建对象的过程中,大部分使用反射机制来进行。
3.Spring注入bean的两种方式
我们先写出一个对象(UserEntity.java)

package com.entity;

public class UserEntity {
    
    
    private String name;
    private String age;

    public void setName(String name) {
    
    
        this.name = name;
    }

    public void setAge(String age) {
    
    
        this.age = age;
    }

    @Override
    public String toString() {
    
    
        return "com.entity.UserEntity{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

并且在pom.xml中引入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.20.RELEASE</version>
    </dependency>
</dependencies>
  1. xml注入
    直接创建application.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 注入对象,一般使用小驼峰命名法 使用property注入对象属性值-->
    <bean id="userEntity" class="com.spring.entity.UserEntity">
        <property name="name" value="小王"/>
        <property name="age" value="18"/>
    </bean>
</beans>

在com.spring包下创建Application.java

public class Application {
    
    

    public static void main(String[] args) {
    
    
        // 解析xml配置,并指定xml文件,xml文件默认在resource根目录下
        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("application.xml");
        // 获取对象
        UserEntity userEntity = classPathXmlApplicationContext.getBean("userEntity", UserEntity.class);
        System.out.println(userEntity.toString());
    }

}

运行结果:

这样我们就可以发现xml中注入的数据也打印了

  1. 注解形式注入
    在com.spring.config下创建MyConfig.java
package com.spring.config;

import com.spring.entity.UserEntity;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfig {
    
    
    //@Configuration 相当于创建了spring.xml
    @Bean
    public UserEntity userEntity(){
    
    
        return new UserEntity();
    }
}

运行结果:
在这里插入图片描述
这样我们也可以看到我们成功创建了UserEntity对象
当然,@Configuration注解还有着很多的用处,比如:在此注解下使用@ComponentScan(“com.spring”)就可以扫描外部包,那么我们可以在Application.java中加入这么一段代码

// 获取在MyConfig中注入的所有bean
String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
for (int i = 0; i < beanDefinitionNames.length; i++) {
    
    
      System.out.println(beanDefinitionNames[i]);
}

运行结果:
在这里插入图片描述

这样我们就实现了两种注入方式,当然两种注入方式中注入的方法各种各样,不仅限于举例出来的这一种。

4.对象默认是单例还是多例
答案是,默认情况下是单例的。
测试方法(在Application.java中加入以下代码):

UserService userService1 = annotationConfigApplicationContext.getBean("userService", UserService.class);
UserService userService2 = annotationConfigApplicationContext.getBean("userService", UserService.class);
System.out.println(userService1 == userService2);

返回结果:
在这里插入图片描述
这里让我们了解到了,对象默认为单例,那么我们要对象变成多例要怎么实现呢?
很简单。在需要设置为多例的对象上加入@Scope(“prototype”)即可

5.对象的创建时饿汉式还是懒汉式
先来解释一下,饿汉式和懒汉式。
饿汉式:在配置文件加载的过程中,所有的对象都被创建,这也是为什么我们每一次启动tomcat的时候启动很慢,可启动成功之后会很快
懒汉式:在对象被使用的时候才会被创建
测试方式原理:在每一个对象被创建的时候,会走无参构造函数
测试方式:
在UserService.java中加入无参构造函数

public UserService(){
    
    
   System.out.println("UserSerivce被创建");
}

在Application.java中加入代码

System.out.println("配置文件启动成功");
UserService userService1 = annotationConfigApplicationContext.getBean("userService", UserService.class);

运行结果:
在这里插入图片描述
这也证明了我们的对象默认情况下是饿汉式加载,那么我们想要对象进行的是懒汉式加载怎么配置?
很简单,只需要在对象上加上注解@Lazy(value = true)即可

猜你喜欢

转载自blog.csdn.net/weixin_43911969/article/details/113836072