📄 advisedsupport.java
字号:
* @see #addAdvice(org.aopalliance.aop.Advice)
* @see Advised#addBeforeAdvice
*/
public void addBeforeAdvice(MethodBeforeAdvice ba) throws AopConfigException {
addAdvisor(new DefaultPointcutAdvisor(Pointcut.TRUE, ba));
}
/**
* @deprecated in favor of addAdvice
* @see #addAdvice(org.aopalliance.aop.Advice)
* @see Advised#addThrowsAdvice
*/
public void addThrowsAdvice(ThrowsAdvice throwsAdvice) throws AopConfigException {
addAdvisor(new DefaultPointcutAdvisor(throwsAdvice));
}
/**
* Return the index (from 0) of the given AOP Alliance interceptor,
* or -1 if no such interceptor is an advice for this proxy.
* The return value of this method can be used to index into
* the Advisors array.
* @param interceptor AOP Alliance interceptor to search for
* @return index from 0 of this interceptor, or -1 if there's
* no such advice.
* @deprecated in favor of indexOf(Advice)
* @see #indexOf(org.aopalliance.aop.Advice)
*/
public int indexOf(Interceptor interceptor) {
// Invoke generic form of this method that's recommended
// post 1.0.3
return indexOf((Advice) interceptor);
}
/**
* Return the index (from 0) of the given AOP Alliance Advice,
* or -1 if no such advice is an advice for this proxy.
* The return value of this method can be used to index into
* the Advisors array.
* @param advice AOP Alliance advice to search for
* @return index from 0 of this advice, or -1 if there's
* no such advice.
*/
public int indexOf(Advice advice) {
for (int i = 0; i < this.advisors.size(); i++) {
Advisor advisor = (Advisor) this.advisors.get(i);
if (advisor.getAdvice() == advice) {
return i;
}
}
return -1;
}
/**
* Return the index (from 0) of the given advisor,
* or -1 if no such advisor applies to this proxy.
* The return value of this method can be used to index into
* the Advisors array.
* @param advisor advisor to search for
* @return index from 0 of this advisor, or -1 if there's
* no such advisor.
*/
public int indexOf(Advisor advisor) {
return this.advisors.indexOf(advisor);
}
public final boolean removeAdvisor(Advisor advisor) {
int index = indexOf(advisor);
if (index == -1) {
return false;
}
else {
removeAdvisor(index);
return true;
}
}
public void removeAdvisor(int index) throws AopConfigException {
if (isFrozen()) {
throw new AopConfigException("Cannot remove Advisor: config is frozen");
}
if (index < 0 || index > this.advisors.size() - 1) {
throw new AopConfigException("Advisor index " + index + " is out of bounds: " +
"Only have " + this.advisors.size() + " advisors");
}
Advisor advisor = (Advisor) this.advisors.get(index);
if (advisor instanceof IntroductionAdvisor) {
IntroductionAdvisor ia = (IntroductionAdvisor) advisor;
// we need to remove interfaces
for (int j = 0; j < ia.getInterfaces().length; j++) {
removeInterface(ia.getInterfaces()[j]);
}
}
this.advisors.remove(index);
updateAdvisorArray();
adviceChanged();
}
private void addAdvisorInternal(int pos, Advisor advice) throws AopConfigException {
if (isFrozen()) {
throw new AopConfigException("Cannot add advisor: config is frozen");
}
if (pos > this.advisors.size()) {
throw new IllegalArgumentException(
"Illegal position " + pos + " in advisor list with size " + this.advisors.size());
}
this.advisors.add(pos, advice);
updateAdvisorArray();
adviceChanged();
}
public void addAdvisor(int pos, IntroductionAdvisor advisor) throws AopConfigException {
advisor.validateInterfaces();
// if the advisor passed validation we can make the change
for (int i = 0; i < advisor.getInterfaces().length; i++) {
addInterface(advisor.getInterfaces()[i]);
}
addAdvisorInternal(pos, advisor);
}
public void addAdvisor(int pos, Advisor advisor) throws AopConfigException {
if (advisor instanceof IntroductionAdvisor) {
addAdvisor(pos, (IntroductionAdvisor) advisor);
}
else {
addAdvisorInternal(pos, advisor);
}
}
public void addAdvisor(Advisor advisor) {
int pos = this.advisors.size();
addAdvisor(pos, advisor);
}
/**
* Bring the array up to date with the list.
*/
private void updateAdvisorArray() {
this.advisorArray = (Advisor[]) this.advisors.toArray(new Advisor[this.advisors.size()]);
}
public final Advisor[] getAdvisors() {
return this.advisorArray;
}
/**
* Replace the given advisor.
* <p><b>NB:</b> If the advisor is an IntroductionAdvisor
* and the replacement is not or implements different interfaces,
* the proxy will need to be re-obtained or the old interfaces
* won't be supported and the new interface won't be implemented.
* @param a advisor to replace
* @param b advisor to replace it with
* @return whether it was replaced. If the advisor wasn't found in the
* list of advisors, this method returns false and does nothing.
*/
public final boolean replaceAdvisor(Advisor a, Advisor b) throws AopConfigException {
int index = indexOf(a);
if (index == -1 || b == null) {
return false;
}
removeAdvisor(index);
addAdvisor(index, b);
return true;
}
/**
* Is this interceptor included in any advisor?
* @param mi interceptor to check inclusion of
* @return whether this interceptor instance could be run in an invocation
* @deprecated in favor of adviceIncluded
* @see #adviceIncluded
*/
public final boolean interceptorIncluded(Interceptor mi) {
return adviceIncluded(mi);
}
/**
* Is this advice included in any advisor?
* @param advice advice to check inclusion of
* @return whether this advice instance could be run in an invocation
*/
public final boolean adviceIncluded(Advice advice) {
if (this.advisors.size() == 0) {
return false;
}
for (int i = 0; i < this.advisors.size(); i++) {
Advisor advisor = (Advisor) this.advisors.get(i);
if (advisor.getAdvice() == advice) {
return true;
}
}
return false;
}
/**
* Count interceptors of the given class.
* @param interceptorClass class of the interceptor to check
* @return the count of the interceptors of this class or subclasses
* @deprecated in favor of countAdvicesOfType
* @see #countAdvicesOfType
*/
public final int countInterceptorsOfType(Class interceptorClass) {
return countAdvicesOfType(interceptorClass);
}
/**
* Count advices of the given class
* @param interceptorClass class of the interceptor to check
* @return the count of the interceptors of this class or subclasses
*/
public final int countAdvicesOfType(Class interceptorClass) {
if (this.advisors.size() == 0) {
return 0;
}
int count = 0;
for (int i = 0; i < this.advisors.size(); i++) {
Advisor advisor = (Advisor) this.advisors.get(i);
if (interceptorClass.isAssignableFrom(advisor.getAdvice().getClass())) {
++count;
}
}
return count;
}
/**
* Invoked when advice has changed.
*/
private synchronized void adviceChanged() {
if (this.isActive) {
for (int i = 0; i < this.listeners.size(); i++) {
((AdvisedSupportListener) this.listeners.get(i)).adviceChanged(this);
}
}
}
private void activate() {
this.isActive = true;
for (int i = 0; i < this.listeners.size(); i++) {
((AdvisedSupportListener) this.listeners.get(i)).activated(this);
}
}
/**
* Subclasses should call this to get a new AOP proxy. They should <b>not</b>
* create an AOP proxy with this as an argument.
*/
protected synchronized AopProxy createAopProxy() {
if (!this.isActive) {
activate();
}
return getAopProxyFactory().createAopProxy(this);
}
/**
* Subclasses can call this to check whether any AOP proxies have been created yet.
*/
protected final boolean isActive() {
return isActive;
}
//---------------------------------------------------------------------
// Serialization support
//---------------------------------------------------------------------
/**
* Serialize a copy of the state of this class, ignoring
* subclass state.
*/
protected Object writeReplace() throws ObjectStreamException {
if (logger.isDebugEnabled()) {
logger.debug("Disconnecting " + this);
}
// Copy state to avoid dependencies
// on BeanFactories etc. that subclasses may have.
AdvisedSupport copy = this;
// If we're in a non-serializable subclass,
// copy into an AdvisedSupport object.
if (getClass() != AdvisedSupport.class) {
copy = new AdvisedSupport();
copy.copyConfigurationFrom(this);
}
// may return this
return copy;
}
/**
* Used to initialize transient state.
*/
protected Object readResolve() throws ObjectStreamException {
// initialize transient fields
this.logger = LogFactory.getLog(getClass());
this.isActive = true;
this.listeners = new LinkedList();
initDefaultAdvisorChainFactory();
return this;
}
public String toProxyConfigString() {
return toString();
}
/**
* For debugging/diagnostic use.
*/
public String toString() {
StringBuffer sb = new StringBuffer(getClass().getName() + ": ");
sb.append(this.interfaces.size()).append(" interfaces=[");
sb.append(AopUtils.interfacesString(interfaces));
sb.append("]; ");
sb.append(this.advisors.size()).append(" advisors=[");
sb.append(StringUtils.collectionToDelimitedString(this.advisors, ",", "{", "}")).append("]; ");
sb.append("targetSource=[").append(this.targetSource).append("]; ");
sb.append(super.toString());
sb.append("advisorChainFactory=").append(this.advisorChainFactory);
return sb.toString();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -