栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring03(完)--aop--spring-mybatis的整合-声明式事务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring03(完)--aop--spring-mybatis的整合-声明式事务

spring学习03 AOP
  • 面向切面编程

步骤:

  1. 导入aop的依赖

            org.aspectj
            aspectjweaver
            1.9.6
            runtime

  1. 环境搭建
//创建真实业务接口
public interface UserService {
    public int add();
    public void delete();
    public void update();
    public void query();
}
package com.xu.service;
//真实对象实现
public class UserServiceIml implements UserService{

    public int add() {
        System.out.println("增加");
        return 1;
    }

    public void delete() {
        System.out.println("删除");
    }

    public void update() {
        System.out.println("修改");
    }

    public void query() {
        System.out.println("查询");
    }
}

aop实现方式1【spring-api实现】
  • aop就是通过配置的方式完成动态代理的过程

  • 通过spring提供的接口实现

//前置通知类的编写
package com.xu.log;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

public class BeforeLog implements MethodBeforeAdvice {
    //此处相当于动态代理里面的invoke()
    public void before(Method method, Object[] objects, Object target) throws Throwable {
        System.out.println(target.getClass().getName()+"执行方法:"+method.getName());
    }
}

//后置通知类的编写
package com.xu.log;

import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;

public class AfterLog implements AfterReturningAdvice {
    public void afterReturning(Object returnValue, Method method, Object[] objects, Object target) throws Throwable {
        System.out.println(method.getName()+"方法的返回值为:"+returnValue);
    }
}
//xml文件配置



    
    
    

    
        

        
        

    


//测试
public class MyTest {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

        //注意此处代理的是接口,此处的类型应该是接口类型
        UserService userService=(UserService) context.getBean("UserserviceIml");
        userService.add();
    }
}
//测试结果
com.xu.service.UserServiceIml执行方法:add
增加
add方法的返回值为:1
aop实现方式二【自定义类(切面)实现】
  • 自定义一个切面,写上自己要加入的方法

  • 看到这明白aop的本质就是通过一些aop配置实现 在不改动原有实现类功能的基础上,切入一些新的功能

//自定义切面
public class DiyAop {
    public void before() {
        System.out.println("方法执行前");
    }

    public void after() {
        System.out.println("方法执行后");
    }
}
//配置xml文件,在切入点加入相应的功能


    
        
            
            
            
        
    
aop实现方式三【注解实现(在自定义类上加注解)】
//用注解的方式来表示切面和切入点
@Aspect
public class annoAop {
    @Before("execution(* com.xu.service.UserServiceIml.*(..))")
    public void before() {
        System.out.println("方法执行前(注解实现)");
    }
}

    

spring整合mybatis
  • 总结的步骤:
    • 编写数据源配置 (将数据源注入到容器中)
    • SqlSessionFactory(SqlSessionFactory注入到容器中)
    • SqlSessionTemplate(将sqlsession注入到容器中)
    • 写业务接口实现类
    • 将实现类注入到容器中
    • 测试
  • 本质就是spring 将mybatis用来连接数据库,创建sqlsessionfactory和sqlsession的方法全都封装成了实现类,我们只需要在spring.xml里面注入对象即可
  • 原来的mybatis获取sqlsession需要new,现在都只用封装好的类直接给他注入对象就好
  1. 导入需要的包


    
        spring-study
        com.xu
        1.0-SNAPSHOT
    
    4.0.0

    spring-08-mybatis

    
        
            junit
            junit
            4.13
        
        
            mysql
            mysql-connector-java
            5.1.47
        
        
            org.mybatis
            mybatis
            3.5.2
        
        
            org.springframework
            spring-webmvc
            5.2.0.RELEASE
        

        
        
            org.springframework
            spring-jdbc
            5.2.0.RELEASE
        

        
        
            org.mybatis
            mybatis-spring
            2.0.3
        

        
            org.projectlombok
            lombok
            1.18.12
        
    


    
        
            
                src/main/java
                
                    ***.xml
                
                true
            
        
    


  1. 通过spring.xml来改造之前的程序
  • 改造之后的mybatis-config.xml




    
        
    


  • 改造之后的spring.xml




    
    
        
        
        
        
    
    
    
        
        
        
         
        
    
    
    
        
    

    
    
        
    

  • 改造之后在UserMapper和UserMapper.xml的基础上加上UserMapperImp
package com.xu.dao;

import com.xu.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;

public class UserMapperUImp implements UserMapper {
    //注意此处类型是SqlSessionTemplate,因为注入的对象是SqlSessionTemplate
    private SqlSessionTemplate sqlSessionTemplate;

    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }

    public List getUser() {
        UserMapper mapper = sqlSessionTemplate.getMapper(UserMapper.class);
        return mapper.getUser();
    }
}
  • 测试
@Test
public void test() {

    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
    UserMapperUImp userMapperImp=(UserMapperUImp) context.getBean("UserMapperImp");
    List users = userMapperImp.getUser();
    for (User user : users) {
        System.out.println(user);
    }
}
整合进一步优化
  • 把接口实现类对象的配置和连接数据库获取sqlsession的配置 给分离开来
//再创建一个applicationContext.xml




    
    

    
    
        
    

//springdao.xml现在只用来完成连接数据库和获取sqlsession的配置




    
    
        
        
        
        
    
    
    
        
        
        
        
        
    
    
    
        
    

  • 测试类里面读取的xml文件也要变成applicationcontext.xml
@Test
    public void test() {

//      ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        UserMapperUImp userMapperImp=(UserMapperUImp) context.getBean("UserMapperImp");
        List users = userMapperImp.getUser();
        for (User user : users) {
            System.out.println(user);
        }
    }
  • 进一步简化上面的UserMapperImp
//通过继承官方的SqlSessionDaoSupport类之间获取sqlsession,不再需要通过添加属性并且注入的方式来
public class UserMapperImp2 extends SqlSessionDaoSupport implements UserMapper {
    public List getUser() {
        SqlSession sqlSession=this.getSqlSession();
        return sqlSession.getMapper(UserMapper.class).getUser();
    }
}

//对比之前实现类,继承这个SqlSessionDaoSupport可以简单很多
public class UserMapperUImp implements UserMapper {
    //注意此处类型是SqlSessionTemplate,因为注入的对象是SqlSessionTemplate
    private SqlSessionTemplate sqlSessionTemplate;

    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }

    public List getUser() {
        UserMapper mapper = sqlSessionTemplate.getMapper(UserMapper.class);
        return mapper.getUser();
    }
}
Spring 声明式事务
  • 在spring-dao.xml文件中加入如下配置

    





    
    
        
        
        
        
        
    



    
    

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/332388.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号