在服务类扩展的类中使用@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