这篇文章很重要,讲解的是动态代理,以及bean创建前后的所发生的事情.介绍一个接口:在Spring构造Bean对象过程中,有一个环节对Bean对象进行 后处理操作 (钩子函数) ----- Spring 提供 BeanPostProcessor 接口.我们可以自定义类,实现 BeanPostProcessor 接口,配置到Spring容器中,在构造对象时,spring容器会调用接口中方法. 这个接口两个方法public Object postProcessAfterInitialization(…
Bean后处理器:即当spring容器实例化Bean实例之后进行的增强处理. 容器后处理器:对容器本身进行处理,并总是在容器实例化其他任何Bean之前读取配置文件的元数据并可能修改这些数据. 一.Bean后处理器 实现了BeanPostProcessor接口的类即可作为一个Bean后处理器,以下是一个Bean后处理器的范例 1.编写一个实现了BeanPostProcessor接口的MyBeanPostProcessor类 package org.meify.core; import org.me…
有一篇写的是容器后处理器, 这篇是 Bean 后处理器 , 我对这个 Bean 后处理器的理解就是一个 AOP 编程 . Bean 后处理器 : 是一种特殊的 Bean , 这种 Bean 不对外提供服务 , 可以不需要 id 属性, 主要负责对容器中的其他 Bean 执行后处理 ,  所谓后处理,就是在 Bean 实例创建之后, 对 Bean 实例进行进一步的增强处理,例如为容器中的目标 Bean 生成代理等 . Spring 容器中提供两个常用的 Bean 后处理器 : BeanNameAu…
一个小小的里程碑 首先感谢能看到本文的朋友,感谢你的一路陪伴. 如果每篇都认真看的话,会发现本系列以bean定义作为切入点,先是详细解说了什么是bean定义,接着又强调了bean定义为什么如此重要. 然后又讲了获取bean定义详细信息的方法,接着又讲了bean定义注册的若干种方式,然后是bean定义注册方式的实现细节. 最后又以SpringBoot应用为例,从容器启动前.启动后分两个阶段解说bean定义是如何进入到容器里的. 就是bean工厂后处理器配合使用@ComponentScan注解和@I…
上一篇文章介绍了对@Configuration类的处理逻辑,这些逻辑都写在ConfigurationClassPostProcessor类中. 这个类不仅是一个“bean工厂后处理器”,还是一个“bean定义注册后处理器”. 这其实是两个接口,它们都是来操作bean定义.所以非常重要. 换句话说,能操作bean定义的,也只有这两个接口,你说重要不重要. 查看下类型信息,在整个Spring中确实只有这两个接口,如下图01: 虽然它们都是进行和bean定义相关的操作,但目的却是明显不同的. bean…
8.1.1 Bean后处理器(BeanPostProcessor) Bean后处理器主要负责对容器中其他Bean执行后处理,例如为容器中的目标Bean生成代理等. Bean后处理器会在Bean实例创建成功之后,对Bean实例进行进一步的增强处理. Bean后处理器必须实现BeanPostProcessor接口,BeanPostProcessor接口包含如下两个方法: ⊙ Object postProcessBeforInitialization(Object Bean,String name)…
1.扩展IoC容器使用后处理器扩展 bean后处理器:对容器中的bean进行后处理,也就是额外的加强. 容器后处理:对IoC容器进行后处理,增强容器功能. 2.bean后处理器      负责处理容器中的所有bean. bean后处理器必须实现BeanPostProcessor接口,提供非方法有: Object postProcessBeforeInitialization(Object bean,String name)throws BenasException:该方法第一个参数是系统即将进行…
1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来自定义自己的InvocationHandler; >通过Proxy.getProxyClass获得动态代理类 >通过反射机制获得代理类的构造方法,方法签名为getConstructor(InvocationHandler.class) >通过构造函数获得代理对象并将自定义的Invocatio…
之前学 Spring 的时候 , 还没听过容器后处理器 , 但是一旦写出来 , 就会觉得似曾相识 . 容器配置器通常用于对 Spring 容器进行处理 , 并且总是在容器实例化任何其他 Bean 之前 , 读取配置文件中的元数据 , 并有可能修改这些数据 . Spring 提供了如下几个常用的容器后处理器 : PropertyPlaceholderConfigurer : 属性占位符配置器 PropertyOverrideConfigurer : 重写占位符配置器 CustomAutowireC…
一. 自定 bean 的后置处理器 MyBeanPostProcessor 类.当你在初始化容器中的 bean 之前和之后,都会调用该处理器中的方法 @Component //将该后后置处理器加入到容器中 public class MyBeanPostProcessor implements BeanPostProcessor { /** * 任何初始化方法调用之前,都会先执行本方法 * Object bean:容器刚刚创建的实例 * String beanName:该实例在容器中的名字 */…
package com.process; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import com.action.LoginAction; public class FirstBeanPostProcess implements BeanPostProcessor { @Override public…
8.1.2 Bean后处理器的用处 Spring提供的两个常用的后处理器: ⊙ BeanNameAutoProxyCreator : 根据Bean实例的name属性,创建Bean实例的代理. ⊙ DefaultAdvisorAutoProxyCreator : 根据提供的Advisor,对容器中的所有Bean实例创建代理. 这两个Bean后处理器都用于根据容器中配置的拦截器,创建代理Bean.…
Bean后处理器是一种特殊的Bean,容器中所有的Bean在初始化时,均会自动执行该类的两个方法.由于该Bean是由其它Bean自动调用执行,不是程序员手工调用,故此Bean无须id属性.需要做的是,在Bean后处理器类方法中,只要对Bean类与Bean类中的方法进行判断,就可实现对指定的Bean的指定方法进行功能扩展与增强.方法返回的Bean对象,即是增过的对象.代码中需要自定义Bean后处理器类.该类就是实现了接口BeanPostProcessor的类.该接口中包含两个方法,分别在目标Bea…
最近在重读spring源码(为什么要重读?因为不得不承认,去年跟着<深入解析sping源码>一书过了一遍spring的源码,除了满脑袋都是各种BeanFactory跟BeanDefinition外,真的没什么收获...), 而第二遍由于是分模块分功能点去看,有了针对性,再加上之前囫囵吞枣的那一遍给我带来的整体认识,这一次顺畅了许多,对spring的理解亦深入了下去.所以说,阅读源码真的能带给人很多的收获, 而且不止于代码.后面会专门找个合适的时机对自己学习以及阅读源码这个过程做个总结,今天先聊…
在上一篇内容中,介绍了doGetBean方法的源码内容,知道了bean在创建的过程中,有三个范围,单例.多例.Scope,里面都使用到了createBean.下面本篇文章的主要内容,就是围绕createBean来进行展开. createBean方法 /** * Create a bean instance for the given merged bean definition (and arguments). * The bean definition will already have be…
主要区别就是: BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能,下面举个例子说明 BEAN类: package com.springdemo.postProcessor; public class PostProcessorBean { private String username; private String password; public String getPassword() { return password;…
概述: BeanPostProcessor接口是众多Spring提供给开发者的bean生命周期内自定义逻辑拓展接口中的一个,其他还有类似InitializingBean,DisposableBean,BeanFactoryAware等. 实现了BeanPostProcessor接口的Bean我们叫做后处理器. BeanPostProcessor接口定义如下: <span style="font-size:14px;">public interface BeanPostPro…
一.前言 本文章所讲并没有基于Aspectj,而是直接通过Cglib以及ProxyFactoryBean去创建代理Bean.通过下面的例子,可以看出Cglib方式创建的代理Bean和ProxyFactoryBean创建的代理Bean的区别. 二.基本测试代码 测试实体类,在BPP中创建BppTestDepBean类型的代理Bean. @Component public static class BppTestBean { @Autowired private BppTestDepBean dep…
在容器启动快完成时,会把所有的单例bean进行实例化,也可以叫做预先实例化. 这样做的好处之一是,可以及早地发现问题,及早的抛出异常,及早地解决掉. 本文就来看下整个的实例化过程.其实还是比较繁琐的. 一.从容器中找出所有的bean定义名称 因为不知道谁是单例bean,所以只能先全部找出来.如下图01: 二.循环遍历所有的bean名称,检查是否符合条件 首先要合并bean定义,因为bean定义可以有父子关系,类似继承. 然后这个合并后的bean定义必须是,非抽象的,单例的,非延迟初始化的. 那么…
1.接口 Class<?> resourceClass 2.获取builder BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(resourceClass); 3.获取接口对应的动态代理class Class<?> targetProxyClass = Proxy.getProxyClass(XXX.class.getClassLoader(), new Class[]{reso…
本文知识点(目录): 1.创建细节         1) 对象创建: 单例/多例         2) 什么时候创建?         3)是否延迟创建(懒加载)         4) 创建对象之后,初始化/销毁     2.创建方式           2.1.默认无参构造器         2.2.带参构造器(有两种方式,第一种:一个实体类:第二种:两个实体类合为一个[嵌套])         2.3.工厂类创建对象(两种:一个是工厂实体类,另一个是工厂实体类内部的静态方法)     3.附…
一.项目搭建 1.项目创建 eclipse→project explorer→new→Project→Maven Project 默认配置即可创建项目 2.spring配置 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.13.RELEASE</version>…
在之前的文章内容中,简单介绍了bean定义的加载过程,下面这篇的主要内容就是bean实例的创建过程. bean实例的创建方式 ApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); context.getBean("beanDemo"); 首先看到上面的代码,使用了getBean方法,那么创建bean的入口是不是在getBean里面呢? 通过之前的内容,可…
创建一个 Bean 实例对象的方法通常有如下方式: 调用构造器创建 Bean 实例 调用静态工厂方法创建 Bean 实例 调用实例工厂方法创建 Bean 实例 使用构造器创建 Bean 实例 XML 配置: <bean id="exampleBean" class="examples.ExampleBean"/> <bean name="anotherExample" class="examples.ExampleBe…
创建一个 Bean 实例对象的方法通常有如下方式: 调用构造器创建 Bean 实例 调用静态工厂方法创建 Bean 实例 调用实例工厂方法创建 Bean 实例 使用构造器创建 Bean 实例 XML 配置: <bean id="exampleBean" class="examples.ExampleBean"/> <bean name="anotherExample" class="examples.ExampleBe…
问题:eclipse&myeclipse 生成jar包后,spring无法扫描到bean定义 在使用getbean或者扫包时注入bean失败,但在IDE里是可以正常运行的? 原因:导出jar未将目录一起导出. 解决方法:将代码目录一起导出:一定要勾选 Add directory enttries 区别: 代码结构: 未勾选,导出内容为: META-INF/MANIFEST.MF com/wang/util/DateStyle.class com/wang/util/PropertiesUtil$…
Bean的后处理 Spring容器实例化Bean实例之后进行的增强处理,关于这里的描述之前有点错误,现在来纠正一下:这个过程有点像AOP,不过我们知道AOP是对方法而言的,而Bean后处理器是针对Javabean.AOP的作用是在你执行某个方法之前和之后,做一些别的事,而后处理器就是在你new好这个Javabean之后,进行的一些别的操作.而所谓的增强,也就是在程序流程原先的基础上进行一些新的扩展,AOP也可以理解成增强的一种. public class Person implements In…
数组添加值 public class DiTest { /** * 数组 */ private String [] arrays; /** * List:集合 */ private List<Integer> lists; /** * Set: 无序集合 */ private Set<String> sets; /** * Map */ private Map<String,Object> maps; /** * 配置 */ private Properties pro…
承接上文 IObjectFactoryPostProcessor(工厂后处理器)) 前提是实现接口的对象注册给当前容器 直接继承的对象调用这个postProcessBeanFactory方法,参数为工厂 添加对象配置在xml中用IApplicationContext自动注册 接口名称分别为.net的Spring.Objects.Factory.Config.IObjectFactoryPostProcessor 与Java的org.springframework.beans.factory.co…
Bean后处理器 新建maven项目并添加spring依赖,目录结构如下 Axe public interface Axe { public String chop(); } Person public interface Person { public void useAxe(); } SteelAxe public class SteelAxe implements Axe { public SteelAxe() { System.out.println("Spring实例化依赖bean:S…