spring 手工实现AOP编程

AOP概述:

AOP,aspect object programming 面向切面编程

功能:让关注点代码与业务代码分离!

关注点:重复代码就叫做关注点.

切面:关注点形成的类,就叫做切面(类)! 面向切面编程,就是指 对很过功能都有的重复性代码抽取,再在运行的时候往业务方法上动态的植入"切面类代码"

切入点:执行目标对象方法,动态植入切面代码. 可以通过切入点表达式,指定拦截那些类的方法,给指定的类在运行的时候植入切面类代码。

手工方式实现AOP编程(这里我们采用动态代理的方式,并且使用注解的方式把对象添加到容器中)

1)接口类IUserDao

<span style="font-family:Courier New;font-size:14px;">public interface IUserDao {
	public void save();
}</span>

2)UserDao实现IUserDao--->动态代理的方式 目标对象必须实现接口

<span style="font-family:Courier New;font-size:14px;">import org.springframework.stereotype.Component;
//这是目标对象
@Component //注解方式 把UserDao添加到IOC容器
public class UserDao implements IUserDao{
	public void save() {
		System.out.println("用户保存了数据!");
	}
}</span>

3)AOP类 这是一个切面类

<span style="font-size:14px;"><span style="font-family:Courier New;">package cn.itcast.myaop_proxy;

import org.springframework.stereotype.Component;

@Component
public class Aop {
	public void begin(){
		System.out.println("开启事务----");
	}
	public void end(){
		System.out.println("提交事务----");
	}
}
</span></span>

4)代理类工厂UserDaoProxyFactory

<span style="font-family:Courier New;font-size:14px;">package cn.itcast.myaop_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;
//这里的放入到IOC容器的是userDaoProxyFactory 不是返回的代理对象 如果所使用注解的方式返回的是UserDaoProxyFactory这个对象
public class UserDaoProxyFactory {
	public static Object target;
	public static Aop aop;
	public static Object getInstanceProxy(Object target_,Aop aop_){
		target=target_;
		aop=aop_;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(),
				new InvocationHandler() {
					public Object invoke(Object proxy, Method method,
							Object[] args) throws Throwable {
						aop.begin();
						Object objValue=method.invoke(target, args);
						aop.end();
						return objValue;//这里返回的是代理对象
					}
				});
	}
}</span>

5)bean.xml配置文件

<span style="font-size:14px;"><span style="font-family:Courier New;"><?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: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">
        <!-- 开启扫描机制 -->
        <context:component-scan base-package="cn.itcast.myaop_proxy"></context:component-scan>
        <!-- 调用工厂方法,返回UserDao代理后的对象 -->
		<bean id="userDaoProxyFactory" class="cn.itcast.myaop_proxy.UserDaoProxyFactory" factory-method="getInstanceProxy">
			<constructor-arg index="0" ref="userDao"></constructor-arg> <!- 给静态方法添加参数->
			<constructor-arg index="1" ref="aop"></constructor-arg>  </span></span><span style="font-family: 'Courier New';font-size:14px;"><!- 给静态方法添加参数-></span><pre name="code" class="html" style="font-family: 'Courier New';font-size:14px;"> 

</bean></beans>


6)测试类App

<span style="font-family:Courier New;font-size:14px;">import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
	ApplicationContext ac=new ClassPathXmlApplicationContext("cn/itcast/myaop_proxy/bean.xml");
	@Test
	public void test(){
		IUserDao userDao= (IUserDao) ac.getBean("userDaoProxyFactory");//返回的是代理类对象
		System.out.println(userDao.getClass());
		userDao.save();

	}
}</span>

运行测试:

在本次编写程序遇到的问题:下面的配置是错误的!!!!!!!

对于代理工厂类的编写:我采用了注解的方式...

这里的放入到IOC容器的是userDaoProxyFactory,而不是返回的代理对象.

如果使用注解的方式返回的是UserDaoProxyFactory这个对象,而我们需要的是UserDao这个对象是UserDaoProxyFactory

<span style="font-family:Courier New;font-size:14px;">package cn.itcast.myaop_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;
@Component//这里的放入到IOC容器的是userDaoProxyFactory 不是返回的代理对象 如果所使用注解的方式返回的是UserDaoProxyFactory这个对象
public class DaoProxyFactory1 {
	@Resource
	public  Object target;
	@Resource
	public  Aop aop;
	public  Object getInstanceProxy(){
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(),
				new InvocationHandler() {
					public Object invoke(Object proxy, Method method,
							Object[] args) throws Throwable {
						aop.begin();
						Object objValue=method.invoke(target, args);
						aop.end();
						return objValue;//这里返回的是代理对象
					}
				});
	}
}</span>

