[JAVA] Spring开发核心之AOP的实现与切入点持久化

1908 0
黑夜隐士 2022-11-8 17:23:30 | 显示全部楼层 |阅读模式
目录

    前言一、AOP的简单实现二、Spring的切入点三、Aspect对AOP的支持四、Spring持久化
      事务应用的管理应用JdbcTemplate操作数据库与Hibernate整合



前言

AOP(Aspect Oriented Program 面向切面编程)的实现基于Java的代理机制, 下面介绍Spring Aop的术语
1:切面(aspect)
切面是对象操作过程中的截面 如图19.1所示 切面是指图中的平行四边形
2:连接点(join point)
连接点是指对象操作过程中的某个阶段点 实际上是对象的一个操作 如图19.2所示


3:切入点(pointcut)
切入点是连接点的集合 如图19.3 切面与程序流程的交叉点便是程序的切入点
4:通知(advice)
通知是某个切入点被横切后,所采取的逻辑,也就是说 在切入点处拦截程序后,通过通知来执行切面


5:目标对象(target)
所有被通知的对象都是目标对象 被AOP所关注
6:织入(weaving)
织入是将切面功能应用到目标对象的过程 由代理工厂创建一个代理对象 这个代理可以为目标对象执行切面功能
7:引入(introduction)
对一个已编译完类 在运行时期 动态地向这个类中加载属性和方法

一、AOP的简单实现

利用Spring AOP使日志输出与方法分离 让在调用目标方法之前执行日志输出
  1. public class Target{
  2. public void execute(String name){
  3. System.out.printIn("程序开始执行"+name);
  4. }
  5. }
复制代码
通知可以拦截目标对象的execute方法 并执行日志输出
  1. public class LoggerExecute implements MethodInterceptor{
  2. public Object invoke(MethodInvocation invocation) throws Throwable{
  3. before();
  4. invocation.proceed();
  5. return null;
  6. }
  7. private void before(){
  8. System.out.printIn("程序开始执行");
  9. }
  10. }
复制代码
创建代理从而使用AOP功能
  1. public class Manger{
  2. public static void main(String[] args){
  3. Target target=new Target();
  4. ProxyFactory di=new ProxyFactory();
  5. di.addAdvice(new LoggerExecute());
  6. di.setTarget(target);
  7. Target proxy=(Target)di.getProxy();
  8. proxy.execute("AOP的简单实现");
  9. }
  10. }
复制代码
二、Spring的切入点

1:静态切入点
静态意味着不变,无论在程序的任何位置调用 方法名都不会改变 配置文件如下
指定所有以getConn开头的方法名都是切入点
  1. <bean id="pointcutAdvisor"
  2. class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  3. <property name="advice">
  4. <ref bean="MyAdvisor"/>
  5. </property>
  6. <property name="patterns">
  7. <list>
  8. <value>.*getConn*.</value>
  9. <value>.*closeConn*.</value>
  10. </list>
  11. </property>
  12. </bean>
复制代码
2:动态切入点
动态切入点应用在相对变化的位置
深入静态切入点
实际上Spring使使用boolean matches(Method,Class)方法来匹配切入点的
  1. public boolean matches(Method method,Class targetClass){
  2. return(method.getName().equals("execute"));
  3. }
复制代码
深入切入点底层
Pointcut接口是切入点的定义接口 用它来规定可切入的连接点的属性 通过对该接口的扩展可以处理其他类型的连接点 接口定义代码如下
  1. public interface Pointcut{
  2. ClassFilter getClassFilter();
  3. MethodMatcher getMethodMatcher();
  4. }
复制代码
使用ClassFilter接口来匹配目标类 代码如下
  1. public interface ClassFilter{
  2. boolean matches(Class class);
  3. }
复制代码
使用MethodMatcher接口来匹配目标类的方法或方法的参数
  1. public interface MethodMatcher{
  2. boolean matches(Method m,Class targetClass);
  3. boolean isRuntime();
  4. boolean matches(Method m,Class targetClass,Object[]args);
  5. }
复制代码
isRuntime方法返回false则执行静态切入点 true则执行动态切入点

