`

Spring中的AOP面向切面编程和Spring对JDBC的支持

    博客分类:
  • SSH
阅读更多

一、Spring-AOP

AOP面向切面编程(Aspect-Oriented Programming),是对传统OOP的补充。AOP使用是使用动态代理实现的。动态代理我们已经非常熟悉了。我也将逐渐的由实现原理转向应用,因为 我们在学习JavaWEB基础的时候,原理已经学习过了。

 

AspectJ是Java社区里最完整最流行的AOP框架,Spring2.X使用的正是这个框架。AspectJ已经被广泛应用,她具有大好前 程。

 

AspectJ支持注解和XML配置。

 

1.启用AspectJ注解支持

1).AspectJ需要两个Jar包:spring-framework-2.5.6.SEC01\lib\aspectj\目录下 “aspectjrt.jar”和“aspectjweaver.jar”。

2).在Bean配置文件中添加“ < aop:aspectj-autoproxy />

 

 

2.使用AspectJ注解声明切面

AspectJ 支持 5 种类型的通知注解:

1) @Before: 前置通知, 在方法执行之前执行。

2) @After: 后置通知, 在方法执行之后执行 。

3) @AfterRunning: 返回通知, 在方法返回结果之后执行。

4) @AfterThrowing: 异常通知, 在方法抛出异常之后。

5) @Around: 环绕通知, 围绕着方法执行。

 

我们来看个简单的例子,算术计算器。

1).定义一个接口:

package cn.itcast.cc.spring.aspectj;

public interface ArithmeticCalculator {

void add(int i, int j);// 无返回值,用于测试

void sub(int i, int j);// 无返回值,用于测试

int mul(int i, int j);

int div(int i, int j);

}
 

2) .实现类:

package cn.itcast.cc.spring.aspectj;

import org.springframework.stereotype.Component;

@Component(value="calc")

public class ArithmeticCalculatorImpl implements ArithmeticCalculator {

@Override

public void add(int i, int j) {

int result = i + j;

System.out.println(result);

}

@Override

public void sub(int i, int j) {

int result = i - j;

System.out.println(result);

}

@Override

public int div(int i, int j) {

int result = i / j;

return result;

}

@Override

public int mul(int i, int j) {

int result = i * j;

return result;

}

}
 

3) .AspectJ切面类:

package cn.itcast.cc.spring.aspectj;

import org.aspectj.lang.*;

import org.aspectj.lang.annotation.*;

import org.springframework.stereotype.Component;

@Aspect // AspectJ切面Bean

@Component // Bean

public class ArithmeticCalculatorAspect {

// 前置通知

@Before(value = "execution (* cn.itcast.cc.spring.aspectj.ArithmeticCalculator.* (..))")

public void beforeMethodLoggin(JoinPoint jp) {

System.out.println("before " + jp.getSignature().getName());

}

// 后置通知

@After(value = "execution (* cn.itcast.cc.spring.aspectj.ArithmeticCalculator.* (..))")

public void afterMethodLoggin(JoinPoint jp) {

System.out.println("after " + jp.getSignature().getName());

}

// 返回通知

@AfterReturning(value = "pointCut()", returning = "result")

public void afterMethodLogginReturn(JoinPoint jp, Object result) {

System.out.println("after " + jp.getSignature().getName() + " return " + result);

}

// 异常通知

@AfterThrowing(value = "pointCut()", throwing = "e")

public void errorMethodLoggin(JoinPoint jp, Throwable e) {

System.out.println("method " + jp.getSignature().getName()

+ " throwing " + e);

}

// 环绕通知,通过它可以实现上面所有的通知。

@Around("execution (* cn.itcast.cc.spring.aspectj.ArithmeticCalculator.* (..))")

public Object aroundMethodLoggin(ProceedingJoinPoint pjp) {

System.out.println("around_before " + pjp.getSignature().getName());

Object result = null;

try {

result = pjp.proceed();

} catch (Throwable e) {

e.printStackTrace();

System.out.println("around_error " + pjp.getSignature().getName());

}

System.out.println("around_after " + pjp.getSignature().getName());

System.out.println("around_after " + pjp.getSignature().getName()

+ " return " + result);

return result;

}

// 重用切入点,其他 “通知方法”可以引用此方法名称“pointCut()”。

@Pointcut(value = "execution (* cn.itcast.cc.spring.aspectj.ArithmeticCalculator.* (..))")

public void pointCut() {

}

}
 

4) .Bean配置文件:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="cn.itcast.cc.spring.aspectj" />

<aop:aspectj-autoproxy />

</beans>
 

5).测试类:

package cn.itcast.cc.spring.aspectj;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

public static void main(String[] args) {

ApplicationContext ac = new ClassPathXmlApplicationContext("beans-aspect.xml");

ArithmeticCalculator calc = (ArithmeticCalculator) ac.getBean("calc");

calc.add(1, 2);

// calc.sub(2, 1);

// calc.mul(3, 3);

// calc.div(10, 2);

}

}
 

上面是较为常用的注解。

 

2.使用XML文件声明切面

使用XML文件声明切面没有使用注解声明切面直观,简单。

1) .删除所有AspectJ注解

2) .xml配置文件内容为:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<bean id="arithmeticCalculatorAspect" class="cn.itcast.cc.spring.xml.ArithmeticCalculatorAspect" />

<bean id="arithmeticCalculatorImpl" class="cn.itcast.cc.spring.xml.ArithmeticCalculatorImpl" />

<aop:config>

<aop:pointcut

expression="execution(* cn.itcast.cc.spring.xml.ArithmeticCalculator.* (..))"

id="pointcut" />

<aop:aspect order="1" ref="arithmeticCalculatorAspect">

<aop:before method="beforeMethodLoggin" pointcut-ref="pointcut"/>

<aop:after method="afterMethodLoggin" pointcut-ref="pointcut"/>

<aop:after-returning method="afterMethodLogginReturn" returning="result" pointcut-ref="pointcut"/>

<aop:after-throwing method="errorMethodLoggin" throwing="e" pointcut-ref="pointcut"/>

<aop:around method="aroundMethodLoggin" pointcut-ref="pointcut"/>

</aop:aspect>

</aop:config>

</beans>
 

3.引入通知

这是一个高级应用。我们知道Java只能单继承,使用这个引入通知就能实现多集成! 这一点是我没想到的,但想一想Java的反射机制和动态代理实现这一点并不难。

 

我们为上边的计算器,扩展 两个应用:计算最大值和最小值,他们分别是两接口和对应的实现类“ M ax Calculator ”(Impl)和“ MinCalculator ”(Impl)

 

使用注解的方式实现引入通 知,在 ArithmeticCalculatorAspect .java中添加

@DeclareParents(value="cn.itcast.cc.spring.aspectj.ArithmeticCalculator*",

defaultImpl=MinCalculatorImpl.class)

public MinCalculator minCalculator;

@DeclareParents(value="cn.itcast.cc.spring.aspectj.ArithmeticCalculator*", defaultImpl=MaxCalculatorImpl.class)

public MaxCalculator maxCalculator;
 

使用XML文件实现引入通 知:

<aop:declare-parents types-matching="cn.itcast.cc.spring.xml.ArithmeticCalculator*" 

implement-interface="cn.itcast.cc.spring.xml.MaxCalculator"

default-impl="cn.itcast.cc.spring.xml.MaxCalculatorImpl"/>

<aop:declare-parents types-matching="cn.itcast.cc.spring.xml.ArithmeticCalculator*" 

implement-interface="cn.itcast.cc.spring.xml.MinCalculator"

default-impl="cn.itcast.cc.spring.xml.MinCalculatorImpl"/>
 

引入通知的使用:

 

ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-xml.xml");

Object obj = ctx.getBean("calc");

ArithmeticCalculator arithmeticCalculator = (ArithmeticCalculator) obj;

// 可以转换

MinCalculator minCalculator = (MinCalculator) obj;

// 可以转换

MaxCalculator maxCalculator = (MaxCalculator) obj;
 

 

二、Spring-JDBC

JDBC中Spring中似乎比较常用,但使用起来非常简单。

 

1.引入数据源

昨天介绍的使用外部Bean正是引入C3P0数据源的方法,在此我们就不重复了。

 

2.使用方式

我们使用spirng为我们提供的一个CURD操作类——JdbcTemplate,在xml配置文件中添加一个Bean:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

<property name="dataSource" ref="dataSource"/>

</bean>
 

在程序中使用:

package cn.itcast.cc.spring.jdbc;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.springframework.jdbc.core.JdbcTemplate;

public class JdbcTest {

private ApplicationContext ac = new ClassPathXmlApplicationContext(

"beans.xml");

private JdbcTemplate jdbcTemplate = (JdbcTemplate) ac

.getBean("jdbcTemplate");

@Test

public void testInsert() {

String sql = "insert into customers(customer_name,home_address,mobile_phone) VALUES (?,?,?)";

Object[] args = { "changcheng", "DaLian", "1398639955" };

this.jdbcTemplate.update(sql, args);

}

}
 

在此我只列出了insert的方法,其他方法可以查看Spring手册,十分简单。

 

Spring还为我们提供了一个更简单的CURD类—— SimpleJdbcTemplate , 它使用起来比 JdbcTemplate简单些,在此也不多做介绍了。

1
0
分享到:
评论

相关推荐

    Spring框架+Spring工作原理+AOP面向切面编程+JDK代理+Cglib代理

    1. **Spring Core**:提供了Spring框架的基础,包括依赖注入(DI)和面向切面编程(AOP)的基础支持。它是所有其他模块的基础。 2. **Spring AOP**:支持面向切面编程,允许开发者定义方法拦截器和切入点,从而分离...

    Spring-AOP java2ee中的Spring框架的面向切面示例

    在Java企业级开发中,Spring框架是一个不可或缺的重要组件,它为开发者提供了丰富的功能,包括依赖注入、面向切面编程(AOP)、数据访问/集成、Web应用、事务管理等。本示例主要聚焦于Spring框架的面向切面编程(AOP...

    Spring aop、jdbc和事务tx练习

    - 一个Spring配置文件,定义了bean、AOP切面、数据源和事务管理器。 - 使用了@Autowired注解自动装配Bean的Java类,展示了依赖注入。 - 针对AOP的切面类,定义了通知(advice)并指定了切入点(pointcut)。 - 使用...

    Spring+AOP全套jar包

    AOP(Aspect Oriented Programming)即面向切面编程,是Spring框架中的一个重要组成部分,它允许程序员定义“切面”,这些切面可以封装跨多个对象的行为或责任。 标题“Spring+AOP全套jar包”表明这个压缩包包含了...

    spring aop依赖jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式的企业级服务,如事务管理、性能监控等。在Spring AOP中,我们可以通过定义切面(Aspect...

    spring-aop.rar_java aop_spring aop

    【标题】"spring-aop.rar_java aop_spring aop" 涉及的主要知识点是Spring框架中的面向切面编程(AOP)以及Java基础知识。这个压缩包可能包含了一个简单的Spring AOP应用示例,同时也涵盖了Java的一些核心概念,如...

    Spring AOP IOC源码笔记.pdf

    Spring框架是Java开发中不可或缺的一部分,它主要由两个核心组件构成:IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。本笔记将深入探讨这两个概念以及它们在Spring中...

    Spring及AOP应用(事务与集成)培训

    我们会讲解如何创建Bean,如何使用注解进行依赖注入,如何编写AOP切面,以及如何配置声明式事务。此外,我们还将学习如何利用Spring的集成特性连接数据库,并进行数据操作。 总的来说,这次“Spring及AOP应用(事务...

    spring连接数据库aop-jdbc

    在"spring连接数据库aop-jdbc"这个主题中,我们主要关注Spring框架如何通过AOP(面向切面编程)和JDBC(Java Database Connectivity)来实现数据库的高效管理。以下是关于这一主题的详细知识: 1. **Spring JDBC...

    面向切面封装的JDBC

    总结来说,面向切面封装的JDBC是通过AOP技术对传统的JDBC进行抽象和封装,利用反射机制动态生成代理,以实现对数据库操作的统一管理和优化。这种方式使得开发者可以更加专注于业务逻辑,而不用过多关注底层的数据库...

    spring_aop.rar_spring-dao

    在IT行业中,Spring框架是Java开发中...通过这个例子,开发者可以学习到如何在Spring环境中声明和使用DAO,以及如何创建和配置AOP切面以实现控制反转。这将有助于提升开发效率,降低代码间的耦合度,并使系统更加健壮。

    itheima_spring_aop.rar

    本资源“itheima_spring_aop.rar”聚焦于Spring框架中的AOP(面向切面编程)部分,结合源代码,提供了一次深入学习的机会。下面将详细解析相关知识点。 1. **Spring框架**:Spring是一个全面的企业级应用开发框架,...

    spring基于AOP实现事务

    本文将深入探讨如何基于AOP(面向切面编程)来实现Spring的事务管理,特别是通过TransactionProxyFactoryBean。让我们一起探索这个主题。 首先,了解什么是AOP。AOP是Spring框架的核心特性,它允许我们在不修改业务...

    Spring中文 开发手册+aop讲解.zip

    这个压缩包文件"Spring中文 开发手册+aop讲解.zip"显然包含了丰富的Spring框架学习资源,特别是对于那些希望深入理解和使用AOP(面向切面编程)概念的开发者来说。以下是这些资源可能涵盖的关键知识点: 1. **...

    spring-jdbc jar包.rar

    此外,还可以利用Spring的AOP(面向切面编程)实现全局的事务管理策略。 总的来说,"spring-jdbc jar包"为开发者提供了一个强大且灵活的JDBC抽象层,使得在Java应用中进行数据库操作变得更加简单、高效和可靠。无论...

    spring官方完整jar包-4.1.6版

    3. **面向切面编程(AOP)**:Spring的AOP模块支持在不修改源代码的情况下,对应用程序进行横切关注点(如日志、事务管理)的插入。这有助于保持代码的整洁,提高可复用性。 4. **Bean工厂与ApplicationContext**:...

    代理模式、AOP编程、jdbc支持

    AOP(面向切面编程)是Spring框架的一个重要特性,它允许程序员将关注点分离,将横切关注点(如日志、事务管理、安全检查等)与业务逻辑分离。AOP通过“切面”(Aspect)来封装这些关注点,然后在运行时将它们织入到...

    spring aop ioc mvc

    Spring 框架是 Java 开发中的一个核心框架,它主要由 AOP(面向切面编程)、IOC(控制反转)和 MVC(模型-视图-控制器)三大组件构成。这三大组件是 Spring 提供的强大功能的核心,使得开发更加高效、灵活。 **1. ...

    spring4 、 springmvc4.2、springjdbc

    首先,Spring Core是整个Spring框架的基础,提供了依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)的核心功能。依赖注入允许开发者通过配置文件或注解来管理对象之间的...

    Spring 代理 Aop 实现原理讲解.docx

    在Spring框架中,AOP(面向切面编程)是一种重要的编程模型,它允许开发者定义“切面”,这些切面可以包含业务逻辑的某个部分,例如日志、事务管理等,然后在运行时自动插入到合适的位置,无需在每个方法中重复编写...

Global site tag (gtag.js) - Google Analytics