`
直直走
  • 浏览: 31609 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring原理自我实践之AOP的实现原理

阅读更多
AOP的简单描述:
      面向切面的编程,针对系统中与核心业务关系不是那么紧密的功能。 诸如事务、安全验证、日志等,通过一种机制,将他们分离, 这样能够减弱代码的耦合 ,使逻辑可以清晰分离
        实现的方式有三种:
       1.编译期间,由java文件生成class文件过程中加入
       2.类加载器,由class文件加载到内存过程中加入
       3.动态代理和cglib
主要的源码:
package com.erong.spring.aop.myaop;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;

 
public class Main {

	/**实例说明:
	 * 通过AOP对模拟系统的注册和登录生成日志打印在控制台
	 * 每次调用到creat()和login()都会生成日志
	 * 在代码中没有任何的日志代码
	 * @param args
	 */
	public static void main(String[] args) {

		UserDao userDao = new UserDao();
		UserServiceImpl target = new UserServiceImpl();//创建要拦截的对象
		target.setUserDao(userDao);

		MethodBeforeAdvice log = new MethodBeforeAdvice() {
			public void before(Method m, Object[] args, Object target)
					throws Throwable {
				System.out.println("调用方法: " + m.getName());
			}
		};
		
		 

		// UserService userService =
		// (UserService)AopProxyFactory.createProxy(target, log);
	 	ProxyFactory factory = new ProxyFactory(target);
	 	factory.addAdvice(log);
		UserService userService = (UserService) factory.getProxy();
		userService.create("aop", "mypassword");
	 
		userService.login("aop", "mypassword");
        userService.getAllUser();
	//	userDao.print();
	}
}

模拟的底层DAO

package com.erong.spring.aop.myaop;

import java.util.*;

/**
 * 模拟底层DAO
 * 
 * @author citizen
 * 
 */
public class UserDao {

	private Map<String, String> map = new HashMap<String, String>();

	public UserDao() {
		map.put("admin", "security");
		map.put("test", "123456");
	}

	public Map<String, String> getUserMap() {
		System.out.println("用户名列表:");
		Set<String> keySet = map.keySet();
		for (String key : keySet) {
			System.out.println(key + " " + map.get(key));
		}
		return this.map;
	}

	/**
	 * 模拟创建用户
	 * 
	 * @param username
	 * @param password
	 */
	public void create(String username, String password) {
		if (map.get(username) != null)
			throw new RuntimeException("添加失败,用户已存在User exist!");
		map.put(username, password);
	}

	/**
	 * 模拟登录
	 * 
	 * @param username
	 * @param password
	 */
	public void login(String username, String password) {
		String pw = map.get(username);
		if (pw == null || !pw.equals(password))
			throw new RuntimeException("登录失败 Login failed.");
	}

	/**
	 * 打印出目前已有的用户信息
	 */
	public void print() {
		System.out.println("用户名列表:");
		Set<String> keySet = map.keySet();
		for (String key : keySet) {
			System.out.println(key + " " + map.get(key));
		}
	}
}

定义的服务接口:

package com.erong.spring.aop.myaop;

import java.util.Map;

/**服务接口
 * @author citizen
 *
 */
public interface UserService {

    void create(String username, String password);

    void login(String username, String password);
    
    Map<String , String> getAllUser();
}

实现服务接口的实现类:
package com.erong.spring.aop.myaop;

import java.util.Map;

/**服务实现类
 * @author citizen
 *
 */
public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void create(String username, String password) {
        userDao.create(username, password);
    }

    public void login(String username, String password) {
        userDao.login(username, password);
    }

	@Override
	public Map<String, String> getAllUser() {
		// TODO Auto-generated method stub
		return userDao.getUserMap();
	}

}


模拟客户端:

 
package com.erong.spring.aop.myaop;

import java.util.*;

/**
 * 模拟底层DAO
 * 
 * @author citizen
 * 
 */
public class UserDao {

	private Map<String, String> map = new HashMap<String, String>();

	public UserDao() {
		map.put("admin", "security");
		map.put("test", "123456");
	}

	public Map<String, String> getUserMap() {
		System.out.println("用户名列表:");
		Set<String> keySet = map.keySet();
		for (String key : keySet) {
			System.out.println(key + " " + map.get(key));
		}
		return this.map;
	}

	/**
	 * 模拟创建用户
	 * 
	 * @param username
	 * @param password
	 */
	public void create(String username, String password) {
		if (map.get(username) != null)
			throw new RuntimeException("添加失败,用户已存在User exist!");
		map.put(username, password);
	}

	/**
	 * 模拟登录
	 * 
	 * @param username
	 * @param password
	 */
	public void login(String username, String password) {
		String pw = map.get(username);
		if (pw == null || !pw.equals(password))
			throw new RuntimeException("登录失败 Login failed.");
	}

	/**
	 * 打印出目前已有的用户信息
	 */
	public void print() {
		System.out.println("用户名列表:");
		Set<String> keySet = map.keySet();
		for (String key : keySet) {
			System.out.println(key + " " + map.get(key));
		}
	}
}



AOP的代理工厂:

package com.erong.spring.aop.myaop;

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

import org.springframework.aop.MethodBeforeAdvice;

/**AOP代理工厂
 * @author citizen
 *
 */
public class AopProxyFactory {

    /**创建代理
     * @param target
     * @param methodBeforeAdvice
     * @return
     */
    public static Object createProxy(final Object target, final MethodBeforeAdvice methodBeforeAdvice) {
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {//匿名内部类
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        methodBeforeAdvice.before(method, args, target);
                        return method.invoke(target, args);
                    }
                });
    }
}
分享到:
评论
4 楼 gyht0808 2009-10-13  
skcmm 写道
   是呀·, 有点迷惑,似懂非懂的样子·
   看了点资料  就赶鸭子上架 没办法 现在压力大呀

如果你只是写一半的WEB开发,不懂aop也不是很重要,但是如果你想深造,以后还是需要学习的
3 楼 skcmm 2009-08-24  
   是呀·, 有点迷惑,似懂非懂的样子·
   看了点资料  就赶鸭子上架 没办法 现在压力大呀
2 楼 直直走 2009-08-21  
skcmm 写道
AOP 到底是个什么? 还没搞清楚
  struts2+sprping+hibernate 集成时候,为何action类个不用继承接口

莫非连AOP都没弄清楚,你都开始SSH集成了?
1 楼 skcmm 2009-08-21  
AOP 到底是个什么? 还没搞清楚
  struts2+sprping+hibernate 集成时候,为何action类个不用继承接口

相关推荐

    Spring源码解析

    Spring AOP通过代理模式实现了这一特性,提供包括注解式和XML配置在内的多种实现方式。在源码中,ProxyFactoryBean和AspectJAutoProxyCreator是关键的类,它们分别对应于基于代理的AOP实现和基于AspectJ的AOP实现。 ...

    Spring认证考试流程

    2. AOP(8%):涉及面向切面编程的原理和实践,如何使用AspectJ和Spring AOP实现切面。 3. JDBC(4%):测试考生对数据库连接和操作的能力,包括事务管理和JDBC API的使用。 4. 事务(8%):涵盖了事务管理的策略,...

    Spring Shiro学习系统 v1.4.0.zip

    5. **计算机案例**:对于教学或自我提升,这个案例提供了实践操作的机会。你可以模拟不同的用户场景,测试权限控制的边界情况,从而深入理解Spring和Shiro的工作机制。 6. **学习路径**:首先,应了解Spring的基本...

    Spring 3.x 企业应用开发实战光盘源码1-19章

    - **Chapter 5**:可能深入到AOP的原理和使用,以及如何在Spring中实现切面。 - **Chapter 6**:可能涵盖Spring的事务管理,包括编程式和声明式事务处理。 - **Chapter 7**:可能讨论Spring与数据访问层的集成,...

    官方原版源码spring-framework-4.3.23.RELEASE.zip

    1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一,允许我们在不直接创建对象的情况下控制对象间的依赖关系。DI通过XML配置或注解实现,使得代码更加灵活和可测试。 2. **AOP(Aspect-Oriented ...

    spring-framework-3.0.5.-source

    本文将深入探讨Spring Framework 3.0.5的源代码,揭示其背后的实现原理,帮助开发者更好地理解和使用这个强大的工具。 一、Spring框架概述 Spring框架是一个开源的应用程序框架,主要目标是简化Java企业级应用的...

    Spring Recipes: A Problem-Solution Approach

    在书中,作者首先介绍了Spring的基本概念,包括IoC容器、Bean的定义和管理,以及AOP原理。然后,逐步深入到数据访问层,讲解了如何集成和使用JDBC、Hibernate、MyBatis等持久化技术。接着,书中详细讨论了Spring MVC...

    springframework.zip

    在4.2版本中,AOP代理机制、通知类型以及切面的实现细节都有所改进,源码分析能帮助我们理解其内在原理。 3. **数据访问集成**:Spring对多种数据库访问技术提供了支持,包括JDBC、ORM(Hibernate、MyBatis等)。...

    spring-framework-4.0.2.RELEASE 源码

    《深入剖析Spring Framework 4.0.2.RELEASE...通过深入研究每个模块的源代码,我们可以发现设计模式的应用、最佳实践以及Spring如何处理复杂的系统问题。这是一次宝贵的自我提升机会,也是成为Spring专家的必经之路。

    struct+spring+hibernate依赖包大全

    例如,Spring可以用来配置事务管理,提供数据源,甚至使用Spring的AOP来处理异常和日志。在SSH集成项目中,开发者需要配置相关的Spring配置文件,定义数据源、SessionFactory、Action beans等。 5. **依赖管理**: ...

    springPPT

    3. "AOP原理.ppt":讲解AOP的基本概念,包括切点、通知、代理等,以及如何在Spring中实现AOP。 4. "Spring MVC.ppt":解释MVC模式在Spring中的应用,包括DispatcherServlet、ModelAndView、视图解析等。 5. "Spring ...

    【16】第2版:​大厂.rar

    - 分布式技术:Dubbo的原理和实践、消息队列的使用场景和实现机制、分布式缓存(如Redis)。 - 数据库:SQL优化、事务、索引、NoSQL数据库等。 - 网络协议:HTTP、TCP/IP、Socket编程。 - 架构设计:微服务设计原则...

    2022年求职计算机专业自我介绍.docx

    - 精通Spring框架实现IoC和AOP开发。 - 熟悉单元测试、自动化测试、持续集成等保证代码质量的方法,以及相应的测试工具如JUnit、JMock、Selenium。 5. **项目管理和团队协作**: - 具备项目管理经验,管理过跨...

    java全栈面试题,spring、redis、java基础、web基础等

    Java全栈面试题涵盖的内容广泛,包括...准备过程中,不仅要理解和记忆知识点,还要通过实践加深理解,例如编写代码示例、模拟面试场景进行自我测试等,这将有助于你在实际面试中更好地展示自己的技能和解决问题的能力。

    ssm整合源代码,包含页面,配置文件,测试环境

    5. **AOP(Aspect-Oriented Programming,面向切面编程)**:Spring AOP允许在程序运行时插入特定的行为,如日志记录、事务管理等,实现了关注点分离。 6. **Bean的生命周期**:在Spring中,每个被管理的对象称为...

    2021毕业实习手册.docx

    第二周,重点在于学习Spring框架的原理,包括Spring AOP、Hibernate、Spring MVC和Spring IOC,以及JQuery的使用。通过实际操作和讨论,实习生将深入理解这些技术在系统项目中的应用。 第三周,实习生将运用所学...

    springside-3.3.4 源码(无JAR)

    深入理解 AOP 的原理和 Spring 实现,能够让我们更好地处理横切关注点。 - **单元测试与集成测试**:SpringSide 往往会提供完善的测试支持,包括 JUnit 和 Mockito 等工具的使用。学习如何编写测试用例,可以确保...

    java简历模版4.docx

    4. **Spring机制与AOP**:理解Spring的IOC依赖注入和AOP设计思想,能够整合SSM(Spring、SpringMVC、Mybatis)或SSH(Spring、Struts2、Hibernate)框架进行项目开发。 5. **ORM与数据库**:熟练运用Hibernate进行...

    本科毕业设计项目-基于SSM+Mysql的房屋管理项目.zip

    此外,Spring还提供了AOP(面向切面编程)功能,用于实现日志记录、权限控制等功能。 2. **Spring MVC**:Spring MVC是Spring框架的一部分,主要处理Web层的请求和响应。它将请求分发到控制器(Controller),控制...

Global site tag (gtag.js) - Google Analytics