spring注解事务实现demo(纯注解)

spring注解事务实现demo

  • @Configuration标识当前类是Spring的一个配置类
  • @ComponentScan替代xml中的context:component-scan/
  • @Import引入其他配置类,被引入的配置类可以不加@Configuration注解
  • @PropertySource:引入外部properties文件,注意加classpath:
  • @Value对成员变量赋值
  • @Bean将一个方法的返回值对象加入到Spring的容器当中管理
  • @Qualifier可以使用在方法上,表明对应的形参引入/注入的对象类型

直接删除xml的配置文件,取而代之的是一个Config类

@Transactional注解,取代tx标签

@EnableTransactionManagement注解,开启事务注解

  • @Configuration 标识当前类为一个配置类, 当前项目的配置类,好比是applicationContext.xml
  • @Import(Xxx.class) 在主配置类中包含Xxx的配置类
  • @PropertySource(“classpath:db.properties”) 读取配置文件
  • @Bean(“Xxx”) 相当于 , Bean()中不写参数,默认就是该方法创建的对象; 该对象就被Spring容器所管理了
该类是一个配置类,它的作用和bean.xml是一样的
  spring中的新注解
  Configuration
      作用:指定当前类是一个配置类
      细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。
  ComponentScan
       作用:用于通过注解指定spring在创建容器时要扫描的包
       属性:
           value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。
                  我们使用此注解就等同于在xml中配置了:
                       <context:component-scan base-package="com.sunny"></context:component-scan>
   Bean
       作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
       属性:
           name:用于指定bean的id。当不写时,默认值是当前方法的名称
       细节:
           当我们使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象。
           查找的方式和Autowired注解的作用是一样的
   Import
       作用:用于导入其他的配置类
       属性:
           value:用于指定其他配置类的字节码。
                   当我们使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类
   PropertySource
       作用:用于指定properties文件的位置
       属性:
           value:指定文件的名称和路径。
                   关键字:classpath,表示类路径下

DEMO

java依赖包

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.19</version>
    </dependency>
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.22</version>
    </dependency>

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

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>5.3.19</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.15</version>
    </dependency>

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

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.10</version>
    </dependency>

</dependencies>

Java配置类

@ComponentScan("com.buba")      //IoC注解解析器
@Configuration                  //标识当前类为一个配置类
@EnableAspectJAutoProxy         //不在配置类中添加@EnableAspectJAutoProxy,那么所有切面注解是不生效
@EnableTransactionManagement    //事务注解解析器
public class CoreConfig {

    // 当前项目的连接池的配置类
    @Bean
    public DataSource dataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("123456");
        druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        druidDataSource.setUrl("jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai");
        return druidDataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }

    //创建事务管理的Bean
    @Bean
    public DataSourceTransactionManager txManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

实体类

@Data
public class Money {
    private Integer id;
    private String name;
    private double money;
}

dao层

@Repository
public class MoneyDao {
    private Logger logger = Logger.getGlobal();
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public Integer UserUpdate(Money money){
        String sql = "update money set money = ? where id = ?";
        int update = jdbcTemplate.update(sql, money.getMoney(),money.getId());
        logger.info(Integer.toString(update));
        return update;
    }
}

service层

@Service
public class MoneyService {
    @Autowired
    private MoneyDao moneyDao;
    @Transactional
    public void test1(){
        Money money1 = new Money();
        money1.setMoney(999);
        money1.setId(1);
        Money money2 = new Money();
        money2.setMoney(999);
        money2.setId(2);

        moneyDao.UserUpdate(money1);
//        int o = 5/0;
        moneyDao.UserUpdate(money2);
    }
}

测试类

public classs test{
    @Test
    public void test1(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(CoreConfig.class);
        MoneyService bean = context.getBean(MoneyService.class);
        bean.test1();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bilal-abdurehim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值