---动态代理 jdk动态代理
jar文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Spring</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring03-aop</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--实现aop配置jar包-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
</dependencies>
</project>
--创建方法接口com.liuboss.proxy.jdk.TargetInterface
package com.liuboss.proxy.jdk;
public interface TargetInterface {
public void save();
}
---实现接口方法com.liuboss.proxy.jdk.Target
package com.liuboss.proxy.jdk;
public class Target implements TargetInterface{
public void save() {
System.out.println("TargetInterface...save running");
}
}
com.liuboss.proxy.jdk.Advice 创建前置对象和后置对象方法
package com.liuboss.proxy.jdk;
public class Advice {
public void before(){
System.out.println("before---前置增强");
}
public void after(){
System.out.println("after---后置增强");
}
}
---实现方法com.liuboss.proxy.jdk.ProxyText
package com.liuboss.proxy.jdk;
import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;
import java.lang.reflect.Method;
public class ProxyText {
public static void main(String[] args) {
//创建目标对象
final Target target = new Target();
//增强对象
final Advice advice = new Advice();
//返回值 就是动态生成的代理对象
TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
//调用代理对象的任何方法
public Object invoke(Object proxy, Method method, Object[] objects) throws Throwable {
Object invoke = method.invoke(target, objects);
advice.before();
advice.after();
return invoke;
}
}
);
proxy.save();
}
}
基于cglib 动态代理
--创建方法类com.liuboss.proxy.cglib.Target
package com.liuboss.proxy.cglib;
public class Target {
public void save() {
System.out.println("TargetInterface...save running");
}
}
--前置对象--后置对象方法
package com.liuboss.proxy.cglib;
public class Advice {
public void before(){
System.out.println("before---前置增强");
}
public void after(){
System.out.println("after---后置增强");
}
}
--测试类实现 动态代理com.liuboss.proxy.cglib.ProxyText
package com.liuboss.proxy.cglib;
import com.liuboss.proxy.jdk.TargetInterface;
import org.springframework.cglib.proxy.*;
import org.springframework.jndi.JndiObjectTargetSource;
import java.lang.reflect.Method;
public class ProxyText {
public static void main(String[] args) {
//创建目标对象
final Target target = new Target();
//增强对象
final Advice advice = new Advice();
//返回值 就是动态生成的代理对象 基于cglib
//1.创建增强器
Enhancer enhancer = new Enhancer();
//2.创建父类(目标)
enhancer.setSuperclass(Target.class);
//3.设置回掉
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
advice.before();
advice.after();
Object invoke = method.invoke(target,objects);
return invoke;
}
});
//4.创建代理对象
Target proxy = (Target) enhancer.create();
proxy.save();
}
}
---xml实现aop快速入门案例
创建接口com.liuboss.aop.TargetInterface
package com.liuboss.aop;
public interface TargetInterface {
public void save();
}
---前置后置方法 com.liuboss.aop.MyAspect
package com.liuboss.aop;
public class MyAspect {
public void before(){
System.out.println("前值增强");
}
public void after(){
System.out.println("后置增强");
}
}
--创建接口实现方法com.liuboss.aop.Target
package com.liuboss.aop;
public class Target implements TargetInterface {
public void save() {
System.out.println("TargetInterface...save running");
}
}
在spring配置文件中进行配置 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置目标对象-->
<bean id="target" class="com.liuboss.aop.Target"/>
<!--切面对象-->
<bean id="myAspect" class="com.liuboss.aop.MyAspect">
</bean>
<!--配置织入,告诉spring哪些方法需要那些增强-->
<aop:config>
<!--声明切面-->
<aop:aspect ref="myAspect">
<!--切面,切点+通知|-->
<aop:before method="before" pointcut="execution(public void com.liuboss.aop.Target.save())"/>
</aop:aspect>
</aop:config>
</beans>
---测试类中进行测试 测试采用juint方法测试 重点
package com.liuboss.demo;
import com.liuboss.aop.TargetInterface;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test {
@Autowired
private TargetInterface target;
@org.junit.Test
public void test1() {
target.save();
}
}
---增加后置方法执行配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置目标对象-->
<bean id="target" class="com.liuboss.aop.Target"/>
<!--切面对象-->
<bean id="myAspect" class="com.liuboss.aop.MyAspect">
</bean>
<!--配置织入,告诉spring哪些方法需要那些增强-->
<aop:config>
<!--声明切面-->
<aop:aspect ref="myAspect">
<!--切面,切点+通知|-->
<!--<aop:before method="before" pointcut="execution(public void com.liuboss.aop.Target.save())"/>-->
<aop:before method="before" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
<aop:after-returning method="after" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
</aop:aspect>
</aop:config>
</beans>
---增加环绕方法进行测试
com.liuboss.aop.MyAspect
package com.liuboss.aop;
import org.aspectj.lang.ProceedingJoinPoint;
public class MyAspect {
public void before(){
System.out.println("前值增强");
}
public void after(){
System.out.println("后置增强");
}
//ProceedingJoinPoint 正在执行的连接点-切点
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕前-增强");
//添加切点方法
Object proceed = pjp.proceed();
System.out.println("环绕后-增强");
return proceed;
}
}
xml配置环绕方法
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置目标对象-->
<bean id="target" class="com.liuboss.aop.Target"/>
<!--切面对象-->
<bean id="myAspect" class="com.liuboss.aop.MyAspect">
</bean>
<!--配置织入,告诉spring哪些方法需要那些增强-->
<aop:config>
<!--声明切面-->
<aop:aspect ref="myAspect">
<!--切面,切点+通知|-->
<!--<aop:before method="before" pointcut="execution(public void com.liuboss.aop.Target.save())"/>-->
<!--<aop:before method="before" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
<aop:after-returning method="after" pointcut="execution(* com.liuboss.aop.*.*(..))"/>-->
<aop:around method="around" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
</aop:aspect>
</aop:config>
</beans>
测试
package com.liuboss.demo;
import com.liuboss.aop.TargetInterface;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test {
@Autowired
private TargetInterface target;
@org.junit.Test
public void test1() {
target.save();
}
}
---
抛出异常增强
package com.liuboss.aop;
import org.aspectj.lang.ProceedingJoinPoint;
public class MyAspect {
public void before(){
System.out.println("前值增强");
}
public void after(){
System.out.println("后置增强");
}
//ProceedingJoinPoint 正在执行的连接点-切点
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕前-增强");
//添加切点方法
Object proceed = pjp.proceed();
System.out.println("环绕后-增强");
return proceed;
}
public void agterThrowing(){
System.out.println("抛出异常增强。。。。。。");
}
}
进行添加错误
package com.liuboss.aop;
public class Target implements TargetInterface {
public void save() {
int i=1/0;
System.out.println("TargetInterface...save running");
}
}
配置文件进行配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置目标对象-->
<bean id="target" class="com.liuboss.aop.Target"/>
<!--切面对象-->
<bean id="myAspect" class="com.liuboss.aop.MyAspect">
</bean>
<!--配置织入,告诉spring哪些方法需要那些增强-->
<aop:config>
<!--声明切面-->
<aop:aspect ref="myAspect">
<!--切面,切点+通知|-->
<!--<aop:before method="before" pointcut="execution(public void com.liuboss.aop.Target.save())"/>-->
<!--<aop:before method="before" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
<aop:after-returning method="after" pointcut="execution(* com.liuboss.aop.*.*(..))"/>-->
<aop:around method="around" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
<aop:after-throwing method="agterThrowing" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
</aop:aspect>
</aop:config>
</beans>
测试
47p