Spring源码分析(一)

Spring核心注解

注解功能
@Bean容器中注册组件
@Primary同类组件如果有多个,标注主组件
@DependsOn组件之间声明依赖关系
@Lazy组件懒加载(最后使用的时候才创建)
@Scope声明组件的作用范围(SCOPE_PROTOTYPE,SCOPE_SINGLETON)
@Configuration声明这是一个配置类,替换以前
@Component@Controller、@Service、@Repository
@Indexed加速注解,所有标注了@Indexed的组件,直接会启动快速加载
@Order数字越小优先级越高,越先工作
@ComponentScan包扫描
@Conditional条件注入
@Import导入第三方jar包中的组件,或定制批量导入组件逻辑
@ImportResource导入以前的xml配置文件,让其生效
@Profile基于多环境激活
@PropertySource外部properties配置文件和JavaBean进行绑定;
@PropertySource@PropertySource组合注解
@Autowired自动装配
@Qualifier精确指定
@Value取值
@Lookup单例组件依赖非单例组件,非单例组件获取需要使用方法

注:@Indexed需要引入依赖:spring-context-indexer

Spring架构原理图

在这里插入图片描述

核心组件接口分析

  • 基础接口
    • Resource+ResourceLoader
    • BeanFactory
    • BeanDefinition
    • BeanDefinitionReader
    • BeanDefinitionRegistry
    • ApplicationContext
    • Aware
  • 生命周期-后置处理器
    • BeanFactoryPostProcessor
    • InitializingBean
    • BeanPostProcessor

核心组件接口分析-Resource+ResourceLoader

Resource

在这里插入图片描述

ResourceLoader

在这里插入图片描述
万物皆资源,都可以加载

核心组件接口分析-BeanFactory

Bean工厂所有实现接口:
在这里插入图片描述
BeanFactory:

  • HierarchicalBeanFactory:定义父子工厂(父子容器);
  • ListableBeanFactory:实现是DefaultListableBeanFactory,保存了ioc容器中的核心信息;
  • AutowireCapableBeanFactory:提供自动装配能力;

AnnotationConfigApplicationContext 组合了档案馆,它有自动装配能力;

ApplicationContext和BeanFactory有什么区别?

核心组件接口分析-BeanDefinition

Bean的定义信息保存的地方

核心组件接口分析-ApplicationContext
  • ioc事件派发器;
  • 国际化解析;
  • bean工厂功能–自动装配组合进来的;
  • 资源解析功能;
    在这里插入图片描述
package cn.javass.spring.chapter4; import java.io.File; import java.io.IOException; import junit.framework.Assert; import org.jboss.vfs.VFS; import org.jboss.vfs.VirtualFile; import org.jboss.vfs.spi.RealFileSystem; import org.junit.Test; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; @SuppressWarnings("all") public class ResourcePatternTest { @Test public void testClasspathPrefix() throws IOException { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); //只加载一个绝对匹配Resource,且通过ResourceLoader.getResource进行加载 Resource[] resources = resolver.getResources("classpath:META-INF/INDEX.LIST"); Assert.assertEquals(1, resources.length); //只加载一个匹配的Resource,且通过ResourceLoader.getResource进行加载 resources = resolver.getResources("classpath:META-INF/*.LIST"); Assert.assertTrue(resources.length == 1); //只加载一个绝对匹配Resource,且通过ResourceLoader.getResource进行加载 resources = resolver.getResources("classpath:META-INF/MANIFEST.MF"); Assert.assertEquals(1, resources.length); } @Test public void testClasspathAsteriskPrefix() throws IOException { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); //将加载多个绝对匹配的所有Resource //将首先通过ClassLoader.getResources("META-INF")加载非模式路径部分 //然后进行遍历模式匹配 Resource[] resources = resolver.getResources("classpath*:META-INF/INDEX.LIST"); Assert.assertTrue(resources.length > 1); //将加载多个模式匹配的Resource resources = resolver.getResources("classpath*:META-INF/*.LIST"); Assert.assertTrue(resources.length > 1); } @Test public void testClasspathAsteriskPrefixLimit() throws IOException { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); //将首先通过ClassLoader.getResources("")加载目录, //将只返回文件系统的类路径不返回jar的跟路径 //然后进行遍历模式匹配 Resource[] resources = resolver.getResources("classpath*:asm-*.txt"); Assert.assertTrue(resources.length == 0); //将通过ClassLoader.getResources("asm-license.txt")加载 //asm-license.txt存在于com.springsource.net.sf.cglib-2.2.0.jar resources = resolver.getResources("classpath*:asm-license.txt"); Assert.assertTrue(resources.length > 0); //将只加载文件系统类路径匹配的Resource resources = resolver.getResources("classpath*:LICENS*"); Assert.assertTrue(resources.length == 1); } @Test public void testFilekPrefix() throws IOException { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); Resource[] resources = resolver.getResources("file:D:/*.txt"); Assert.assertTrue(resources.length > 0); } @Test public void testVfsPrefix() throws IOException { //1.创建一个虚拟的文件目录 VirtualFile home = VFS.getChild("/home"); //2.将虚拟目录映射到物理的目录 VFS.mount(home, new RealFileSystem(new File("d:"))); //3.通过虚拟目录获取文件资源 VirtualFile testFile = home.getChild("test.txt"); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); Resource[] resources = resolver.getResources("/home/test.txt"); Assert.assertTrue(resources.length > 0); System.out.println(resources[0].getClass()); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值