【Spring】对象后期处理,BeanPostProcessor

当我们使用Spring容器管理对象时,需要对对象进行一些后期处理时,比如数据处理、数据预加载,可以使用BeanPostProcessor接口。

简单演示它的用法。

定义扫描包,显示定义BeanPostProcessor的实现类:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!-- scan the component from the base package -->
    <context:component-scan base-package="com.nicchagil.springapplication.No004BeanPostProcessor" />

    <bean id="myBeanPostProcessor" class="com.nicchagil.springapplication.No004BeanPostProcessor.MyBeanPostProcessor" />

</beans>

实现BeanPostProcessor:

package com.nicchagil.springapplication.No004BeanPostProcessor;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor {

    public Object postProcessBeforeInitialization(Object obj, String arg1)
            throws BeansException {
        if (obj != null) {
            System.out.println("postProcessBeforeInitialization : " + obj.getClass().getName());
        }

        if (obj instanceof UserService) {
            System.out.println("some operation in this point.");
        }

        return obj;
    }

    public Object postProcessAfterInitialization(Object obj, String arg1)
            throws BeansException {
        if (obj != null) {
            System.out.println("postProcessAfterInitialization : " + obj.getClass().getName());
        }

        if (obj instanceof UserService) {
            System.out.println("some operation in this point.");
        }

        return obj;
    }

}

被操作的bean:

package com.nicchagil.springapplication.No004BeanPostProcessor;

import org.springframework.stereotype.Service;

@Service
public class UserService {

    public void queryUser() {
        System.out.println("query user method.");
    }

}

用于测试的入口类:

package com.nicchagil.springapplication.No004BeanPostProcessor;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class HowToUse {

    public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring.xml");
        UserService us = context.getBean("userService", UserService.class);
        us.queryUser();
    }

}

日志:

七月 11, 2016 10:31:13 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org[email protected]427a39ea: startup date [Mon Jul 11 22:31:13 CST 2016]; root of context hierarchy
七月 11, 2016 10:31:13 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring.xml]
七月 11, 2016 10:31:13 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.s[email protected]6371be16: defining beans [userService,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,myBeanPostProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
postProcessBeforeInitialization : com.nicchagil.springapplication.No004BeanPostProcessor.UserService
some operation in this point.
postProcessAfterInitialization : com.nicchagil.springapplication.No004BeanPostProcessor.UserService
some operation in this point.
query user method.

时间: 2024-10-30 09:22:41

【Spring】对象后期处理,BeanPostProcessor的相关文章

Spring的IOC、Spring对象初始化bean时机、Spring容器生命周期

IOC指的是控制反转,把对象的创建.初始化.销毁等工作都交给Spring容器.由spring容器来控制对象的生命周期. Spring对象初始化bean时机: 在默认情况下,只要在Spring容器中配置了一个bean,容器在启动时就会实例化该bean,单例模式. 如果在Spring配制文件时设置懒加载模式(lazy-init="true"),在getBean时才会实例化对象. 如果scope="prototype"时,无论lazy-init的值是什么都只会在使用时才会

JSONP以及Spring对象MappingJacksonValue的使用方式

什么是JSONP?,以及Spring对象MappingJacksonValue的使用方式 原文: https://blog.csdn.net/weixin_38111957/article/details/81842460 一,引言 最近小编在写这样一套服务端的代码,说白了就是提供数据和处理一些业务逻辑.这个服务端是单独的一个工程,提供给PC端,移动端(IOS,Android)等多个终端进行调用.在调试过程中发现这样的一个异常,才了解到我们的JS请求是不能跨域请求的.为了考虑安全性的问题,JS只

spring探秘:通过BeanPostProcessor、@PostConstruct、InitializingBean在启动前执行方法

springboot启动前执行方法的3种方式:实现BeanPostProcessor接口.实现InitializingBean接口.使用@PostConstruct注解 示例: 第一种 实现BeanPostProcessor接口 @Configuration public class Test3 implements BeanPostProcessor { @Autowired private Environment environment; @Override public Object po

java多线程中注入Spring对象问题

web应用中java多线程并发处理业务时,容易抛出NullPointerException. 原因: 线程中的Spring Bean没有被注入.web容器在启动时,没有提前将线程中的bean注入,在线程启动之前,web容器是无法感知的. 解决方案: 方法一.在声明成员变量的时候,将其定义为static的.(据说不可行) 方法二.将线程设置为主程序的内部类. 在外部类中注入bean,这样在内部类线程中就可以“共享”这个对象. 方法三.定义一个工具类,使用静态工厂方法通过getBean获得bean对

quartz的job中注入spring对象!

一般情况下,quartz的job中使用autowired注解注入的对象为空,这时候我们就要使用spring-quartz提供的AdaptableJobFactory类. 自定义一个类: [java] view plain copy public class JobFactory extends AdaptableJobFactory { @Autowired private AutowireCapableBeanFactory capableBeanFactory; @Override prot

4.spring对象的创建(静态工厂 实例工厂 泛型,嵌套类型)

1.原料类 namespace CreateObjects{    public class GenericClass<T>    { }} PersonDao 类 包含嵌套类型 namespace CreateObjects{    public class PersonDao    {        public class Person         {            public override string ToString()            {         

spring 对象的单实例和多实例

(转载) 单例和多例的区别 : 单例多例需要搞明白这些问题:      1. 什么是单例多例:      2. 如何产生单例多例:      3. 为什么要用单例多例      4. 什么时候用单例,什么时候用多例:   1. 什么是单例.多例: 所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action; 单例模式和多例模式说明: 1. 单例模式和多例模式属于对象模式. 2. 单例模式的对象在整

spring对象scope属性

/** * 1) 对象创建: 单例/多例 * scope="singleton", 默认值, 即 默认是单例  [service/dao/工具类] *  scope="prototype", 多例:                 [Action对象] * * 2) 什么时候创建? *   scope="prototype"  在用到对象的时候,才创建对象. *    scope="singleton"  在启动(容器初始化之

Spring注解之BeanPostProcessor与InitializingBean

/*** BeanPostProcessor 为每个bean实例化时提供个性化的修改,做些包装等*/ package org.springframework.beans.factory.config; import org.springframework.beans.BeansException; public interface BeanPostProcessor { /** * 在bean实例化前调用*/ Object postProcessBeforeInitialization(Obje