hi 傅哥, 案例一的解决方案一,需要加@Lazy否则会出现循环依赖。
@Lazy
@Autowired private ElectricService electricService;
共 1 条评论
5
Monday
2021-06-19
案例2:user的命名一会user一会adminUser,不统一啊
共 1 条评论
4
Ball
2021-04-30
🤔总结一下,今天以两个 AOP 场景下的问题为线索,深入 Spring 源码探讨了 Spring 的动态代理机制,还分享了 AOP 场景下问题的 debug 技巧。结合问题定位的过程,最终给出了问题的多种解决方案。👍
4
Bumblebee
2022-05-30
今日收获(总结的不对的希望老师同学们多多指正)
① JDK 动态代理只能对实现了接口的类生成代理,而不能针对普通类。而 CGLIB 是可以针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,来实现代理对象。
② this调用的当前类方法无法被拦截(可以通过@Autowired、AopContext.currentProxy() 方式解决);
③ 我们一般不能直接从代理类中去拿被代理类的属性,这是因为除非我们显示设置 spring.objenesis.ignore 为 true,否则代理类的属性是不会被 Spring 初始化的,我们可以通过在被代理类中增加一个方法来间接获取其属性。
总结:我觉得SpringAop生成的代理类是对被代理类的一个包装,代理类对象仅被代理对象方法执行前后进行增强,原始方法的调用还是由被代理对象自己执行;
关于思考题,不知道为什么用老师的AdminUserService就还是会初始化类属性,自定义的类就可以验证不会初始化,后面再关注。
验证代码如下:(参考https://blog.csdn.net/Zong_0915/article/details/126512236)
public class Test {
public final User user = new User("LJJ");
public User user2 = new User("LJJ");
public String name = "Hello";
public final String str = "ssss";
public Integer a = 12222;
public final Integer b = 12222;
public int aa = 1;
public final int bb = 2;
public static void main(String[] args) throws Exception {
ReflectionFactory reflectionFactory = ReflectionFactory.getReflectionFactory();
Constructor constructor = reflectionFactory.newConstructorForSerialization(Test.class, Object.class.getDeclaredConstructor());
constructor.setAccessible(true);
Test t = (Test) constructor.newInstance();
System.out.println("final user: " + t.user);
System.out.println("user: " + t.user2);
System.out.println("final String: " + t.str);
System.out.println("String: " + t.name);
System.out.println("final Integer: " + t.b);
System.out.println("Integer: " + t.a);
System.out.println("final int: " + t.bb);
System.out.println("int: " + t.aa);
}
}
注意:
- sun.reflect在Java 9以上才引入
- 如果编译报错“package sun.reflect does not exist”,但是在代码里其实可以看到源码,则可以尝试在IDEA设置里搜索Java Compiler,取消勾选 `Use '--release' option for cross-compilation` 选项即可,亲试有效。参考[IntelliJ says the package does not exist, But I can access the package](https://stackoverflow.com/questions/40448203/intellij-says-the-package-does-not-exist-but-i-can-access-the-package)——StackOverFlow