01: /*
02: * Copyright 2002-2006 the original author or authors.
03: *
04: * Licensed under the Apache License, Version 2.0 (the "License");
05: * you may not use this file except in compliance with the License.
06: * You may obtain a copy of the License at
07: *
08: * http://www.apache.org/licenses/LICENSE-2.0
09: *
10: * Unless required by applicable law or agreed to in writing, software
11: * distributed under the License is distributed on an "AS IS" BASIS,
12: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13: * See the License for the specific language governing permissions and
14: * limitations under the License.
15: */
16:
17: package org.springframework.beans.factory.config;
18:
19: import org.springframework.beans.BeansException;
20:
21: /**
22: * Allows for custom modification of new bean instances, e.g.
23: * checking for marker interfaces or wrapping them with proxies.
24: *
25: * <p>Application contexts can auto-detect BeanPostProcessor beans in their
26: * bean definitions and apply them before any other beans get created.
27: * Plain bean factories allow for programmatic registration of post-processors.
28: *
29: * <p>Typically, post-processors that populate beans via marker interfaces
30: * or the like will implement postProcessBeforeInitialization, and post-processors
31: * that wrap beans with proxies will normally implement postProcessAfterInitialization.
32: *
33: * @author Juergen Hoeller
34: * @since 10.10.2003
35: * @see InstantiationAwareBeanPostProcessor
36: * @see DestructionAwareBeanPostProcessor
37: * @see ConfigurableBeanFactory#addBeanPostProcessor
38: * @see BeanFactoryPostProcessor
39: */
40: public interface BeanPostProcessor {
41:
42: /**
43: * Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean
44: * initialization callbacks (like InitializingBean's <code>afterPropertiesSet</code>
45: * or a custom init-method). The bean will already be populated with property values.
46: * The returned bean instance may be a wrapper around the original.
47: * @param bean the new bean instance
48: * @param beanName the name of the bean
49: * @return the bean instance to use, either the original or a wrapped one
50: * @throws org.springframework.beans.BeansException in case of errors
51: * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet
52: */
53: Object postProcessBeforeInitialization(Object bean, String beanName)
54: throws BeansException;
55:
56: /**
57: * Apply this BeanPostProcessor to the given new bean instance <i>after</i> any bean
58: * initialization callbacks (like InitializingBean's <code>afterPropertiesSet</code>
59: * or a custom init-method). The bean will already be populated with property values.
60: * The returned bean instance may be a wrapper around the original.
61: * <p>In case of a FactoryBean, this callback will be invoked for both the FactoryBean
62: * instance and the objects created by the FactoryBean (as of Spring 2.0). The
63: * post-processor can decide whether to apply to either the FactoryBean or created
64: * objects or both through corresponding <code>bean instanceof FactoryBean</code> checks.
65: * <p>This callback will also be invoked after a short-circuiting triggered by a
66: * {@link InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation} method,
67: * in contrast to all other BeanPostProcessor callbacks.
68: * @param bean the new bean instance
69: * @param beanName the name of the bean
70: * @return the bean instance to use, either the original or a wrapped one
71: * @throws org.springframework.beans.BeansException in case of errors
72: * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet
73: * @see org.springframework.beans.factory.FactoryBean
74: */
75: Object postProcessAfterInitialization(Object bean, String beanName)
76: throws BeansException;
77:
78: }
|