metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { String return isConditionMatch(metadataReader); } } return false; } 总结MapperScannerConfigurer的作用 的目录递归搜索接口,将它们注册为MapperFactoryBean SqlSessionFactoryBean 类注释 创建Mybatis的SqiSessionFactory,用于Spring上下文中进行共享 MapperFactoryBean是这一切的答案(MapperFactoryBean:注意看我的名字---Mapper的工厂!!) 注意这个工厂仅仅注入接口不注入实现类 类图找关键方法 [MapperFactoryBean] 看类图,又看到了InitializingBean和FactoryBean!!!
-- (2) session工厂 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean -- (2) session<em>工厂</em> --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean //3.9 return this.sqlSessionFactoryBuilder.build(configuration); } 如上代码(3.1)创建了一个Spring事务管理<em>工厂</em> (3.5)解析mapper.xml中/mapper/resultMap标签下内容,然后存放到Configuration对象的resultMaps缓存里面,这里需要提一下,所有的mapper.xml文件<em>共享</em>一个 代码(5.13)设置session<em>工厂</em>到bean定义。
一、Spring源码基础组件 阅读源码时候,接口与类过多,可以对照这里查看对应的关系 1、bean定义接口体系 2、bean工厂接口体系 3、ApplicationContext上下文体系 二、AnnotationConfigApplicationContext ); //关闭容器 context.close(); } } AnnotationConfigApplicationContext的构造方法: 1、创建bean工厂 beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME)); } // 3.6.注册事件监听工厂 EventListenerMethodProcessor 事件监听后置处理器 internalEventListenerFactory = DefaultEventListenerFactory 事件监听工厂 metadataReader) throws IOException { for (TypeFilter tf : this.excludeFilters) { if (tf.match(metadataReader
TypeFilter定义如下: public interface TypeFilter { /** * 指定类是否匹配组件扫描的过滤规则 * @param metadataReader 目标类的元数据reader * @param metadataReaderFactory 可以获取其他类元数据reader的工厂 * @return 是否匹配过滤规则 * @throws IOException */ boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory 该方法有两个参数: metadataReader:当前扫描到的目标类的元数据读取器,可以通过该对象获取目标类的信息; metadataReaderFactory:其他类的元数据工厂了,可以获取其他类的信息 metadataReader, MetadataReaderFactory metadataReaderFactory){ //获取目标类元信息 ClassMetadata
Bean的名称,如果通过工厂Bean创建 @Nullable private String factoryBeanName; // 工厂方法的名称,用于通过静态方法或工厂Bean public ScannedGenericBeanDefinition(MetadataReader metadataReader) { // 校验 metadataReader 不为 null Assert.notNull(metadataReader, "MetadataReader must not be null"); // 从 MetadataReader 获取注解元数据 this.metadata = metadataReader.getAnnotationMetadata(); // 设置 Bean 类的名称 setBeanClassName(this.metadata.getClassName ()); // 设置扫描到的资源 setResource(metadataReader.getResource()); } @Override // 返回 Bean 类的注解元数据 public
MetadataReaderFactory MetadataReader的实现都并未public暴露出来,所以我们若想得到它的实例,就只能通过此工厂。 IOException { return new SimpleMetadataReader(resource, this.resourceLoader.getClassLoader()); } } 此工厂生产的是 此类可认为从没有被Spring内部使用过,暂且可忽略(spring-data工程有用) Factory工厂的实现都是非常简单的,毕竟只是为了生产一个实例而已。 下面我也给出使用案例: 因为MetadataReader的实现类都是包级别的访问权限,所以它的实例只能来自工厂 public static void main(String[] args) throws metadataReader = readerFactory.getMetadataReader(MetaDemo.class.getName()); MetadataReader metadataReader
Component,构造BeanDefinition对象(实际为ScannedGenericBeanDefinition) 利用BeanDefinitionRegister注册BeanDefinition到bean工厂中 ,BeanDefinitionRegister是spring默认bean工厂DefaultListableBeanFactory的一个接口,用于注册BeanDefinition; 先祭出类继承图: resourceLoader) { Assert.notNull(registry, "BeanDefinitionRegistry must not be null"); //bean工厂 *meteDataFactory根据Resouce获取到MetadataReader对象 *MetadataReader */ MetadataReader metadataReader = getMetadataReaderFactory().getMetadataReader
com.jack.remote.service")); List<String> classNames = Arrays.stream(resources).map(resource -> { MetadataReader metadataReader = null; try { metadataReader = metadataReaderFactory.getMetadataReader resource); } catch (IOException e) { e.printStackTrace(); } return metadataReader.getClassMetadata }); } 三、装配 对于远程service包下的类,就可以直接使用@Autowired来装配 总结 至此FactoryBean已经完结,对于它的作用已经了解:它是一个能生产或修饰对象生成的工厂 Bean,类似于设计模式中的工厂模式和装饰器模式
Users/tenmao/Workspace/boot/tenmao-cond/target/classes/com/tenmao/cond/UserManager.class"); //元数据解析器工厂 CachingMetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(); //元数据解析器 MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource); //解析出来的类元数据 ClassMetadata classMetadata = metadataReader.getClassMetadata(); System.out.println(classMetadata); } 注意:整个过程程序并没有使用
TypeFilter 类型:接口 作用:自定义类型过滤器 范例: public class MyTypeFilter implements TypeFilter { public boolean match(MetadataReader mr, MetadataReaderFactory mrf) throws IOException { ClassMetadata cm = metadataReader.getClassMetadata ClassPathBeanDefinitionScanner(r, false); TypeFilter tf = new TypeFilter() { public boolean match(MetadataReader class SpringConfig { } 10.7.bean初始化过程解析 10.7.1.bean初始化过程解析 BeanFactoryPostProcessor 作用:定义了在bean工厂对象创建后 ,bean对象创建前执行的动作,用于对工厂进行创建后业务处理 运行时机:当前操作用于对工厂进行处理,仅运行一次 BeanPostProcessor 作用:定义了所有bean初始化前后进行的统一动作
工厂模式分三类: 简单工厂 工厂方法 抽象工厂 简单工厂不属于设计模式,因为其违背了设计模式的开闭原则,后面会有介绍。 工厂方法 ? 车可以生产车,那具体的奥迪车工厂可以生产奥迪车,奔驰车工厂可以生产奔驰的车。当需要生产法拉利的车时,我们只需要实现一个法拉利的产品,然后实现一个法拉利的工厂即可,而不需要修改之前的代码。 简单工厂 ? factory_simple.png 这是工厂模式的简单实现方式,包含元素 工厂类 抽象产品 抽象方法 示例 这里抽象产品和抽象方法和前面一样。 比如:当需要生产法拉利时,我们需要修改工厂类的方法。这不符合开闭原则,所以它不属于设计模式。只是工厂模式的一个变相简单的实现。 抽象工厂 前面说到工厂方法只能生产一个类型的产品。 当我们需要生产一系列的产品,比如:我们需要奥迪的发动机,那么肯定也是在奥迪的工厂生产,那么这里就可以使用抽象工厂设计模式 元素 抽象工厂 具体工厂 抽象产品(多个) 具体产品 示例 这里我们再Car的基础上在增加一个产品
FilterType.CUSTOM的使用 定义一个TypeFilter的实现类MyTypeFilter public class MyTypeFilter implements TypeFilter { /** * metadataReader :读取到的当前正在扫描的类的信息 * metadataReaderFactory:可以获取到其他任何类信息的 */ public boolean match(MetadataReader metadataReader (); //获取当前正在扫描的类的类信息 ClassMetadata classMetadata = metadataReader.getClassMetadata(); //获取当前类资源 (类的路径) Resource resource = metadataReader.getResource(); String className = classMetadata.getClassName 6)FactoryBean(工厂Bean) 1)默认获取到的是工厂bean调用getObject创建的对象 2)要获取工厂Bean本身,我们需要给id前面加一个&colorFactoryBean 编写FactoryBean
classMetadata = metadataReader.getClassMetadata(); // 获取当前类资源(类的路径) Resource resource = metadataReader.getResource(); // 获取这个类名 String className = classMetadata.getClassName 返回需要导入的组件的全类名数组. 3) : ImportBeanDefinitionRegistrar : 手动注册Bean到容器中 4 : 使用Spring提供的FactoryBean(工厂 Bean) 1) : 默认获取到的是工厂bean调用getObject创建的对象 2) : 要获取工厂Bean本身,我们需要给id前面加一个& ColorFactoryBean getBean() { return new ColorFactoryBean(); } public void test() { //工厂
name-generator"; //模板引用 private static final String ATTRIBUTE_TEMPLATE_REF = "template-ref"; //工厂引用 private static final String ATTRIBUTE_FACTORY_REF = "factory-ref"; //映射工厂bean类 private static 相反,创建一个仅包含此映射器扫描器的BeanFactory并对工厂进行后处理。 reader,也即拿到扫描文件信息 MetadataReader metadataReader = getMetadataReaderFactory().getMetadataReader(resource (MetadataReader metadataReader) throws IOException { //排查过滤器 for (TypeFilter tf : this.excludeFilters
文章目录 简单工厂 工厂方法 抽象工厂 简单工厂 ---- 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一 个工厂对象决定创建出哪一种产品类的实例。 Factory表示工厂,工厂根据需要来创建相应的产品。 这样一来,当添加新的产品C时,只需要修改工厂部分代码即可,而传统方法需要在每一个创建产品的地方都进行修改。 ---- 不难发现,当增加新的产品时需要对简单工厂类修改,或创建多个简单工厂。 ---- 不难发现当创建新的产品接口时,也需要对工厂方法修改,或创建多个工厂方法。 可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。 把工厂类抽象后,对应不同子类工厂(普通/魔法),生产对应的一组产品。
BeanDefinitionReader的核心方法包括以下几个:BeanDefinitionRegistry,用来注册bean定义,相当于一个工厂BeanNameGenerator,用来生成bean名字的生成器 框架中的一个重要接口,他就是Spring用于管理Bean对象的创建和管理,看他的几个主要方法就知道了:getBean,可以根据name、type等获取bean对象containsBean,是否bean工厂中有某个对象 BeanFactoryPostProcessorBeanFactoryPostProcessor表示Bean工厂的后置处理器,其实和BeanPostProcessor类似,BeanPostProcessor MetadataReader、ClassMetadata、AnnotationMetadataSpring启动时需要扫描指定包路径下的所有类文件来获取需要注入或管理的Bean信息。 System.out.println(metadataReader.getClassMetadata().getClassName()); metadataReader.getAnnotationMetadata
com.summer.test.service"); System.out.println(applicationContext.getBean(UserService.class)); BeanFactory Bean工厂 BeanFactory 表示 Bean 工厂,负责创建 Bean,提供获取 Bean 的 API。 ApplicationContext 提供一下功能: 用于访问应用程序组件的Bean工厂方法。从 ListableBeanFactory 继承; 以通用方式加载文件资源的能力。 BeanFactoryPostProcessor Bean 工厂后置处理器 BeanFactoryPostProcessor 表示 Bean 工厂的后置处理器,其实和 BeanPostProcessor metadataReaderFactory = new SimpleMetadataReaderFactory(); // 构造 MetadataReader MetadataReader metadataReader
工厂模式分三类:简单工厂模式、工厂方法模式、抽象工厂模式。 首先介绍比较简单一种工厂模式——简单工厂模式。 我们以计算器作为一个例子来说明工厂模式到底是什么。 既然是工厂模式,那就有一个工厂类。这个工厂类是用来干嘛的呢?工厂是用来做什么呢?生产东西用的,工厂模式的工厂类就使用类生产不同类不同对象的。 ,只需要输入运算符号,工厂类就能实例化出合适的对象,通过多态返回父类的方式的实现了计算器的结果。 #到现在,就是简单工厂模式的思想,为什么不能几个if分支判断来实现计算器呢?那样岂不是代码量更少,好像更容易阅读么? 代码量少是在这里更少,但是如果考虑到扩展性,如果是一个大型项目,该需求或者做扩展的时候,我想付出代价远远比工厂模式这多出来的代码更大。
前言:按照惯例我以Head First设计模式的工厂模式例子开始编码学习。并由简单工厂,工厂模式,抽象工厂模式依次演变,归纳他们的相同与不同。 (静态工厂),简单工厂也可以不用静态类,但简单工厂并不是一种专门的设计模式(有时候可能会混淆,认为这即是”工厂模式“),更像是我们平时编程都会做的一种习惯。 工厂方法模式:定义了一个创建对象的接口,由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。 工厂方法与简单工厂的区别:工厂方法的子类看起来很像简单工厂。 利用抽象工厂我们代码将从实际工厂解耦,这样如果我们的工厂需要扩展那么我们则可在子类中进行修改扩展。 工厂方法与抽象工厂的异同优缺点 相同:都是用来创建对象。 不同:工厂方法使用的是继承,抽象工厂使用的是组合。 优点:工厂方法只负责从具体类型中解耦,抽象工厂适合将一群相关的产品集合起来。 缺点:抽象工厂扩展接口需要修改每个子类。
工厂模式之抽象工厂 是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。类继承自抽象工厂,即可生产指定对象。新增实体的时候无需修改已有代码。 比如食物这个工厂,在现实世界中,它可以生产面包、鸡蛋、肉等,在魔法世界中,食物工厂可以生产魔法豆、会唱歌的火鸡、HP口服液等,我们把食物比作是最大的一个抽象工厂,现实世界(ModernFactory)抽象工厂和魔法世界 (MagicFactory)抽象工厂继承自最大的食物抽象工厂,然而bread面包、egg鸡蛋、meat肉类都继承自ModernFactory抽象工厂、MagicBeans魔法豆等继承自MagicFactory ,一步步化抽象为具体,抽象工厂实际最大的好处就是实现了代码的解耦。 ,食物大类分为现实世界的面包和魔法世界的魔法豆,面包是由现实工厂生产的,魔法豆是由魔法工厂生产的,魔法豆一族和面包一族分别继承自食物,通过代码工厂就可以根据需求生产不同的食物(调用不同的方法)。