浅谈Spring中的aop(面向切面编程)中的spring动态代理技术(无接口)


一、AOP是什么?

AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善,当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义纵向抽取的关系,但并不适合定义横向抽取的关系。
而AOP技术则恰恰利用一种称为“横向抽取”的技术,可以提高代码的重用性,以及可扩展和可维护性。

1.AOP的基本概念

1)Aspect(切面):通常是一个类,里面可以定义切入点和通知。
2) JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用。
3)Advice(通知):AOP在特定的切入点上执行的增强处理
4) Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式.
5) AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类

二、如何使用AOP

spring动态代理实现(无接口)

1.先写一个类,类中有定义一个add方法

public class UserDaoImpl2 {
	public int add(int a, int b) {
		System.out.println("调用UserDaoImpl2的add方法");
		return a + b;

	}

}

2.定义一个springHk的目标对象

package proxy;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class SpringHk implements MethodInterceptor {

	// 目标对象
	private Object target;

	/*
	 * invocation : 目标对象的目标方法
	 */
	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		System.out.println("1.鉴权");
		// 调用目标方法
		Object result = invocation.proceed();
		System.out.println("1.日志留痕");
		return result;
	}

	public Object getTarget() {
		return target;
	}

	public void setTarget(Object target) {
		this.target = target;
	}

}

3.在spring-beans.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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
     <!--1.目标对象  --> 
       <bean id="userDao" class="dao.impl.UserDaoImpl2"></bean>
       <bean id="userDaoInter" class="dao.impl.UserDaoImpl"></bean>
      <!--2.黑客对象  -->
      <bean id="springHk" class="proxy.SpringHk"></bean> 
      
      <!--3.代理对象  -->
      <bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
      	<!--3.1目标对象  -->
      	<property  name="target" ref="userDao"></property>
      	<!-- 3.2 spring 黑客对象 -->
      	<property name="interceptorNames">
	       <array>
	           <value>springHk</value>
	       </array>
	   </property>
	  </bean>
</beans>

4.在test包中编写单元测试

package com.zyc.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import dao.impl.UserDaoImpl;
import dao.impl.UserDaoImpl2;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-beans.xml")
public class SpringHkTest {

	@Autowired
	@Qualifier("userDaoProxy")
	private UserDaoImpl2 userDaoImpl2;
	private UserDaoImpl userDaoImpl;

	@Test
	public void test01() {
		System.out.println(userDaoImpl2.add(3, 5));
	}

	@Test
	public void test02() {
		System.out.println(userDaoImpl.add(4, 5));
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值