spring之aop注解配置基于动态代理的事务管理

1.pom配置文件

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.2</version>
        </dependency>

        <dependency>
            <groupId>commons-dbutils</groupId>
            <artifactId>commons-dbutils</artifactId>
            <version>1.7</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>

        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

2.配置类,
jdbc

public class JdbcConfig {

    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.user}")
    private String user;
    @Value("${jdbc.psd}")
    private String psd;


    @Autowired
    private ServiceFactory serviceFactory;


    @Bean("proxyService")
    AccountService createProxy(){

        return serviceFactory.getAccountService();
    }


    @Bean
    QueryRunner createQueryRunner(){

        return new QueryRunner();

    }





    @Bean
    DataSource createDataSource(){
        ComboPooledDataSource ds =new ComboPooledDataSource();
        try {
            ds.setDriverClass(driver);
            ds.setJdbcUrl(url);
            ds.setUser(user);
            ds.setPassword(psd);

        } catch (PropertyVetoException e) {
//            System.out.println("哈哈哈");
            e.printStackTrace();
        }
        return ds;
    }



}

springconfig

@Configuration
@ComponentScan("top.chenyp")
@Import(JdbcConfig.class)
@PropertySource("classpath:jdbc1.properties")
public class SpringConfig {}

dao和service忽略
3.配置连接和事务

连接

@Component
public class ConnectionUtils {


    private ThreadLocal<Connection> tl =new ThreadLocal<>();


    @Autowired
    private DataSource ds;


    /**
     * 获取当前线程的连接
     */

    public Connection getThreadConnection(){

        //从threadLocal获取
        Connection conn = tl.get();

        try {
            //判断线程有连接
            if (conn==null){

                conn =ds.getConnection();

                tl.set(conn);

            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return conn;


    }

    public void removeConnection(){
        tl.remove();
    }

}

事务

@Component
public class TransactionManager {


    @Autowired
    private ConnectionUtils connectionUtils;

    /**
     * 开启事务
     */

    public  void beginTransaction(){
        try {
            connectionUtils.getThreadConnection().setAutoCommit(false);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }



    /**
     * 提交
     */

    public  void commit(){
        try {
            connectionUtils.getThreadConnection().commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 回滚事务
     */

    public  void rollback(){
        try {
            connectionUtils.getThreadConnection().rollback();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 释放事务
     */

    public  void close(){
        try {
            connectionUtils.getThreadConnection().close();
            connectionUtils.removeConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }



}

4.测试操作

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class Test {


    @Autowired
    @Qualifier("proxyService")
    private AccountService proxyService;


    @org.junit.Test
    public void test(){


        List<Account> allAccount = proxyService.findAllAccount();

        for (Account account : allAccount) {
            System.out.println(account);
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值