CGlib动态代理范例

1、ProxyFactory.java

package com.ats.proxy;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class ProxyFactory implements MethodInterceptor{
	//private Object invoker;
	private List<Object> interceptors;
	
	private ProxyFactory(Object invoker,List<Object> interceptors)
	{
		//this.invoker = invoker;
		if(interceptors==null)
		{
			this.interceptors = new ArrayList<Object>();
		}
		else
		{
			this.interceptors = interceptors;
		}
	}
	
	 public static final Object newInstance(Object invoker,List<Object> interceptors)
	 {
		 Enhancer enhancer = new Enhancer();
		 enhancer.setSuperclass(invoker.getClass());
		 enhancer.setCallback(new ProxyFactory(invoker,interceptors));
		 return enhancer.create();
	 }
	
	@Override
	public Object intercept(Object invoker, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		
		Object result = null;
		
		for(Object o : interceptors)
		{
			if(o instanceof IProxyBefore)
			{
				((IProxyBefore)o).BeforeInvoke();
			}
		}
		
		try
		{
			result = proxy.invokeSuper(invoker, args);
		}
		catch(Exception ex)
		{
			for(Object o : interceptors)
			{
				if(o instanceof IProxyThrow)
				{
					((IProxyThrow)o).ThrowInvoke();
				}
			}
		}
		
		for(Object o : interceptors)
		{
			if(o instanceof IProxyAfter)
			{
				((IProxyAfter)o).AfterInvoke();
			}
		}
		
		return result;
	}
}

2、IProxyBefore.java

package com.ats.proxy;

public interface IProxyBefore {
	public void BeforeInvoke();
}

3、IProxyAfter.java

package com.ats.proxy;

public interface IProxyAfter {
	public void AfterInvoke();
}

4、IProxyAround.java

package com.ats.proxy;

public interface IProxyAround extends IProxyBefore,IProxyAfter{
}

5、IProxyThrow.java

[code lang="java"]
package com.ats.proxy;

public interface IProxyThrow {
	public void ThrowInvoke();
}

6、Car.java

package com.ats.test;

public class Car {
	public Car()
	{
		System.out.println("This is a new Car");
	}
}

7、CarFactoryBefore.java

package com.ats.test;

import com.ats.proxy.IProxyBefore;

public class CarFactoryBefore implements IProxyBefore{

	@Override
	public void BeforeInvoke() {
		System.out.println("CarFactoryBefore BeforeInvoke");
	}

}

8、CarFactoryAfter.java

package com.ats.test;

import com.ats.proxy.IProxyAfter;

public class CarFactoryAfter implements IProxyAfter {

	@Override
	public void AfterInvoke() {
		System.out.println("CarFactoryAfter AfterInvoke");
	}

}

9、CarFactoryAround.java

package com.ats.test;

import com.ats.proxy.IProxyAround;

public class CarFactoryAround implements IProxyAround{
	@Override
	public void AfterInvoke() {
		System.out.println("CarFactoryAround AfterInvoke");
	}
	
	@Override
	public void BeforeInvoke() {
		System.out.println("CarFactoryAround BeforeInvoke");
	}
}

10、CarFactoryThrow.java

package com.ats.test;

import com.ats.proxy.IProxyThrow;

public class CarFactoryThrow implements IProxyThrow {
	@Override
	public void ThrowInvoke() {
		System.out.println("CarFactory ThrowInvoke");
	}
}

11、ProxyFactory.java

package com.ats.test;

import java.util.ArrayList;
import java.util.List;

import com.ats.proxy.ProxyFactory;

public class CarFactory{
	public Car NewCar()
	{
		return new Car();
	}
	
	public static void main(String[] args)
	{
		CarFactory fac = new CarFactory();
		CarFactoryAfter after = new CarFactoryAfter();
		CarFactoryBefore before = new CarFactoryBefore();
		CarFactoryAround around = new CarFactoryAround();
		CarFactoryThrow _throw = new CarFactoryThrow();
		List<Object> l = new ArrayList<Object>();
		l.add(after);
		l.add(before);
		l.add(around);
		l.add(_throw);
		
		CarFactory fac1=(CarFactory)ProxyFactory.newInstance(fac, l);
		fac1.NewCar();
	}
}

JDK动态代理范例

1、ProxyFactory.java

package com.ats.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class ProxyFactory implements InvocationHandler{
	private Object invoker;
	private List<Object> interceptors;
	
	private ProxyFactory(Object invoker,List<Object> interceptors)
	{
		this.invoker = invoker;
		if(interceptors==null)
		{
			this.interceptors = new ArrayList<Object>();
		}
		else
		{
			this.interceptors = interceptors;
		}
	}
	
    public static final Object newInstance(Object invoker,List<Object> interceptors)
    {
        return java.lang.reflect.Proxy.newProxyInstance(invoker.getClass().getClassLoader(),
        		invoker.getClass().getInterfaces(), new ProxyFactory(invoker,interceptors));
    }
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;
		
		for(Object o : interceptors)
		{
			if(o instanceof IProxyBefore)
			{
				((IProxyBefore)o).BeforeInvoke();
			}
		}
		
		try
		{
			result = method.invoke(invoker, args);
		}
		catch(Exception ex)
		{
			for(Object o : interceptors)
			{
				if(o instanceof IProxyThrow)
				{
					((IProxyThrow)o).ThrowInvoke();
				}
			}
		}
		
		for(Object o : interceptors)
		{
			if(o instanceof IProxyAfter)
			{
				((IProxyAfter)o).AfterInvoke();
			}
		}
		return result;
	}
}

2、IProxyBefore.java

package com.ats.proxy;

public interface IProxyBefore {
	public void BeforeInvoke();
}

3、IProxyAfter.java

package com.ats.proxy;

public interface IProxyAfter {
	public void AfterInvoke();
}

4、IProxyAround.java

package com.ats.proxy;

public interface IProxyAround extends IProxyBefore,IProxyAfter{
}

5、IProxyThrow.java

package com.ats.proxy;

public interface IProxyThrow {
	public void ThrowInvoke();
}

6、ICarFactory.java

package com.ats.test;

public interface ICarFactory {
	public Car NewCar();
}

7、Car.java

package com.ats.test;

public class Car {
	public Car()
	{
		System.out.println("This is a new Car");
	}
}

8、IProxyBefore.java

package com.ats.test;

import com.ats.proxy.IProxyBefore;

public class CarFactoryBefore implements IProxyBefore{

	@Override
	public void BeforeInvoke() {
		System.out.println("CarFactoryBefore BeforeInvoke");
	}

}

9、CarFactoryAfter.java

package com.ats.test;

import com.ats.proxy.IProxyAfter;

public class CarFactoryAfter implements IProxyAfter {

	@Override
	public void AfterInvoke() {
		System.out.println("CarFactoryAfter AfterInvoke");
	}

}

10、CarFactoryAround .java

package com.ats.test;

import com.ats.proxy.IProxyAround;

public class CarFactoryAround implements IProxyAround{
	@Override
	public void AfterInvoke() {
		System.out.println("CarFactoryAround AfterInvoke");
	}
	
	@Override
	public void BeforeInvoke() {
		System.out.println("CarFactoryAround BeforeInvoke");
	}
}

11、CarFactoryThrow.java

package com.ats.test;

import com.ats.proxy.IProxyThrow;

public class CarFactoryThrow implements IProxyThrow {
	@Override
	public void ThrowInvoke() {
		System.out.println("CarFactory ThrowInvoke");
	}
}

12、CarFactory.java

package com.ats.test;

import java.util.ArrayList;
import java.util.List;

import com.ats.proxy.IProxyAround;
import com.ats.proxy.IProxyThrow;
import com.ats.proxy.ProxyFactory;

public class CarFactory implements ICarFactory {
	public Car NewCar()
	{
		return new Car();
	}
	
	public static void main(String[] args)
	{
		CarFactory fac = new CarFactory();
		CarFactoryAfter after = new CarFactoryAfter();
		CarFactoryBefore before = new CarFactoryBefore();
		CarFactoryAround around = new CarFactoryAround();
		CarFactoryThrow _throw = new CarFactoryThrow();
		List<Object> l = new ArrayList<Object>();
		l.add(after);
		l.add(before);
		l.add(around);
		l.add(_throw);
		
		ICarFactory factory = (ICarFactory)ProxyFactory.newInstance(fac,l);
		factory.NewCar();
	}
}

自定义Java注解Annotation

1、CopyRight.java

package com.ats.annotation;

public @interface CopyRight {
	String value();
}

2、UnitTest.java

package com.ats.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface UnitTest { }

3、Foo.java

package com.ats.test;

import com.ats.annotation.UnitTest;

public class Foo {
	@UnitTest
	public static void m1() {
	}

	@UnitTest
	public static void m2() {
		throw new RuntimeException("Crash");
	}

	@UnitTest
	public static void m3() {
	}

	public static void m4() {
	}
	
	public static void m5() {
		throw new RuntimeException("Crash");
	}
}

4、RunTests.java

package com.ats.test;

import java.lang.reflect.Method;

import com.ats.annotation.CopyRight;
import com.ats.annotation.UnitTest;

@CopyRight("2012 NEOHOPE")
public class RunTests {
	public static void main(String[] args) throws Exception {
		
		int passed = 0, failed = 0;
		
		for (Method m : Class.forName("com.ats.test.Foo").getMethods()) {
			if (m.isAnnotationPresent(UnitTest.class)) {
				try {
					m.invoke(null);
					passed++;
				} catch (Throwable ex) {
					System.out.printf("Test %s failed: %s %n", m, ex.getCause());
					failed++;
				}
			}
		}
		
		System.out.printf("Passed: %d, Failed %d%n", passed, failed);
	}
}

自定义JSP标签Taglib

1、AuthorTag.java

package com.ats.taglib;

import java.io.IOException;

import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

public class AuthorTag extends TagSupport{
	private static final long serialVersionUID = 1L;
	private String version="v1.0";

	@Override
	public int doStartTag(){
		JspWriter out=pageContext.getOut();
		try {
			out.print("<div>AuthorTag "+version+" by NEOHOPE</div>");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return EVAL_BODY_INCLUDE;
	}
	
	@Override
	public int doEndTag(){
		return EVAL_PAGE;
	}
	
	public String getVersion()
	{
		return version;
	}
	
	public void setVersion(String version)
	{
		this.version=version;
	}
}

2、IterateTag.java

package com.ats.taglib;

import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;

import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class IterateTag extends BodyTagSupport {
	private static final long serialVersionUID = 1L;

	private Iterator it;
	private String type;
	private String name;
	public void setCollection(Collection collection) {
		if (collection.size() > 0)
			it = collection.iterator();
	}
	
	public void setType(String type)
	{
		this.type=type;
	}
	
	public void setName(String name)
	{
		this.name=name;
	}

	@Override
	public int doStartTag() {
		
		JspWriter out=pageContext.getOut();
		try {
			out.print("<table>");
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		if (it == null)
			return SKIP_BODY;
		else
			return continueNext(it);
	}

	@Override
	public int doAfterBody() {
		return continueNext(it);
	}

	@Override
	public int doEndTag() {
		try {
			if (bodyContent != null)
				bodyContent.writeOut(bodyContent.getEnclosingWriter());
		} catch (Exception e) {
			System.out.println(e);
		}
		
		JspWriter out=pageContext.getOut();
		try {
			out.print("</table>");
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return EVAL_PAGE;
	}

	protected int continueNext(Iterator it) {
		if (it.hasNext()) {
			pageContext.setAttribute(name, "<tr><td>"+it.next()+"</td></tr>", pageContext.PAGE_SCOPE);
			return EVAL_BODY_TAG;
		} else {
			return SKIP_BODY;
		}
	}
}

3、IterateTagTEI.java

package com.ats.taglib;

import javax.servlet.jsp.tagext.TagData;
import javax.servlet.jsp.tagext.TagExtraInfo;
import javax.servlet.jsp.tagext.VariableInfo;

public class IterateTagTEI extends TagExtraInfo {
	public IterateTagTEI() {
		super();
	}

	@Override
	public VariableInfo[] getVariableInfo(TagData data) {
		return new VariableInfo[] { new VariableInfo(
				data.getAttributeString("name"),
				data.getAttributeString("type"), true, VariableInfo.NESTED) };
	}
}

4、LoopTag.java

package com.ats.taglib;

import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class LoopTag extends BodyTagSupport {
	private static final long serialVersionUID = 1L;

	private int total = 0;
	private int count = 0;

	@Override
	public int doStartTag() {
		try {
			if (total > 0)
				return EVAL_BODY_TAG;
			else
				return SKIP_BODY;
		} catch (Exception e) {
			e.printStackTrace();
			return SKIP_BODY;
		}
	}

	@Override
	public int doAfterBody() {
		try {
			if (total - count>1) {
				count++;
				return EVAL_BODY_TAG;
			} 
			else
			{
				count=0;
				return SKIP_BODY;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return SKIP_BODY;
		}
	}

	@Override
	public int doEndTag() {
		try {
			bodyContent.writeOut(bodyContent.getEnclosingWriter());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return EVAL_PAGE;
	}
	
	public void setTotal(int total)
	{
		this.total = total;
	}
	
	public int getTotal()
	{
		return total;
	}
}

5、Taglib.tld

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"&#93;
<taglib>
	<tlibversion>1.0</tlibversion>
	<jspversion>1.1</jspversion>
	<shortname>at</shortname>
	<tag>
		<name>AuthorTag</name>
		<tagclass>com.ats.taglib.AuthorTag</tagclass>
		<bodycontent>empty</bodycontent>

		<attribute>
			<name>version</name>
			<required>false</required>
		</attribute>
	</tag>
	<tag>
		<name>LoopTag</name>
		<tagclass>com.ats.taglib.LoopTag</tagclass>
		<bodycontent>jsp</bodycontent>
		<attribute>
			<name>total</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
	<tag>
		<name>IterateTag</name>
		<tagclass>com.ats.taglib.IterateTag</tagclass>
		<teiclass>com.ats.taglib.IterateTagTEI</teiclass>
		<bodycontent>jsp</bodycontent>
		<attribute>
			<name>collection</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>name</name>
			<required>true</required>
		</attribute>
		<attribute>
			<name>type</name>
			<required>true</required>
		</attribute>
	</tag>
</taglib>

6、web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"&#93;
  <display-name>TaglibTest</display-name>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <jsp-config>
    <taglib>
      <taglib-uri>
        http://www.ats.com/Taglib
      </taglib-uri>
      <taglib-location>
        /WEB-INF/tags/Taglib.tld
      </taglib-location>
	</taglib>
  </jsp-config>
</web-app>

7、index.jsp

<%@ taglib prefix="ats" uri="http://www.ats.com/Taglib" %>

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="java.util.Date"%> 
<%@ page import="java.util.ArrayList"%> 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>TaglibTest</title>
</head>

<body>
<ats:AuthorTag version="v1.01"/>
<ats:LoopTag total="3">
<div><%=new Date()%></div>
</ats:LoopTag>

<%
ArrayList<String> t=new ArrayList<String>();
t.add("A");
t.add("B");
t.add("C");
%>

<div>
<ats:IterateTag name="row" type="String" collection="<%=t%>">
<%=row%>
</ats:IterateTag>
</div>

</body>
</html>

Tomcat7安装为Windows Service

Tomcat7采用服务模式运行,主要靠两个EXE和一个BAT文件:
Tomcat7w.exe用于配置、监控服务
Tomcat7.exe用于服务的安装、卸载、更新、运行、停止等
service.bat提供了一些预设的脚本方便大家安装卸载服务

1、Tomcat7w.exe //XX//ServiceName

#服务配置界面
Tomcat7w //ES//ServiceName
#服务监控
Tomcat7w //MS//ServiceName

2、Tomcat7.exe //XX//ServiceName

#命令行运行服务
Tomcat7 //TS//ServiceName
#启动服务
Tomcat7 //RS//ServiceName
#关闭服务
Tomcat7 //SS//ServiceName
#更新服务参数
Tomcat7 //US//ServiceName
#安装服务
Tomcat7 //IS//ServiceName
#删除服务
Tomcat7 //DS//ServiceName

其他可用参数有:

ParameterName Default Description
–Description Service name description (maximum 1024 characters)
–DisplayName ServiceName Service display name
–Install procrun.exe //RS//ServiceName Install image
–Startup manual Service startup mode can be either auto or manual
++DependsOn List of services that this service depend on. Dependent services
are separated using either # or ; characters
++Environment List of environment variables that will be provided to the service
in the form key=value. They are separated using either
# or ; characters. If you need to use either the #
or ; character within a value then the entire value must be
enclosed inside single quotes.
–User User account used for running executable. It is used only for
StartMode java or exe and enables running applications
as service under account without LogonAsService privilege.
–Password Password for user account set by –User parameter
–JavaHome JAVA_HOME Set a different JAVA_HOME than defined by JAVA_HOME environment
variable
–Jvm auto Use either auto (i.e. find the JVM from the Windows registry)
or specify the full path to the jvm.dll.
You can use the environment variable expansion here.
++JvmOptions -Xrs List of options in the form of -D or -X that will be
passed to the JVM. The options are separated using either
# or ; characters. (Not used in exe mode.)
–Classpath Set the Java classpath. (Not used in exe mode.)
–JvmMs Initial memory pool size in MB. (Not used in exe mode.)
–JvmMx Maximum memory pool size in MB. (Not used in exe mode.)
–JvmSs Thread stack size in KB. (Not used in exe mode.)
–StartMode One of jvm, Java or exe. The modes are:

  • jvm – start Java in-process. Depends on jvm.dll, see –Jvm.
  • Java – same as exe, but automatically uses the default Java
    executable, i.e. %JAVA_HOME%\bin\java.exe. Make sure JAVA_HOME is set
    correctly, or use –JavaHome to provide the correct location.
    If neither is set, procrun will try to find the default JDK (not JRE)
    from the Windows registry.
  • exe – run the image as a separate process
–StartImage Executable that will be run. Only applies to exe mode.
–StartPath Working path for the start image executable.
–StartClass Main Class that contains the startup method. Applies to the jvm and
Java modes. (Not used in exe mode.)
–StartMethod main Method name if differs then main
++StartParams List of parameters that will be passed to either StartImage or
StartClass. Parameters are separated using either # or
; character.
–StopMode One of jvm, Java or exe. See –StartMode
for further details.
–StopImage Executable that will be run on Stop service signal. Only applies to
exe mode.
–StopPath Working path for the stop image executable. Does not apply to jvm
mode.
–StopClass Main Class that will be used on Stop service signal. Applies to the
jvm and Java modes.
–StopMethod main Method name if differs then main
++StopParams List of parameters that will be passed to either StopImage or
StopClass. Parameters are separated using either # or
; character.
–StopTimeout No Timeout Defines the timeout in seconds that procrun waits for service to
exit gracefully.
–LogPath %SystemRoot%\System32\LogFiles\Apache Defines the path for logging. Creates the directory if necessary.
–LogPrefix commons-daemon Defines the service log filename prefix. The log file is created in the
LogPath directory with .YEAR-MONTH-DAY.log suffix
–LogLevel Info Defines the logging level and can be either Error,
Info, Warn or Debug. (Case insensitive).
–StdOutput Redirected stdout filename.
If named auto then file is created inside LogPath with the
name service-stdout.YEAR-MONTH-DAY.log.
–StdError Redirected stderr filename.
If named auto then file is created inside LogPath with the
name service-stderr.YEAR-MONTH-DAY.log.
–PidFile Defines the file name for storing the running process id. Actual file is
created in the LogPath directory

3、service.bat安装卸载服务

service.bat install/uninstall/remove ServiceName

4、启动关闭服务

net start ServiceName
net stop ServiceName

CMD常用命令12切换网络

1、切换为DHCP

@netsh interface ip set address name="本地连接" source=dhcp

@netsh interface ip set dns name="本地连接" source=dhcp

2、切换为静态IP

@netsh interface ip set address name="本地连接" source=static addr=xxx.xxx.xxx.xxx mask=255.255.255.0 gateway=xxx.xxx.xxx.xxx

@netsh interface ip set dns name="本地连接" source=static addr=xxx.xxx.xxx.xxx

MuleESB3发布到Tomcat

今天把Mule ESB集成到Tomcat时,出现了下面的错误:

Already in lifecycle phase 'start', cannot fire the same phase twice

解决方法:
把MuleESB官方网站建议的:

<listener-class>org.mule.config.builders.MuleXmlBuilderContextListener</listener-class>

替换为:

<listener-class>org.mule.config.builders.DeployableMuleXmlContextListener</listener-class>

就可以了