bean.xml的配置:直接开启扫描机制即可 因为对象都放入到了容器..这种想法是错误的,我们需要的是代理对象不是工厂类本身

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-08 20:26:04

spring 手工实现AOP编程的相关文章

Spring Boot学习——AOP编程的简单实现

首先应该明白一点,AOP是一种编程范式,是一种程序设计思想,与具体的计算机编程语言无关,所以不止是Java,像.Net等其他编程语言也有AOP的实现方式.AOP的思想理念就是将通用逻辑从业务逻辑中分离出来. 本文将通过一个HTTP请求的例子简单的讲解Spring Boot中AOP的应用,步骤如下: 第一步,添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr

Java——面向切面编程,Spring中的AOP编程

面向切面编程 AOP思想:将横向重复代码,纵向抽取出来 AOP体现--Filter AOP体现--拦截器 AOP体现--动态代理 Spring中实现AOP思想 原理:Spring可以为容器中管理的对象生成代理对象 代理分为动态代理和cglib代理: 动态代理(优先) 被代理对象必须要实现接口,才能产生代理对象,如果没有接口将不能使用动态代理技术,换句话说,就是代理对象和被代理要实现同一接口 cglib代理 第三方代理技术,cglib代理,可以对任何类生成代理,代理的原理是对目标对象进行继承代理,

Spring学习笔记----AOP编程

先用代码讲一下什么是传统的AOP(面向切面编程)编程 需求:实现一个简单的计算器,在每一步的运算前添加日志.最传统的方式如下: Calculator.java package cn.limbo.spring.aop.calculator; /** * Created by Limbo on 16/7/14. */ public interface Calculator { int add(int i , int j); int sub(int i , int j); int mul(int i

spring之AspectJ AOP编程

一.引言: AspectJ框架不仅实现了面向切面编程,而且还支持注解,spring将它引入自己的规范之中. 二.需要了解: AspectJ是基于java语言的AOP框架 spring2.0之后支持AspectJ切入点表达式 描述切点使用切入点表达式 三.通知的类型(重点) 原文地址:https://www.cnblogs.com/pecool/p/8275888.html

JavaEE开发之Spring中的依赖注入与AOP编程

一.快速创建Mava管理的Spring工程 因为本篇博客是讨论关于Spring的东西,所以我们就不创建WebApp的工程了.我们使用Spring来快速的创建一个Maven管理的工程.如下所示找到File->New->Maven Project选项来创建一个新的Maven Project,具体如下所示: 下方我们选择创建一个简单的Maven工程,跳过模板的选择.上篇博客我们在创建Maven工程时,是没有选择下方这个选项的,然后我们选择了一个WebApp的模板.而本篇博客,我们不需要WebApp的

使用Spring进行面向切面编程(AOP)

转载于http://www.blogjava.net/supercrsky/articles/174368.html 文章太长,写的很好,没看完,转过来慢慢理解,品味 简介 面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足. 除了类(classes)以外,AOP提供了 切面.切面对关注点进行模块化,例如横切多个类型和对象的事务管理. (这些关注点术语通常称作 横切(crosscutting) 关注点.) Spring的一个关键的组件就是 AOP

使用spring方式来实现aop编程

1:什么是aop? Aspect Oriented Programming 面向切面编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 面向对

深入分析JavaWeb Item54 -- Spring中的AOP面向切面编程2

一.在Advice方法中获取目标方法的参数 1.获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPoint里包含了如下几个常用的方法: Object[] getArgs:返回目标方法的参数 Signature getSignature:返回目标方法的签名 Object getTarget:返回被织入增强处理的目标对象 Object getThis:返

Spring之面向切面编程AOP(二)

简介 当积累的知识点到一定量的时候,学新知识就变得容易多了.希望再接下来的学习顺利进行下去.今天知识也是挺简单的,主要就是AOP面向切面编程.其中牵涉到了JDKProxy和CGLIB两个代理类,如何使用好,加以深刻理解.学起Spring切面编程也就简单多了 代理模式 1. 代理模式介绍 代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对