Spring @Transactional注释不起作用

时间:2018-12-07 11:17:46

标签: spring-boot spring-aop spring-transactions

在服务类扩展的类中使用@Transactional注释时,我遇到了一个问题。我知道Spring仅在代理调用方法时才进行事务管理,但是我的问题是因为有这个批注,当直接通过对象访问(属性是公共的)时,我无法获得另一个Service类的属性值,但是我能够通过getter方法获取。

控制器

package com.springbootdemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {
    @Autowired
    Service1 service1;

    @GetMapping("/")
    public void index() {
        service1.doSomething();
    }
}

服务1

package com.springbootdemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Service1 {
    @Autowired
    Service2 service2;

    public void doSomething(){
        service2.setSname("Hello");
        System.out.println("sname==> "+service2.sname);
        System.out.println("getSname==>"+service2.getSname());
    }
}

UtilBean

package com.springbootdemo;

import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Component
public class UtilBean {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public String appendString(String s1) {
        return " Hi "+ s1;
    }
}

服务2

package com.springbootdemo;

import org.springframework.stereotype.Component;

@Component
public class Service2 extends UtilBean{
    public String sname;

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }
}

application.properties

management.endpoints.web.exposure.include=*
#management.endpoints.web.exposure.exclude=loggers
#security.user.name=admin
#security.user.password=admin
spring.datasource.url=jdbc:mysql://192.168.0.10:3306/aswaraj?zeroDateTimeBehavior=convertToNull&useSSL=false
spring.datasource.username=root
spring.datasource.password=test
spring.datasource.platform=mysql
spring.session.store-type=none
security.basic.enabled=false

输出

sname==> null
getSname==>Hello

0 个答案:

没有答案