天天看點

Spring5源碼分析------基礎知識了解(一)

項目目錄

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());
    }

}
           

運作結果:

Spring5源碼分析------基礎知識了解(一)

這樣我們就可以發現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();
    }
}
           

運作結果:

Spring5源碼分析------基礎知識了解(一)

這樣我們也可以看到我們成功建立了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]);
}
           

運作結果:

Spring5源碼分析------基礎知識了解(一)

這樣我們就實作了兩種注入方式,當然兩種注入方式中注入的方法各種各樣,不僅限于舉例出來的這一種。

4.對象預設是單例還是多例

答案是,預設情況下是單例的。

測試方法(在Application.java中加入以下代碼):

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

傳回結果:

Spring5源碼分析------基礎知識了解(一)

這裡讓我們了解到了,對象預設為單例,那麼我們要對象變成多例要怎麼實作呢?

很簡單。在需要設定為多例的對象上加入@Scope(“prototype”)即可

5.對象的建立時餓漢式還是懶漢式

先來解釋一下,餓漢式和懶漢式。

餓漢式:在配置檔案加載的過程中,所有的對象都被建立,這也是為什麼我們每一次啟動tomcat的時候啟動很慢,可啟動成功之後會很快

懶漢式:在對象被使用的時候才會被建立

測試方式原理:在每一個對象被建立的時候,會走無參構造函數

測試方式:

在UserService.java中加入無參構造函數

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

在Application.java中加入代碼

System.out.println("配置檔案啟動成功");
UserService userService1 = annotationConfigApplicationContext.getBean("userService", UserService.class);
           

運作結果:

Spring5源碼分析------基礎知識了解(一)

這也證明了我們的對象預設情況下是餓漢式加載,那麼我們想要對象進行的是懶漢式加載怎麼配置?

很簡單,隻需要在對象上加上注解@Lazy(value = true)即可

繼續閱讀