Spring之AOP编程
package cn.african.service;
public interface UserService {
public void addUser();
public void updateUser();
public void deleteUser();
}
package cn.african.service;
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("addUser...");
}
@Override
public void updateUser() {
System.out.println("updateUser...");
}
@Override
public void deleteUser() {
System.out.println("deleteUser...");
}
}
2. 切面类
package cn.african.aspect;
public class MyAspect {
public void before() {
System.out.println("before");
}
public void after() {
System.out.println("after");
}
}
3. 工厂类
package cn.african.factory;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.african.aspect.MyAspect;
import cn.african.service.UserService;
import cn.african.service.UserServiceImpl;
public class MyFactoryBean {
public static UserService createService() {
// 1. 目标对象
UserService userService = new UserServiceImpl();
// 2. 切面对象
MyAspect myAspect = new MyAspect();
// 3. 代理对象
UserService proxyService = (UserService) Proxy.newProxyInstance(
MyFactoryBean.class.getClassLoader(),
userService.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//前置通知
myAspect.before();
//执行目标类的方法
Object object = method.invoke(userService, args);
//后置通知
myAspect.after();
return object;
}
});
//4. 返回代理对象
return proxyService;
}
}
InvocationHandler h)
package cn.african.test;
import org.junit.Test;
import cn.african.factory.MyFactoryBean;
import cn.african.service.UserService;
public class TestJdkProxy {
@Test
public void testJdkProxy() {
UserService userService = MyFactoryBean.createService();
userService.addUser();
System.out.println("--------------");
userService.updateUser();
System.out.println("--------------");
userService.deleteUser();
}
}
package cn.african.service;
public class UserServiceImpl {
public void addUser() {
System.out.println("addUser...");
}
public void updateUser() {
System.out.println("updateUser...");
}
public void deleteUser() {
System.out.println("deleteUser...");
}
}
2. 切面类
package cn.african.aspect;
public class MyAspect {
public void before() {
System.out.println("before");
}
public void after() {
System.out.println("after");
}
}
package cn.african.factory;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import cn.african.aspect.MyAspect;
import cn.african.service.UserService;
import cn.african.service.UserServiceImpl;
public class CglibBeanFactory {
public static UserService createService() {
// 目标类
UserServiceImpl userService = new UserServiceImpl();
// 切面类
MyAspect myAspect = new MyAspect();
// 1. 核心类
Enhancer enhancer = new Enhancer();
// 2. 设置父类
enhancer.setSuperclass(UserServiceImpl.class);
// 3. 设置回调函数
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
throws Throwable {
myAspect.before();
Object object = method.invoke(userService, args);
myAspect.after();
return object;
}
});
// 4. 创建代理
UserServiceImpl proxyService = (UserServiceImpl) enhancer.create();
return proxyService;
}
}
package cn.african.test;
import org.junit.Test;
import cn.african.factory.CglibBeanFactory;
import cn.african.service.UserService;
public class TestCglibProxy {
@Test
public void demo01() {
UserService userService = CglibBeanFactory.createService();
userService.addUser();
System.out.println("--------------");
userService.updateUser();
System.out.println("--------------");
userService.deleteUser();
}
}
package org.aopalliance.aop;
/**
* Tag interface for Advice. Implementations can be any type
* of advice, such as Interceptors.
* @author Rod Johnson
* @version $Id: Advice.java,v 1.1 2004/03/19 17:02:16 johnsonr Exp $
*/
public interface Advice {}
try{
//1. 前置通知
//2. 执行目标方法
//3. 后置通知
}catch{
//4. 抛出异常通知
}
package cn.african.service;
public interface UserService {
void addUser();
void updateUser();
void deleteUser();
}
package cn.african.service;
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("addUser...");
}
@Override
public void updateUser() {
System.out.println("updateUser...");
}
@Override
public void deleteUser() {
System.out.println("deleteUser...");
}
}
package cn.african.aspect;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
// 前置通知
System.out.println("before");
// 手动执行目标方法,这是一个放行方法
Object object = invocation.proceed();
// 后置通知
System.out.println("after");
return object;
}
}
3. bean-aop.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<!-- 1. 目标类 -->
<bean id="userService" class="cn.african.service.UserServiceImpl"></bean>
<!-- 2. 切面类 -->
<bean id="myAspect" class="cn.african.aspect.MyAspect"></bean>
<!-- 3. 代理类 -->
<bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="interfaces" value="cn.african.service.UserService"></property>
<property name="target" ref="userService"></property>
<property name="interceptorNames" value="myAspect"></property>
<!-- <property name="optimize" value="true"></property> --> <!--如果声明optimize=true,无论是否有接口,都采用cglib代理-->
</bean>
</beans>
package cn.african.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.african.service.UserService;
public class TestAop {
@Test
public void demo01() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("beans-aop.xml");
UserService userService = context.getBean("proxyService", UserService.class);
userService.addUser();
System.out.println("----------------");
userService.updateUser();
System.out.println("----------------");
userService.deleteUser();
context.getClass().getMethod("close").invoke(context);
}
}
打印结果:

