/*
 * Copyright 2002-2013 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.aop.framework;

import java.io.Serializable;

import org.springframework.aop.SpringProxy;

/**
 * Default {@link AopProxyFactory} implementation,
 * creating either a CGLIB proxy or a JDK dynamic proxy.
 *
 * <p>Creates a CGLIB proxy if one the following is true
 * for a given {@link AdvisedSupport} instance:
 * <ul>
 * <li>the "optimize" flag is set
 * <li>the "proxyTargetClass" flag is set
 * <li>no proxy interfaces have been specified
 * </ul>
 *
 * <p>Note that the CGLIB library classes have to be present on
 * the class path if an actual CGLIB proxy needs to be created.
 *
 * <p>In general, specify "proxyTargetClass" to enforce a CGLIB proxy,
 * or specify one or more interfaces to use a JDK dynamic proxy.
 *
 * @author Rod Johnson
 * @author Juergen Hoeller
 * @since 12.03.2004
 * @see AdvisedSupport#setOptimize
 * @see AdvisedSupport#setProxyTargetClass
 * @see AdvisedSupport#setInterfaces
 */
@SuppressWarnings("serial")
public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {

	@Override
	public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
		if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
			Class<?> targetClass = config.getTargetClass();
			if (targetClass == null) {
				throw new AopConfigException("TargetSource cannot determine target class: " +
						"Either an interface or a target is required for proxy creation.");
			}
			if (targetClass.isInterface()) {
				return new JdkDynamicAopProxy(config);
			}
			return new ObjenesisCglibAopProxy(config);
		}
		else {
			return new JdkDynamicAopProxy(config);
		}
	}

	/**
	 * Determine whether the supplied {@link AdvisedSupport} has only the
	 * {@link org.springframework.aop.SpringProxy} interface specified
	 * (or no proxy interfaces specified at all).
	 */
	private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {
		Class<?>[] interfaces = config.getProxiedInterfaces();
		return (interfaces.length == 0 || (interfaces.length == 1 && SpringProxy.class.equals(interfaces[0])));
	}
}

@@ -17,17 +17,17 @@
 2002-201
-3
+4
  the ori
@@ -788,19 +788,16 @@
 ntation,
-%0A *
  creatin
@@ -818,16 +818,19 @@
 IB proxy
+%0A *
  or a JD
@@ -905,19 +905,16 @@
  is true
-%0A *
  for a g
@@ -917,16 +917,19 @@
  a given
+%0A *
  %7B@link 
@@ -977,17 +977,23 @@
 the 
-%22
+%7B@code 
 optimize
 %22 fl
@@ -988,17 +988,17 @@
 optimize
-%22
+%7D
  flag is
@@ -1013,17 +1013,23 @@
 %3Cli%3Ethe 
-%22
+%7B@code 
 proxyTar
@@ -1036,17 +1036,17 @@
 getClass
-%22
+%7D
  flag is
@@ -1113,139 +1113,8 @@
 %0A *%0A
- * %3Cp%3ENote that the CGLIB library classes have to be present on%0A * the class path if an actual CGLIB proxy needs to be created.%0A *%0A
  * %3C
@@ -1135,17 +1135,23 @@
 specify 
-%22
+%7B@code 
 proxyTar
@@ -1158,17 +1158,17 @@
 getClass
-%22
+%7D
  to enfo

Update doc for DefaultAopProxyFactory re: CGLIB