Spring5原始碼 - Spring IOC 註解複習

小小工匠發表於2020-10-11

在這裡插入圖片描述


Pre

為了更好地學習原始碼,我們有必要對基礎知識進行一次簡單的複習,只有在知道如何使用的基礎上,再去閱讀原始碼才能明白spring這些原始碼是對哪些功能的支援。

這裡簡單的梳理一下


xml配置檔案

【配置檔案 】

<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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="artisan"  class="com.artisan.base.Artisan"/>
</beans>

【讀取Bean】

ClassPathXmlApplicationContext cx = new ClassPathXmlApplicationContext("classpath:spring.xml");
System.out.println(cx.getBean("artisan").getClass().getSimpleName());
	}

【輸出】
在這裡插入圖片描述


JavaConfig

【POJO】

public class Bean1 {
}
    

【配置檔案 】

@Configuration
public class MainConfig {

	@Bean
	public Bean1 bean1(){
		return new Bean1();
	}
}

【讀取Bean— 傳入配置類】

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);
		System.out.println(ac.getBean("bean1"));
	}

@Bean的形式, bean的預設名稱是方法名,若@Bean(value=“bean的名稱”) ,那麼bean的名稱是指定的名稱。

【測試結果】

在這裡插入圖片描述


@CompentScan

在這裡插入圖片描述

在配置類上寫@CompentScan註解來進行包掃描

【配置類】

package com.artisan.base.componentscan.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.artisan.base.componentscan")
public class CSMainConfig {

}
    

【c - s -d 】

package com.artisan.base.componentscan.controller;

import org.springframework.stereotype.Controller;

@Controller
public class ArtisanInfoController {
}
    
package com.artisan.base.componentscan.service;

import org.springframework.stereotype.Service;

@Service
public class ArtisanService {
}
    
package com.artisan.base.componentscan.dao;

import org.springframework.stereotype.Repository;

@Repository
public class ArtisanDao {
}
    

【測試類】

package com.artisan.base.componentscan;

import com.artisan.base.componentscan.config.CSMainConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class CMTest {

	public static void main(String[] args) {

		AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(CSMainConfig.class);
		// 輸出 單例池中的單例bean的名字
		for (String beanDefinitionName : ac.getBeanDefinitionNames()) {
			System.out.println("bdName:" + beanDefinitionName);
		}

	}
}

【輸出】

在這裡插入圖片描述


excludeFilters

【配置類】

import com.artisan.base.componentscan.service.ArtisanService;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;

@Configuration
@ComponentScan(
		basePackages = {"com.artisan.base.componentscan"},
		excludeFilters = {
			@ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class}),
			@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = {ArtisanService.class})
})
public class CSMainConfig {

}

重點配置

@ComponentScan(
		basePackages = {"com.artisan.base.componentscan"},
		excludeFilters = {
			@ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class}),
			@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = {ArtisanService.class})
})

excludeFilters(排除@Controller註解的,和ArtisanService的)

【測試結果】

在這裡插入圖片描述


includeFilters

@Configuration
@ComponentScan(
		basePackages = {"com.artisan.base.componentscan"},
		includeFilters =
				{@ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Controller.class})},
		useDefaultFilters = false)public class CSMainConfig {

}

若使用包含的用法, 需要把useDefaultFilters屬性設定為false(true表示掃描全部的)

【測試結果】

在這裡插入圖片描述


@ComponentScan.Filter type的型別

相關文章