package cn.african.service;
public interface UserService {
public void addUser();
public void updateUser();
public void deleteUser();
}
package cn.african.service;
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("addUser...");
}
@Override
public void updateUser() {
System.out.println("updateUser...");
}
@Override
public void deleteUser() {
System.out.println("deleteUser...");
}
}
package cn.african.aspect;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
// 前置通知
System.out.println("before");
// 手动执行目标方法,这是一个放行方法
Object object = invocation.proceed();
// 后置通知
System.out.println("after");
return object;
}
}
3. beans-aop.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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- 1. 目标类 -->
<bean id="userService" class="cn.african.service.UserServiceImpl"></bean>
<!-- 2. 切面类 -->
<bean id="myAspect" class="cn.african.aspect.MyAspect"></bean>
<!-- 3. AOP配置 -->
<aop:config>
<aop:pointcut expression="execution(* cn.african.service.UserServiceImpl.*(..))" id="myPointcut"/>
<aop:advisor advice-ref="myAspect" pointcut-ref="myPointcut"/>
</aop:config>
</beans>
package cn.african.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.african.service.UserService;
public class TestAop {
@Test
public void demo01() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("beans-aop.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.addUser();
System.out.println("----------------");
userService.updateUser();
System.out.println("----------------");
userService.deleteUser();
context.getClass().getMethod("close").invoke(context);
}
}
打印结果:

Spring之AOP编程的更多相关文章
- Java基础-SSM之Spring的AOP编程
Java基础-SSM之Spring的AOP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Spring的本质说白了就是动态代理,接下来我们会体验AOP的用法.它是对OOP的 ...
- Spring框架--AOP编程
2 手动实现AOP编程 AOP 面向切面的编程, AOP可以实现"业务代码"与"关注点代码"分离 // 保存一个用户 public void add(User ...
- Spring的AOP编程
1.手动实现AOP编程(代理模式) AOP是面向切面的编程,主要功能就是实现"业务代码"和辅助业务代码的"关注点代码"分离.在一个方法中,出了核心的业务代码,其 ...
- Java进阶知识21 Spring的AOP编程
1.概述 Aop:(Aspect Oriented Programming)面向切面编程 功能: 让关注点代码与业务代码分离! 关注点:重复代码就叫做关注点:切面: 关注点形成的类, ...
- spring的aop编程(半自动、全自动)
1.spring的半自动代理(从spring中获取代理对象) (1)spring中的通知类型 spring中aop的通知类型有五种: 前置:在目标方法执行前实施加强 后置:在目标方法执行后实施加强 环 ...
- 【AOP】spring 的AOP编程报错:[Xlint:invalidAbsoluteTypeName]error
AOP来发过程中,报错如下: warning no match for this type name: net.shopxx.wx.institution.controller [Xlint:inva ...
- spring相关—AOP编程—切入点、连接点
1 切入点表达式 1.1 作用 通过表达式的方式定位一个或多个具体的连接点. 1.2 语法细节 ①切入点表达式的语法格式 execution([权限修饰符] [返回值类型] [简单类名/全类名] [方 ...
- Spring基础篇——Spring的AOP切面编程
一 基本理解 AOP,面向切面编程,作为Spring的核心思想之一,度娘上有太多的教程啊.解释啊,但博主还是要自己按照自己的思路和理解再来阐释一下.原因很简单,别人的思想终究是别人的,自己的理解才是 ...
- Aop编程--注解与xml的实现
一.注解方式 1.首先引入spring对于aop编程的jar支持包,spring框架没有的包请自行在网上下载. aopalliance-alpha1.jar aspectjrt.jar aspectj ...
随机推荐
- PDF加密无法做笔记
尝试打印PDF,若无法打印,可以利用PDFescape(http://www.pdfescape.com/) PDFescape是一个可以在线修改.做笔记的网站,但是在线使用有上传PDF大小限制(小于 ...
- jsp的两种跳转方式和区别
1.forward跳转: 服务器端跳转,地址栏不改变: 执行到跳转语句后马上无条件跳转,之后的代码不再执行(跳转之前一定要释放全部资源): request设置的属性在跳转后的页面仍可以使用: 使用&l ...
- Java中删除第一个集合中以某某开头的元素,删除第二个集合中以某某结尾的元素,并合并成一个集合
import java.util.ArrayList; import java.util.List; public class Test { public static void main(Strin ...
- Vue常用开源项目汇总
前言:Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还 ...
- 漫谈Java IO之基础篇
Java的网络编程如果不是专门搞服务器性能开发或者消息分发,几乎可能涉及不到.但是它却是面试找工作必问的一个知识点,涵盖的知识体系也非常广泛,从Java底层IO原理到操作系统内核组成,再到网络TCP. ...
- 数据库 --> MySQL存储引擎介绍
MySQL存储引擎介绍 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然 ...
- Orcle查询优化改写-----给查询结果排序
1.按照子串排序 2.translate
- Matlab绘图基础——绘制三维表面
%绘制三维表面 ------------------------------------- %1.绘制线框图:mesh:每一条曲线称为mesh line %首先利用meshgrid函数产生平面区域内的 ...
- curl 获取外网IP
#curl http://members.3322.org/dyndns/getip121.204.134.10
- 程序员的入门 简单的编程HelloWord
那么在上一章章节 http://www.cnblogs.com/Goraidh/p/8674329.html 我们简单的俩了解了一下什么是java和配置编写java的环境,本章呢我们学习如何编写一个简 ...