Spring AOP

1. AOP是什么(Aspect   Oriented   Programming)

  • AOP是一种编程范式,提供从还有一个角度来考虑程序结构以完好面向对象编程(OOP)。
  • AOP为开发人员提供了一种描写叙述横切关注点的机制,并可以自己主动将横切关注点织入到面向对象的软件系统中。从而实现了横切关注点的模块化。
  • AOP可以将那些与业务无关,却为业务模块所共同调用的逻辑或责任。比如事务处理、日志管理、权限控制等。封装起来,便于降低系统的反复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。    

2.AOP能干什么,也是AOP带来的优点

  • 减少模块的耦合度
  • 使系统easy扩展
  • 设计决定的迟绑定:使用AOP,设计师能够推迟为将来的需求作决定,由于它
  • 能够把这样的需求作为独立的方面非常easy的实现。
  • 更好的代码复用性

3.Spring中实现AOP技术:

     在Spring中可以通过代理模式来实现AOP

     代理模式分为

           静态代理:一个接口,分别有一个真实实现和一个代理实现。

           动态代理:通过代理类的代理,接口和实现类之间可以不直接发生联系,而             可以在运行期(Runtime)实现动态关联。

    动态代理有两种实现方式,可以通过jdk的动态代理实现也可以通过cglib

    来实现而AOP默认是通过jdk的动态代理来实现的。jdk的动态代理必须要有

    接口的支持,而cglib不需要,它是基于类的。

4.在 net.biancheng.c.dao 包下,创建一个名为 UserDao 的接口,代码如下。

  1. package net.biancheng.c.dao;
  2. public interface UserDao {
  3. public void add();
  4. public void delete();
  5. public void modify();
  6. public void get();
  7. }

5.在 net.biancheng.c.dao.impl 包下,创建 UserDao 的实现类 UserDaoImpl,代码如下。

  1. package net.biancheng.c.dao.impl;
  2. import net.biancheng.c.dao.UserDao;
  3. public class UserDaoImpl implements UserDao {
  4. @Override
  5. public void add() {
  6. System.out.println("正在执行 UserDao 的 add() 方法……");
  7. }
  8. @Override
  9. public void delete() {
  10. System.out.println("正在执行 UserDao 的 delete() 方法……");
  11. }
  12. @Override
  13. public void modify() {
  14. System.out.println("正在执行 UserDao 的 modify() 方法……");
  15. }
  16. @Override
  17. public void get() {
  18. System.out.println("正在执行 UserDao 的 get() 方法……");
  19. }
  20. }

6.在 net.biancheng.c.advice 包下,创建一个名为 UserDaoBeforeAdvice 的前置增强类,代码如下。

  1. package net.biancheng.c.advice;
  2. import org.springframework.aop.MethodBeforeAdvice;
  3. import java.lang.reflect.Method;
  4. /**
  5. * 增强代码
  6. * MethodBeforeAdvice 前置增强
  7. *
  8. */
  9. public class UserDaoBeforeAdvice implements MethodBeforeAdvice {
  10. @Override
  11. public void before(Method method, Object[] args, Object target) throws Throwable {
  12. System.out.println("正在执行前置增强操作…………");
  13. }
  14. }

 7.在 src 目录下创建一个 Spring 的配置文件 Beans.xml,配置内容如下。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context.xsd">
  9. <!--******Advisor : 代表一般切面,Advice 本身就是一个切面,对目标类所有方法进行拦截(* 不带有切点的切面.针对所有方法进行拦截)*******-->
  10. <!-- 定义目标(target)对象 -->
  11. <bean id="userDao" class="net.biancheng.c.dao.impl.UserDaoImpl"></bean>
  12. <!-- 定义增强 -->
  13. <bean id="beforeAdvice" class="net.biancheng.c.advice.UserDaoBeforeAdvice"></bean>
  14. <!--通过配置生成代理 UserDao 的代理对象 -->
  15. <bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  16. <!-- 设置目标对象 -->
  17. <property name="target" ref="userDao"/>
  18. <!-- 设置实现的接口 ,value 中写接口的全路径 -->
  19. <property name="proxyInterfaces" value="net.biancheng.c.dao.UserDao"/>
  20. <!-- 需要使用value:增强 Bean 的名称 -->
  21. <property name="interceptorNames" value="beforeAdvice"/>
  22. </bean>
  23. </beans>

8.在 net.biancheng.c 包下,创建一个名为 MainApp 的类,代码如下。

  1. package net.biancheng.c;
  2. import net.biancheng.c.dao.UserDao;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. public class MainApp {
  6. public static void main(String[] args) {
  7. //获取 ApplicationContext 容器
  8. ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
  9. //获取代理对象
  10. UserDao userDao = context.getBean("userDaoProxy", UserDao.class);
  11. //调用 UserDao 中的各个方法
  12. userDao.add();
  13. userDao.delete();
  14. userDao.get();
  15. userDao.modify();
  16. }
  17. }

9. 执行 MainApp 中的 main 方法,控制台输出如下

正在执行前置增强操作…………
正在执行 UserDao 的 add() 方法……
正在执行前置增强操作…………
正在执行 UserDao 的 delete() 方法……
正在执行前置增强操作…………
正在执行 UserDao 的 get() 方法……
正在执行前置增强操作…………
正在执行 UserDao 的 modify() 方法……
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值