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.aop.framework.autoproxy;
18:
19: import org.springframework.beans.factory.BeanNameAware;
20:
21: /**
22: * BeanPostProcessor implementation that creates AOP proxies based on all candidate
23: * Advisors in the current BeanFactory. This class is completely generic; it contains
24: * no special code to handle any particular aspects, such as pooling aspects.
25: *
26: * <p>It's possible to filter out advisors - for example, to use multiple post processors
27: * of this type in the same factory - by setting the <code>usePrefix</code> property
28: * to true, in which case only advisors beginning with the DefaultAdvisorAutoProxyCreator's
29: * bean name followed by a dot (like "aapc.") will be used. This default prefix can be
30: * changed from the bean name by setting the <code>advisorBeanNamePrefix</code> property.
31: * The separator (.) will also be used in this case.
32: *
33: * @author Rod Johnson
34: * @author Rob Harrop
35: */
36: public class DefaultAdvisorAutoProxyCreator extends
37: AbstractAdvisorAutoProxyCreator implements BeanNameAware {
38:
39: /** Separator between prefix and remainder of bean name */
40: public final static String SEPARATOR = ".";
41:
42: private boolean usePrefix;
43:
44: private String advisorBeanNamePrefix;
45:
46: /**
47: * Set whether to exclude advisors with a certain prefix
48: * in the bean name.
49: */
50: public void setUsePrefix(boolean usePrefix) {
51: this .usePrefix = usePrefix;
52: }
53:
54: /**
55: * Return whether to exclude advisors with a certain prefix
56: * in the bean name.
57: */
58: public boolean isUsePrefix() {
59: return this .usePrefix;
60: }
61:
62: /**
63: * Set the prefix for bean names that will cause them to be included for
64: * auto-proxying by this object. This prefix should be set to avoid circular
65: * references. Default value is the bean name of this object + a dot.
66: * @param advisorBeanNamePrefix the exclusion prefix
67: */
68: public void setAdvisorBeanNamePrefix(String advisorBeanNamePrefix) {
69: this .advisorBeanNamePrefix = advisorBeanNamePrefix;
70: }
71:
72: /**
73: * Return the prefix for bean names that will cause them to be included
74: * for auto-proxying by this object.
75: */
76: public String getAdvisorBeanNamePrefix() {
77: return this .advisorBeanNamePrefix;
78: }
79:
80: public void setBeanName(String name) {
81: // If no infrastructure bean name prefix has been set, override it.
82: if (this .advisorBeanNamePrefix == null) {
83: this .advisorBeanNamePrefix = name + SEPARATOR;
84: }
85: }
86:
87: /**
88: * Consider Advisor beans with the specified prefix as eligible, if activated.
89: * @see #setUsePrefix
90: * @see #setAdvisorBeanNamePrefix
91: */
92: protected boolean isEligibleAdvisorBean(String beanName) {
93: return (!isUsePrefix() || beanName
94: .startsWith(getAdvisorBeanNamePrefix()));
95: }
96:
97: }
|