作者回复: 发现你这是个好办法,我自己念foo和父都觉得会让人搞不清楚,当时像你这么机智就好了
作者回复: 上下文可以有很多个,这个是我们自己决定的。我可以编程方式来控制。你说的没错,我这里只是为了演示上下文继承的一些坑。
作者回复: 不是啊,如果是个单纯的SpringBoot应用程序,加在随便哪个配置类上就行了,Application那个类也是个配置类,大家都是一样的。我在这个例子里是在演示不同的上下文,这个注解其实就是帮忙配了些东西,它配在哪个上下文里,哪里就会有AOP的增强。
作者回复: 1. 注解那个是Spring Framework提供的开启AspectJ注解支持的注解,其中禁用了对类的AOP支持;YAML那个是Spring Boot提供的配置,Spring Boot的自动配置类会根据这个配置做设置,自动配置类其实也是加了上面那个注解。 2. AspectJ是一个AOP框架,Spring可以通过它来实现AOP,也可以通过动态代理来实现AOP;CGLIB是一个代码生成类库,可以在代码运行时生成或修改类和接口,在proxyTargetClass=true时,Spring就是用CGLIB来对类(不管有没有实现接口)做增强,实现AOP的,如果proxyTargetClass=false,只能对实现了接口的类创建JDK动态代理。
作者回复: 子上下文在使用时,里面的同ID Bean会覆盖父上下文里的那个Bean。
作者回复: 这个继承和Java的继承没啥关系啊。父Context里的增强只能看到自己Context里的Bean,并看不到子Context的东西,所以也没法增强。
作者回复: ApplicationContext这个接口本身就是extends了BeanFactory的,所以ApplicationContext就是BeanFactory。如果你去看ClassPathXmlApplicationContext,初始化时传入parent,最终是调用了setParent()方法,然后获取Bean时,resolveBean()方法在当前上下文没找到Bean定义时会去父上下文找的。
作者回复: 是的,testBean打头的
作者回复: false时,用的是JDK的动态增强,增强的类必须是实现了某个接口的。而true时用的是CGLib,可以不用实现接口。 因为Spring Boot里也有自动配置类会设置proxyTargetClass=true,可以抛开Spring Boot,在一个纯Spring项目里再试试。
作者回复: 把Aspect的项目的包路径添加到@ComponentScan的扫描范围里去