来自尚学堂Spring视频教程;作文字总结。
系统中现有接口UserDAO及其实现UseDAOImpl:
package com.bjsxt.dao;
import com.bjsxt.model.User;
public interface UserDAO {
public void save(User user);
}
package com.bjsxt.dao.impl;
import com.bjsxt.dao.UserDAO;
import com.bjsxt.model.User;
public class UserDAOImpl implements UserDAO {
public void save(User user) {
//Hibernate
//or JDBC
System.out.println("user saved!");
}
}
现在需要在save方法前记录日志,如:
package com.bjsxt.dao.impl;
import com.bjsxt.dao.UserDAO;
import com.bjsxt.model.User;
public class UserDAOImpl implements UserDAO {
public void save(User user) {
//Hibernate
//or JDBC
System.out.println("logging......");
System.out.println("user saved!");
}
}
当然,像这样直接在源代码里添加当然是最简单的了。但如果拿不到源代码呢?此时可以新写一个类来继承UserDAOImpl,用delegation的做法:
package com.bjsxt.dao.impl;
import com.bjsxt.model.User;
public class UserDAOImpl2 extends UserDAOImpl {
public void save(User user) {
System.out.println("logging......");
super.save(user);
}
}
用组合的方式也可以,如:
package com.bjsxt.dao.impl;
import com.bjsxt.dao.UserDAO;
import com.bjsxt.model.User;
public class UserDAOImpl3 implements UserDAO {
private UserDAO userDAO = new UserDAOImpl();
public void save(User user) {
System.out.println("logging......");
userDAO.save(user);
}
}
这样,把系统的beans.xml文件中配置的UserDAOImpl改成UserDAOImpl2或者UserDAOImpl3,系统就有了记录日志的的功能了。
这三种添加日志功能的方法中:
(1) 直接在源码中写死是最不灵活的方式,因为万一要修改日志功能,要在UserDAOImpl的代码中去搜索日志功能的代码,耦合度太高
(2) 继承的方式也不够灵活。首先UserDAOImpl1这个类无法再继承其他的类;再次,父类的改动必然引起子类的改动,耦合度太高
(3) 组合没有耦合度太高的问题;成员private UserDAO userDAO可以使用多态;继承只能继承一个Impl,而组合更为灵活,可以组合多个Impl,如同时组合UserDAOImpl和ForumDAOImpl。这3种方法中,组合的方式最好,在设计模式中也经常用组合来替代继承
另:这里的继承和组合都是静态代理,对应于[#0x0042]中的动态代理
分享到:
相关推荐
Spring AOP 入门 作者:廖雪峰
NULL 博文链接:https://aoyi.iteye.com/blog/723571
赠送jar包:spring-aop-5.0.10.RELEASE.jar; 赠送原API文档:spring-aop-5.0.10.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.0.10.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.0.10.RELEASE....
Spring AOP 代理一、两种代理方式1. JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。二
Spring源码最难问题:当Spring AOP遇上循环依赖.docx
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
spring aop jar 包
Spring AOP面向方面编程原理:AOP概念,主要介绍面向对象的概念及原理,及作者的一些理解。
NULL 博文链接:https://microjava.iteye.com/blog/525796
NULL 博文链接:https://czj4451.iteye.com/blog/2051461
描述一下Spring AOP? 在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring AOP 代理是什么? 引介...
Spring基础:Spring AOP简单使用
Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结
一、适合人群 1、具备一定Java编程基础,初级开发者 2、对springboot,mybatis,mysql有基本认识 3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二...
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
SpringAOP学习笔记以及四个可运行的Demo,涵盖经典代理模式、基于注解、基于xml配置这3方面的Demo
里面包括4个例子:(1)Spring实现AOP方式之一:基于XML配置的Spring AOP (2)Spring实现AOP方式之二:使用注解配置 Spring AOP (3)Spring AOP : AspectJ Pointcut 切点 (4)Spring AOP : Advice 声明 (通知注解)
Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象...