来自尚学堂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的学习中,动态代理是一个至关重要的概念。本文将深入探讨动态代理在Spring框架中的应用,以及如何通过JDK的动态代理机制实现这一功能。动态代理是面向切面编程(AOP)的一种实现方式,它允许我们在不...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个关键特性,它为开发者提供了在运行时动态添加代码(即横切关注点或切面)到已有对象的能力。这一特性使得复杂的业务逻辑能够被模块化,...
3. **灵活的通知模型**:Spring AOP提供了多种类型的通知,包括around、before、after returning、after throwing等,使得开发者可以根据实际需求选择最适合的通知类型。 4. **丰富的切入点表达式语言**:Spring ...
### Spring AOP 学习资料知识点总结 #### 一、Spring AOP 概念与背景 **Spring AOP**(面向切面编程)是Spring框架中的一个重要组成部分,它通过预定义的切入点来分离关注点,使得核心业务逻辑更加清晰,同时能够...
2. **基于注解的AOP**:Spring 2.5开始支持注解驱动的AOP,通过在方法上使用`@Before`、`@After`、`@AfterReturning`、`@AfterThrowing`、`@Around`等注解来定义通知。 3. **基于XML配置的AOP**:在Spring的配置...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的可复用性和可维护性。 ### 1. ...
1. **基于代理的AOP**:Spring使用JDK动态代理或CGLIB代理来创建代理对象。如果目标类实现了接口,Spring会使用JDK动态代理;否则,它会使用CGLIB生成一个子类来实现AOP。 2. **基于字节码增强的AOP**:通过ASM库,...
7. **代理(Proxy)**:Spring AOP通过动态创建一个代理对象来实现对目标对象的增强。 8. **织入(Weaving)**:将切面与目标对象进行组合的过程。Spring AOP是在运行时完成织入的。 #### 三、Spring AOP 的实现机制 ...
- **代理(Proxy)**:Spring AOP创建的对象,用于实现切面的逻辑。 - **织入(Weaving)**:将切面应用到目标对象,创建代理的过程。可以发生在运行时或编译时。 2. **工作原理** - **动态代理**:Spring AOP...
赠送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....
- `ApplicationConfig`:Spring配置文件,启用AOP并配置切面。 - 测试类:用来验证AOP功能是否正确工作。 通过运行这个项目,你可以看到AOP如何在实际场景中工作,如何通过切面和通知来增强业务逻辑。 总的来说,...
5. **代理(Proxy)**:Spring AOP通过创建代理对象来实现对目标对象的拦截,代理对象会在调用目标方法前后执行通知。 ### 二、Spring AOP配置与实现 1. **注解驱动(Annotation-based)**:使用`@Aspect`定义切面...
1. **非侵入性**:Spring AOP是非侵入式的,意味着你不需要修改现有的代码即可添加AOP功能。 2. **轻量级**:使用Spring AOP不需要预编译器或其他工具,只需要通过配置即可实现。 3. **易于集成**:Spring AOP可以...
Spring AOP 代理一、两种代理方式1. JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。二
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...
1. **代理**:Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。JDK代理用于实现了接口的类,而CGLIB代理则用于没有接口或不希望使用接口的类。代理对象在调用目标方法时会执行切面逻辑。 2. **织入**:织入...
### Spring AOP 概念与实践 #### 一、AOP 概述 ...Spring AOP 提供了灵活的机制来实现这一目标,无论是通过 AspectJ 注解还是 XML 配置,开发者都可以根据项目的需求选择最适合的方式来实现 AOP。
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现横切关注点,如日志、事务管理、性能监控等,而无需侵入业务代码。下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### ...