对比AOP织入 方式一
<!-- 方式二:使用切面定义 自定义类 -->
<bean id="diy" class="com.kuang.diy.Diy"/>
<aop:config>
<!-- 自定义切面,ref要引入的类 -->
<aop:aspect ref="diy">
<!-- 切入点 -->
<aop:pointcut id="point" expression="execution(* com.kuang.services.ServiceImpl.*(..))"/>
<!-- 通知 -->
<aop:before method="before" pointcut-ref="point"/>
<aop:after method="after" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
对比AOP织入 方式二
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--注册bean-->
<bean id="service" class="com.kuang.services.ServiceImpl"/>
<bean id="logBefore" class="com.kuang.log.LogBefore"/>
<bean id="logAfter" class="com.kuang.log.LogAfter"/>
<!-- 方式一:使用原生Spring API接口 -->
<!--配置AOP : 需要导入aop约束-->
<aop:config>
<!-- 切入点 :expression表达式 = execution(需要执行的位置! 修饰符 返回值 类名.方法名.参数 (* * * * *)) -->
<aop:pointcut id="pointcut" expression="execution(* com.kuang.services.ServiceImpl.*(..))"/>
<!-- 执行环绕增加 -->
<aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="logAfter" pointcut-ref="pointcut"/>
</aop:config>
</beans>
注解实现AOP
package com.qf.common;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
//增强类 事务管理类
//切面=切点加通知
@Aspect
@Component
public class TransManger {
//定义切点,无参无返回值的方法 pc相当于切点的ID
@Pointcut("execution(* com.qf.service..*.*(..))")
public void pc(){}
@Before("pc()")
public void startTran(){
System.out.println("开启事务~~~~~~~~~~~~");
}
@AfterReturning("pc()")
public void commitTran(){
System.out.println("提交事务.............");
}
@AfterThrowing("pc()")
public void rollBackTran(){
System.out.println("回滚事务~~~~~~~~~~~~~~");
}
@After("pc()")
public void afterMethod(){
System.out.println("测试AOP");
}
// 加给AOP:around环绕通知
@Around("pc()")
public Object aroundMethod(ProceedingJoinPoint pj) throws Throwable {
System.out.println("环绕执行前");
long start = System.currentTimeMillis();
Object proceed = pj.proceed();
long end = System.currentTimeMillis();
System.out.println(".......delete_after");
System.out.println(end-start);
System.out.println("环绕执行后");
return proceed;
}
}
spring-dao.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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:annotation-config/>
<context:component-scan base-package="com.qf"/>
<!-- 整合数据源属性配置文件,参数化占位符 ,读取参数${} -->
<context:property-placeholder location="classpath:druid.properties"/>
<!--配置数据源,DataSource就是一个对象,将对象交由spring容器创建并管理-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${druid.driver}"/>
<property name="url" value="${druid.url}"/>
<property name="username" value="${druid.username}"/>
<property name="password" value="${druid.password}"/>
</bean>
<!--配置SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置需要配置别名的实体类包 -->
<property name="typeAliasesPackage" value="com.qf"/>
<!-- 配置mybatis映射文件加载路径,如果映射文件与接口文件不在同一路径下,需要配置 因为是在resource下所以得必须用/ -->
<property name="mapperLocations" value="classpath:com/qf/mapper/*.xml"/>
<!-- 加载mabatis 核心配置文件,需要时加载,如果配置为空,可以省略不写 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 配置SqlSession和接口得代理对象 -->
<!-- bean默认是单例模式,它里面有一个私有的对象,只设置了一次 sqlSessionFactory 创建出一个sqlSessionTemplate 对象,这个对象相当于sqlSession 接口的代理对象,-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定sqlSessionFactory注入 String字符串 名字,不是bean getbean是在 MapperScannerConfigurer 类内部被调用,拿这个变量去调用得
肯定设置了openSession(true) 默认开启自动提交
用得同一个session ,将不能使用二级缓存了,一般同个session一级缓存就够用了,一级缓存,增删改会清除缓存,但是只是查询,会找到一级缓存里之前查过的数据直接查出来,不调用sql,
只是用同一个session 创建getMapper不同得接口代理类,去实现不同的接口,代理这个代理类。
创建了这个代理对象注入进IOC容器里面。普通得getMapper不能创建 一个类, 他只是创建一个对象,
然后通过动态代理这个对象去实现共同的接口的一个类,把这个类才能加入IOC容器里,返回给我们使用这个代理对象。
-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 设置要创建mapper对象得接口所在得包名 因为代理的是接口,所以指定包名是接口的包名,
通过接口的字节码对象,与代理的目标对象的字节码对象,加上实现InvocationHandler的类对象,完成代理对象的创建,然后把bean创建给容器。 -->
<property name="basePackage" value="com.qf.mapper"/>
</bean>
<!--配置事务管理器-->
<bean id="transactionManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源对象,要求与sqlSessionFactory创建时所注入数据源对象是同一个 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- <tx:annotation-driven transaction-manager="transactionManger"/>-->
<tx:advice id="txAdvice" transaction-manager="transactionManger">
<tx:attributes>
<tx:method name="insert*"/>
<tx:method name="delete*"/>
</tx:attributes>
</tx:advice>
<!--配置事务-->
<aop:config>
<aop:pointcut id="pc" expression="execution(* com.qf.service..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config>
</beans>
导入的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qf</groupId>
<artifactId>Spring-Mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring-version>5.3.20</spring-version>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--spring相关依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<!--spring-aspects-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
文章来源地址https://www.toymoban.com/news/detail-608572.html
文章来源:https://www.toymoban.com/news/detail-608572.html
到了这里,关于Spring-Mybatis整合配置文件与AOP织入方式对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!