4.1AOP AOP Aspect-oriented programming AOP 來說 AOP 令 理 Cross-cutting concerns Aspect Weave 理 Spring AOP 來 AOP 念 4.1.1 理 AOP AOP 見 例 來 例 錄 Logging 錄 便 來 例 行 留 錄 import java.util.logging.*; public class HelloSpeaker { private Logger logger = Logger.getLogger(this.getClass().getName()); public void hello(string name) { // 行 留 錄 logger.log(level.info, "hello method starts..."); // System.out.println("Hello, " + name); // 行 留 錄 logger.log(level.info, "hello method ends..."); 1
HelloSpeaker 類 行 hello() 行 行 留 錄 行 錄 錄 行 切 Cross-cutting HelloSpeaker 類 HelloSpeaker 來說 錄 不 HelloSpeaker 邏 "Hello" HelloSpeaker 了 錄 錄 錄 度 Service 不 錄 了 例 理 更 了 不 若 不 錄 理 留 錄 理 Proxy 來 論兩 理 理 Static proxy 理 Dynamic proxy 理 理 理 理 理 錄 理 理 留 例 來說 IHello StaticProxyDemo IHello.java public interface IHello { 2
public void hello(string name); 邏 HelloSpeaker 類 IHello 例 StaticProxyDemo HelloSpeaker.java public class HelloSpeaker implements IHello { public void hello(string name) { System.out.println("Hello, " + name); HelloSpeaker 類 錄 錄 理 理 IHello 例 StaticProxyDemo HelloProxy.java import java.util.logging.*; public class HelloProxy implements IHello { private Logger logger = Logger.getLogger(this.getClass().getName()); private IHello helloobject; public HelloProxy(IHello helloobject) { this.helloobject = helloobject; public void hello(string name) { // 錄 log("hello method starts..."); 3
// 行 邏 helloobject.hello(name); // 錄 log("hello method ends..."); private void log(string msg) { logger.log(level.info, msg); HelloProxy 類 hello() 邏 錄 來 理 StaticProxyDemo ProxyDemo.java public class ProxyDemo { public static void main(string[] args) { HelloProxy proxy = new HelloProxy(new HelloSpeaker()); proxy.hello("justin"); 行 理 理 理 理 IHello 來 行 4.1 StaticProxyDemo 行 J031 4
理 HelloProxy 理 HelloSpeaker 來 行 hello() 錄 HelloSpeaker 不 錄 HelloSpeaker 來更 理 流 4.2 理 流 J032 理 例 理 類 理 行 理 理 理 了 理 理 理 JDK 1.3 了 理 API 類 不 理 理 理 Handler 理 類 java.lang.reflect.invocationhandler 例來 行說 例 LogHandler 類 DynamicProxyDemo LogHandler.java import java.util.logging.*; import java.lang.reflect.*; 5
public class LogHandler implements InvocationHandler { private Logger logger = Logger.getLogger(this.getClass().getName()); private Object delegate; public Object bind(object delegate) { this.delegate = delegate; return Proxy.newProxyInstance( delegate.getclass().getclassloader(), delegate.getclass().getinterfaces(), this); public Object invoke(object proxy, Method method, Object[] args) throws Throwable { Object result = null; try { log("method starts..." + method); result = method.invoke(delegate, args); logger.log(level.info, "method ends..." + method); catch (Exception e){ log(e.tostring()); return result; private void log(string message) { logger.log(level.info, message); 6
念 Proxy.newProxyInstance() 立 理 立 理 理 立 理 InvocationHandler invoke() invoke() 理 行參數 行 method.invoke() method.invoke() 錄 method.invoke() 行 理 理 例 DynamicProxyDemo IHello.java public interface IHello { public void hello(string name); 邏 HelloSpeaker 類 IHello 例 DynamicProxyDemo HelloSpeaker.java public class HelloSpeaker implements IHello { public void hello(string name) { System.out.println("Hello, " + name); 了 StaticProxyDemo IHello HelloSpeaker 來 了 例 來 LogHandler bind() 來 理 DynamicProxyDemo ProxyDemo.java public class ProxyDemo { 7
public static void main(string[] args) { LogHandler loghandler = new LogHandler(); IHello helloproxy = (IHello) loghandler.bind(new HelloSpeaker()); helloproxy.hello("justin"); 來 行 J033 4.3 DynamicProxyDemo 行 LogHandler 不 HelloSpeaker 不 錄 不 識 錄 AOP 例 AOP 例 HelloSpeaker 錄 Log HelloSpeaker AOP 來說 錄 切 Cross-cutting HelloSpeaker 行流 錄 AOP 切 切 Cross-cutting concern 理 錄 邏 來 例 HelloProxy LogHandler 切 Aspect AOP Aspect 錄 類 Cross-cutting concerns 不 Aspect 8
Aspect-oriented programming AOP Aspect 立 不 Aspect 離 不 行 良 AOP 來 AOP 來 留 更令 4.1.2AOP 念 AOP Aspect-Oriented Programming AOP 不 易理 理 例來 AOP 念 Cross-cutting concern DynamicProxyDemo 例 錄 切 Cross-cutting HelloSpeaker 流 類 錄 類 Security Transaction Service 見 理流 AOP Cross-cutting concerns 說 Cross-cutting concerns 例 來 流 9
J034 4.4 AOP 了 錄 Logging Security 若 Logging Security Cross-cutting Cross-cutting concerns 念 4.5 AOP J035 Cross-cutting concerns 若 流 例 若 錄 錄 Cross-cutting concerns 邏 邏 更 Aspect 落 Cross-cutting concerns 來 立 Aspect 例 DynamicProxyDemo 錄 10
LogHandler 類 LogHandler 類 AOP Aspect 例 AOP Aspect 流 立 來 Weave 不 離 不 例 DynamicProxyDemo HelloSpeaker 錄 不 來說 AOP 不 理 說 API 不 不 了 Advice Aspect Advice 錄 Advice 錄 DynamicProxyDemo LogHandler 類 Advice 例 Advice 了 Cross-cutting concerns 行 Joinpoint Aspect 行 流 Joinpoint 來說 Advice 行 兩 例 Pointcut Pointcut Aspect Joinpoint 說 Pointcut 說 了 Aspect Joinpoint Target Advice 例 DynamicProxyDemo HelloSpeaker LogHandler Advice Target 11
Introduction 類 Introduction 行 不 類 說 類 行 行 不 行 Proxy Expert One-on-One J2EE Development WIthout EJB Rod Johnson Juergen Hoeller AOP 略 Dynamic Proxies Dynamic Byte Code Generation Java Code Generation Use of a Custon Class Loader Language Extensions 理 理 例 理 Spring AOP 理來 Weave Advice Weave AOP Compile time 類 Classload time 行 Runtime DynamicProxyDemo 例 AOP 來 理 識 4.6 AOP J036 12