三、Aspect对AOP的支持

Aspect是对系统中的对象操作过程中截面逻辑进行模块化封装的AOP概念实体,在通常情况下,Aspect可以包含多个切入点和通知
Advisor就是Spring中的Aspect 是切入点的配置器 结构如下


1:DefaultPointcutAdvisor切入点配置器
它可以把一个通知配给一个切入点 使用之前 首先要创建一个切入点和通知
首先创建一个通知
  1. public TestAdvice implements MethodInterceptor{
  2. public Object invoke(MethodInvocation mi)thorws Throwable{
  3. Object Val=mi.proceed();
  4. return Val;
  5. }
  6. }
复制代码
创建自定义切入点 重写matches和getclassfilter方法
  1. public class TestStaticPointcut extends StaticMethodMatcherPointcut{
  2. public boolean matches(Method method Class targetClass){
  3. return("targetMethod".equals(method.getName());
  4. }
  5. public ClassFilter getClassFilter(){
  6. return new ClassFilter()
  7. {
  8. public boolean matches(Class clazz){
  9. return(clazz==targetClass.class);
  10. }
  11. };
  12. }
  13. }
复制代码
分别创建一个通知和切入点实例
  1. Pointcut pointcut=new TestStaticPointcut();
  2. Advice advice=new TestAdvice();
复制代码
2:NameMatchMethodPointcutAdvisor 切入点配置器
使用它可以更简洁的将方法名设定为切入点
  1. NameMatchMethodPointcutAdvisor advice=new NameMatchMethodPointcutAdvisor(new TestAdvice());
  2. advice.addMethodName("targetMethod1name");
  3. ...
复制代码
四、Spring持久化

1:DAO模式
DAO代表数据访问对象(Data Access Object) 它描述了一个应用中的DAO角色 它提供了读写数据库中数据的一种方法,把这个功能通过接口提供对外服务 使得解耦合,对于整个系统性能有巨大的提升
Spring DAO抽象提供了以下几类
1:JdbcDaoSupport JDBC DAO抽象类 开发者需要为他设置数据源 通过子类 开发者能够获得JdbcTmeplate来访问数据库
2:HibernateDaoSupport 通过其子类 开发者能够获得Hibernate实现
3:JdoDaoSupport 通过其子类 开发者能够获得JdoTemplate



事务应用的管理

1:编程式事务管理
在Spring中主要有两种编程式事务的实现方法 分别使用PlatfromTransactionManager接口的事务管理器或者TransactionTemplate实现 但是推荐使用Transaction Template实现方式 因为它符合Spring的模板模式
2:声明式事务管理
Spring的声明式事务管理不涉及组建依赖关系 它通过AOP实现事务管理 Spring本身就是一个容器 相对于EJB容器而言 Spring显得更为轻量级
在Spring中常用TransactionProxyFactoryBean完成声明式管理

应用JdbcTemplate操作数据库

JdbcTemplate类式Spring的核心类之一 它在内部类已经处理完了数据库资源的创建和销毁 只需在代码中提供sql语句即可
配置JdbcTemplate和数据源
  1. <!--配置JdbcTemplate>
  2. <bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  3. <property name="dataSource">
  4. <ref local="dataSource"/>
  5. </property>
  6. </bean>
复制代码
获取JdbcTemplate对象 并利用它的update方法执行数据库的添加操作
  1. DriverManagerSource ds=null;
  2. JdbcTemplate jtl=null;
  3. Resource resource=new ClassPathResource("applicationContext.xml");
  4. BeanFactory factory=new XmlBeanFactory(resource);
  5. jtl=(JdbcTemplate)factory.getBean("jdbcTemplate");
  6. String sql="insert into table()values()";
  7. jtl.update(sql);
复制代码
与Hibernate整合

Spring整合了对Hibernate的设定 Spring中提供了HibernateTemplate类和HibernateDaoSupport类以及相应的子类 使用户时可以简化程序编写的资源
到此这篇关于Spring开发核心之AOP的实现与切入点持久化的文章就介绍到这了,更多相关Spring AOP 内容请搜索中国红客联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持中国红客联盟!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行