01: /*
02: * Copyright 2002-2007 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.aop.support;
18:
19: import org.aopalliance.aop.Advice;
20:
21: import org.springframework.beans.factory.BeanFactory;
22: import org.springframework.beans.factory.BeanFactoryAware;
23: import org.springframework.util.Assert;
24:
25: /**
26: * Abstract BeanFactory-based PointcutAdvisor that allows for any Advice
27: * to be configured as reference to an Advice bean in a BeanFactory.
28: *
29: * <p>Specifying the name of an advice bean instead of the advice object itself
30: * (if running within a BeanFactory) increases loose coupling at initialization time,
31: * in order to not initialize the advice object until the pointcut actually matches.
32: *
33: * @author Juergen Hoeller
34: * @since 2.0.2
35: * @see #setAdviceBeanName
36: * @see DefaultBeanFactoryPointcutAdvisor
37: */
38: public abstract class AbstractBeanFactoryPointcutAdvisor extends
39: AbstractPointcutAdvisor implements BeanFactoryAware {
40:
41: private String adviceBeanName;
42:
43: private BeanFactory beanFactory;
44:
45: private Advice advice;
46:
47: private final Object adviceMonitor = new Object();
48:
49: /**
50: * Specify the name of the advice bean that this advisor should refer to.
51: * <p>An instance of the specified bean will be obtained on first access
52: * of this advisor's advice. This advisor will only ever obtain at most one
53: * single instance of the advice bean, caching the instance for the lifetime
54: * of the advisor.
55: * @see #getAdvice()
56: */
57: public void setAdviceBeanName(String adviceBeanName) {
58: this .adviceBeanName = adviceBeanName;
59: }
60:
61: /**
62: * Return the name of the advice bean that this advisor refers to, if any.
63: */
64: public String getAdviceBeanName() {
65: return this .adviceBeanName;
66: }
67:
68: public void setBeanFactory(BeanFactory beanFactory) {
69: this .beanFactory = beanFactory;
70: }
71:
72: public Advice getAdvice() {
73: synchronized (this .adviceMonitor) {
74: if (this .advice == null && this .adviceBeanName != null) {
75: Assert
76: .state(this .beanFactory != null,
77: "BeanFactory must be set to resolve 'adviceBeanName'");
78: this .advice = (Advice) this .beanFactory.getBean(
79: this .adviceBeanName, Advice.class);
80: }
81: return this .advice;
82: }
83: }
84:
85: public String toString() {
86: return getClass().getName() + ": advice bean '"
87: + getAdviceBeanName() + "'";
88: }
89:
90: }
|