Java service类中调用同类中的另一个方法时,aop不生效的解决方法
1:演示代码内容
1.1:Controller
1 package com.ydg.cloud.lock.controller; 2 3 import com.ydg.cloud.lock.service.TestService; 4 import lombok.extern.slf4j.Slf4j; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.web.bind.annotation.GetMapping; 7 import org.springframework.web.bind.annotation.RestController; 8 9 /** 10 * @author YDG 11 * @description 12 * @since 2019-04-23 13 */ 14 @Slf4j 15 @RestController 16 public class TestLockController { 17 18 19 @Autowired 20 private TestService testService; 21 22 @GetMapping("test") 23 public void test() { 24 testService.testLock(1L); 25 } 26 }
1.2:Service
1 package com.ydg.cloud.lock.service; 2 3 /** 4 * @author YDG 5 * @description 6 * @since 2019-07-20 7 */ 8 public interface TestService { 9 10 void testLock(Long id); 11 12 void testLock2(Long id); 13 }
1.3:ServiceImpl
1 package com.ydg.cloud.lock.service.impl; 2 3 import com.ydg.cloud.lock.annotation.Lock; 4 import com.ydg.cloud.lock.service.TestService; 5 import org.springframework.stereotype.Service; 6 7 /** 8 * @author YDG 9 * @description 10 * @since 2019-07-20 11 */ 12 @Service 13 public class TestServiceImpl implements TestService { 14 15 @Override 16 public void testLock(Long id) { 17 assert id != null; 18 this.testLock2(id); 19 } 20 21 @Override 22 @Lock(keyName = "id") 23 public void testLock2(Long id) { 24 System.out.println("需要加锁的id是:" + id); 25 } 26 }
2:不生效
如上面的代码,在controller中注入了TestSevice,然后调用了TestService的testLock方法,在testLock方法中调用了testLock2方法,其中testLock2方法上面加了@Lock注解,这个注解是我自己写的一个分布式锁注解,里面用到了aop,会在进入加了@Lock注解的方法的时候,将keyName作为分布式锁的key对资源进行加锁,但是实际的执行状况是aop不生效
3:使之生效
1 package com.ydg.cloud.lock.service.impl; 2 3 import com.ydg.cloud.lock.annotation.Lock; 4 import com.ydg.cloud.lock.service.TestService; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.context.ApplicationContext; 7 import org.springframework.stereotype.Service; 8 9 /** 10 * @author YDG 11 * @description 12 * @since 2019-07-20 13 */ 14 @Service 15 public class TestServiceImpl implements TestService { 16 @Autowired 17 private ApplicationContext applicationContext; 18 19 @Override 20 public void testLock(Long id) { 21 assert id != null; 22 TestService testService = applicationContext.getBean(TestService.class); 23 testService.testLock2(id); 24 } 25 26 @Override 27 @Lock(keyName = "id") 28 public void testLock2(Long id) { 29 System.out.println("需要加锁的id是:" + id); 30 } 31 }
我换了种方法,通过applicationContext拿到TestService的cglib动态代理对象,就行了,就能在testLock方法调用testLock2方法的时候使testLock2的aop生效
转载:https://blog.csdn.net/qq1300375795/article/details/96575743