- 浏览: 341365 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (212)
- spring (21)
- design pattern(java) (12)
- linux-shell (28)
- java-thread (20)
- java-collection (6)
- java-reflect (9)
- mysql (11)
- java-io (7)
- java-util&lang&io (3)
- algorithm (3)
- interview (2)
- tools-eclipse (2)
- tools-maven (1)
- web-script (1)
- java组建 (13)
- 博客收藏 (1)
- 架构设计与实践 (10)
- active-mq (6)
- java-jvm&性能&原理 (27)
- tomcat (2)
- flume (1)
- serialization (2)
- git (1)
- cache&redis (8)
- guava (1)
- zookeeper (3)
- socket&tcp&udp&http (6)
- test (1)
最新评论
-
bbls:
有用有用有用
java-jvm-jstack-(监视器和锁的概念) -
王新春:
小侠有点帅哦 写道此流怎么关闭新春这个实现 可以不关闭的,哈哈 ...
源码剖析之java.io.ByteArrayOutputStream -
小侠有点帅哦:
此流怎么关闭新春
源码剖析之java.io.ByteArrayOutputStream -
cumt168:
写的很好为什么初始化参数,年轻代-Xmn10M def new ...
jvm之内存申请过程分析 -
ronin47:
应该是跟共享域名思路差不多,根据cookie的key作判断
跨域:一种通过服务端解决跨域的实现
理解spring中一个bean的初始化过程非常重要,很多基础功能的扩展,就是在bean初始化的某一步进行的。
BeanPostProcessor:功能的定位是:
1、实例化bean前,实例化,实例化后的钩子(new)
2、初始化bean前,执行设置方法,初始化bean后的钩子(init-method,destory-method,setMethod)
下面做个case:
测试例子:
或者
输出:
c.g.MyInstantiationTracingBeanPostProcessor- postProcessBeforeInstantiation 实例化 class com.gym.UserServiceImpl user
com.gym.UserServiceImpl- UserServiceImpl 构造函数
c.g.MyInstantiationTracingBeanPostProcessor- postProcessAfterInstantiation 实例化 UserServiceImpl [username=null, password=null] user
c.g.MyInstantiationTracingBeanPostProcessor- postProcessPropertyValues 改变 PropertyValues PropertyValues: length=2; bean property 'username'; bean property 'password' UserServiceImpl [username=null, password=null]
com.gym.UserServiceImpl- UserServiceImpl setUsername xinchun.wang
com.gym.UserServiceImpl- UserServiceImpl setPassword 123456
com.gym.UserServiceImpl- setBeanFactory org.springframework.beans.factory.xml.XmlBeanFactory@3a51127a: defining beans [org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,user,processor]; root of factory hierarchy {}
c.g.MyInstantiationTracingBeanPostProcessor- postProcessBeforeInitialization 初始化 UserServiceImpl [username=xinchun.wang, password=123456] user
com.gym.UserServiceImpl- UserServiceImpl afterPropertiesSet
com.gym.UserServiceImpl- UserServiceImpl initMethod
c.g.MyInstantiationTracingBeanPostProcessor- postProcessAfterInitialization 初始化 UserServiceImpl [username=xinchun.wang, password=123456] user
com.gym.UserServiceImpl- UserServiceImpl destroy
com.gym.UserServiceImpl- UserServiceImpl destroyMethod
BeanPostProcessor:功能的定位是:
1、实例化bean前,实例化,实例化后的钩子(new)
2、初始化bean前,执行设置方法,初始化bean后的钩子(init-method,destory-method,setMethod)
下面做个case:
public interface IUserService { public String getUsername (); public String getPassword(); }
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; public class UserServiceImpl implements IUserService, BeanFactoryAware, InitializingBean, DisposableBean{ private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class); public UserServiceImpl(){ logger.info("UserServiceImpl 构造函数 "); } private String username; private String password; public String getUsername() { return username; } public String getPassword() { return password; } public void setUsername(String username) { logger.info("UserServiceImpl setUsername {}",username); this.username = username; } public void setPassword(String password) { logger.info("UserServiceImpl setPassword {}",password); this.password = password; } @Override public String toString() { return "UserServiceImpl [username=" + username + ", password=" + password + "]"; } public void initMethod(){ logger.info("UserServiceImpl initMethod"); } public void destroy(){ logger.info("UserServiceImpl destroy"); } public void destroyMethod(){ logger.info("UserServiceImpl destroyMethod"); } public void setBeanFactory(BeanFactory beanFactory) throws BeansException { logger.info("setBeanFactory {} {}", beanFactory); } public void afterPropertiesSet() throws Exception { logger.info("UserServiceImpl afterPropertiesSet"); } }
public class MyInstantiationTracingBeanPostProcessor implements InstantiationAwareBeanPostProcessor{ private static final Logger logger = LoggerFactory.getLogger(MyInstantiationTracingBeanPostProcessor.class); public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { logger.info("postProcessBeforeInitialization 初始化 {} {}", bean, beanName); return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { logger.info("postProcessAfterInitialization 初始化 {} {}", bean, beanName); return bean; } public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException { logger.info("postProcessBeforeInstantiation 实例化 {} {}", beanClass,beanName); return null; } /** * 实例化 */ public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { logger.info("postProcessAfterInstantiation 实例化 {} {}", bean, beanName); return true; } public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { logger.info("postProcessPropertyValues 改变 PropertyValues {} {}", pvs,bean); return pvs; } }
测试例子:
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class TestXmlBeanFactory { public static void main(String[] args) { ConfigurableListableBeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring/applicationContext.xml")); factory.addBeanPostProcessor(new MyInstantiationTracingBeanPostProcessor()); IUserService userService = factory.getBean(IUserService.class); String password = userService.getPassword(); factory.destroyBean("user", userService); System.out.println(password); } }
或者
public class TestApplicationContext { public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext( "classpath:spring/applicationContext.xml"); IUserService userService = applicationContext.getBean(IUserService.class); String password = userService.getPassword(); applicationContext.destroy(); System.out.println(password); } }
输出:
c.g.MyInstantiationTracingBeanPostProcessor- postProcessBeforeInstantiation 实例化 class com.gym.UserServiceImpl user
com.gym.UserServiceImpl- UserServiceImpl 构造函数
c.g.MyInstantiationTracingBeanPostProcessor- postProcessAfterInstantiation 实例化 UserServiceImpl [username=null, password=null] user
c.g.MyInstantiationTracingBeanPostProcessor- postProcessPropertyValues 改变 PropertyValues PropertyValues: length=2; bean property 'username'; bean property 'password' UserServiceImpl [username=null, password=null]
com.gym.UserServiceImpl- UserServiceImpl setUsername xinchun.wang
com.gym.UserServiceImpl- UserServiceImpl setPassword 123456
com.gym.UserServiceImpl- setBeanFactory org.springframework.beans.factory.xml.XmlBeanFactory@3a51127a: defining beans [org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,user,processor]; root of factory hierarchy {}
c.g.MyInstantiationTracingBeanPostProcessor- postProcessBeforeInitialization 初始化 UserServiceImpl [username=xinchun.wang, password=123456] user
com.gym.UserServiceImpl- UserServiceImpl afterPropertiesSet
com.gym.UserServiceImpl- UserServiceImpl initMethod
c.g.MyInstantiationTracingBeanPostProcessor- postProcessAfterInitialization 初始化 UserServiceImpl [username=xinchun.wang, password=123456] user
com.gym.UserServiceImpl- UserServiceImpl destroy
com.gym.UserServiceImpl- UserServiceImpl destroyMethod
发表评论
-
mvc-HandlerMapping
2017-06-03 23:13 839HandlerMapping:定义了web请求映射和处 ... -
spring-transaction-basic
2016-12-26 19:18 408Spring的事务本身是基于AOP的 AOP代理自 ... -
spring-transaction-propagation
2016-11-25 21:00 849Spring 事务:是spring 通过 aop实现的一套 ... -
spring bean & id
2016-11-25 17:57 456首先澄清一个概念: 同名bean:多个bean ... -
spring 父子容器
2016-11-25 17:11 3647特殊说明: ContextLoaderListe ... -
spring-mvc-基础
2016-09-26 15:03 390核心入口功能定位: HttpServletBean:完成的是& ... -
spring-mvc 学习资料
2016-09-20 15:42 356http://docs.spring.io/spring-fr ... -
spring-aop-DefaultAdvisorAutoProxyCreator
2016-08-16 19:50 468ProxyFactory:手工编程实现AOP,编程式 添加ad ... -
spring-aop基本概念
2016-07-26 16:37 826AOP词汇: Joinpoint:在程序执行过程中某个特定的 ... -
spring-扩展点-BeanFactoryPostProcessor
2016-06-15 18:15 6008BeanFactoryPostProcessor:允许自定 ... -
spring-扩展点-namespacehandler(Spring自定义标签)
2016-05-27 11:31 2212在很多情况下,我们需要为系统提供可配置化支持,简单的做法可以直 ... -
spring 资源文件
2015-04-03 00:07 148【转载】 非原创 SpringMVC访问静态资源的三种方式 ... -
spring-master-slave-commondao
2014-07-19 14:32 2246互联网的web项目,都有个特点:请求的并发量高,其中请求最耗时 ... -
spring-jdbc-RoutingDataSource
2014-07-11 17:33 5458spring jdbc 提供了抽象类AbstractRouti ... -
spring-aop-ProxyFactoryBean 源码分析
2014-06-13 19:10 2033在阅读本篇之前,请先阅读http://wangxinchun. ... -
spring-aop-ProxyFactory 源码分析
2014-06-13 02:22 4778spring 提供的编程式aop实现,即通过 ProxyFac ... -
spring-aop-aspectj(Schema)-case
2014-05-31 15:50 1087基于Schema 配置切面: 1、切点定义的语言依然是Aspe ... -
spring-aop-aspectj-case
2014-05-31 14:51 1369AOP概念:面向切面编程。 spring 集成AOP: 1、 ... -
spring-rpc-case
2014-05-17 23:34 1095spring 提供了基本的基于http协议的rpc,同时提供了 ... -
spring-mvc-case
2014-05-10 23:50 1193spring mvc 是当前java比较流行的一种mvc架构, ...
相关推荐
Beans模块提供了Bean工厂,它是Spring管理对象的中心,而Context模块扩展了Bean工厂,提供了一种上下文模型,可以加载其他容器和资源。 2. **Data Access/Integration**(数据访问/集成):该模块涵盖了JDBC、ORM、...
最后,Spring的容器提供了多种扩展点,如BeanPostProcessor、BeanFactoryPostProcessor等,这使得开发者可以在容器初始化阶段自定义逻辑。在3.2.13.RELEASE中,我们可以探索这些扩展点的实现,以及如何利用它们增强...
1. 容器扩展:Spring 提供了 BeanPostProcessor 和 BeanFactoryPostProcessor 接口,允许用户自定义扩展点,实现更精细的控制。 2. Annotation-based Configuration:除了 XML 配置外,4.3.6 版本更加强调注解驱动的...
4. **IoC容器扩展点**:如BeanPostProcessor,了解如何扩展Spring以满足特定需求。 三、文档详解 Spring 2.5.6的官方文档是开发者的重要参考资料,它详细介绍了框架的各个组件和使用方法。通过阅读文档,可以掌握...
容器扩展点提供了自定义容器行为的能力,通过实现特定的接口或继承特定的类即可达到目的。比如,可以通过实现BeanPostProcessor来在bean的初始化前后执行自定义逻辑。 classpath扫描和托管组件功能允许通过简单的...
此外,Spring提供了多种扩展点,如 BeanPostProcessor 和 InstantiationAwareBeanPostProcessor,允许自定义处理Bean的创建和初始化过程。 在Spring框架中,"spring-beans"模块是所有其他模块的基石,它提供的IoC...
3. **AOP**:Spring的AOP模块支持面向切面编程,使得我们可以编写横切关注点,如日志、事务管理等。`org.springframework.aop`包包含了AOP的相关实现,如`AspectJ`的集成,`Pointcut`定义切点,`Advisor`定义通知,...
3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.1.1. 使用BeanPostProcessor的Hello World示例 3.7.1.2. RequiredAnnotationBeanPostProcessor示例 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7....
SpringBeans-3.0.2.RELEASE.jar还包含了一些关键接口,如BeanPostProcessor允许自定义Bean实例化后的处理逻辑,InitializingBean和DisposableBean分别用于标识初始化和销毁方法。同时,该版本的Spring支持AOP(面向...
这需要我们掌握AspectJ的元数据解析和Spring的`BeanDefinition`,以及`BeanPostProcessor`和`InstantiationAwareBeanPostProcessor`接口,这些都是Spring处理注解的核心组件。 其次,项目中可能涉及自定义注解的...
Java自定义注解和Spring的BeanPostProcessor是Java企业级开发中的两个重要概念,它们在构建灵活、可扩展的应用程序中发挥着关键作用。本文将深入探讨这两个话题,并结合源码分析,帮助开发者更好地理解和应用。 ...
《Spring框架核心源码解析》 Spring框架是Java开发...同时,了解源码也有助于我们更好地利用Spring的扩展点,定制化自己的解决方案。总之,掌握Spring源码对于任何希望成为资深Java开发者的程序员来说都是必经之路。
这个压缩包提供的"spring扩展点测试示例代码"是一个实例,帮助我们理解如何在实践中利用Spring的扩展点进行自定义功能的实现。 首先,Spring的核心设计理念之一就是“依赖注入”(Dependency Injection,DI),它...
根据提供的文档信息,我们可以深入探讨Spring框架的核心概念与特性,特别是版本1.2中的关键知识点。下面将基于文档中提到的各个章节进行详细解析。 ### 1. 引言 #### 1.1 概览 Spring框架是一个开源的Java平台,它...
综上所述,Spring框架通过其强大的依赖注入机制和丰富的扩展点,为Java开发者提供了一个灵活、高效、可扩展的开发平台。无论是构建简单的Web应用还是复杂的企业级系统,Spring都能提供强有力的支持。
通过以上知识点,我们可以看出Spring-Context在Spring框架中的重要地位,它不仅实现了Bean的管理,还提供了丰富的扩展性和灵活性,使得开发者能够构建复杂的企业级应用。了解并掌握Spring-Context的这些核心概念,...
其次,Spring 3.0.0对AOP(面向切面编程)进行了扩展,提供了更多的切面编程模型。AOP允许开发者将关注点分离,如日志记录、事务管理等,可以编写一次,然后在整个应用程序中统一应用。Spring的`@Aspect`注解定义了...
5. `InstantiationAwareBeanPostProcessor`:进一步扩展了 `BeanPostProcessor`,可以在 Bean 实例化之前和之后进行操作。 通过阅读 Spring 源码,我们可以更好地理解其内部机制,从而优化代码、调试问题,甚至开发...
Spring提供了BeanPostProcessor、InitializingBean、DisposableBean等生命周期接口,允许开发者在Bean初始化前后执行自定义的操作。 #### 5.2 更多的定制选项 Spring还提供了许多其他的定制选项,如环境感知、条件...
回到"bp-support-spring-context"项目,它可能是为Spring Context提供了一些扩展或增强功能,例如新的bean定义方式、额外的生命周期策略,或者更方便的集成方式。由于没有具体的代码细节,我们只能推测它可能包含...