准备bean
@Component
public class Bean200 {
}
@Slf4j
@Component
public class Bean100 {
protected Bean200 bean2;
protected boolean initialized;
@Autowired
public void setBean2(Bean200 bean2) {
log.warn("Bean1#setBean2({})", bean2);
this.bean2 = bean2;
}
public Bean200 getBean2() {
log.warn("Bean2#getBean2()");
return bean2;
}
@PostConstruct
public void init() {
log.warn("Bean1#init()");
this.initialized = true;
}
public boolean isInitialized() {
return initialized;
}
public void m1() {
System.out.println("Bean100.m1");
}
public final void m2() {
System.out.println("Bean100.m2");
}
public static void m3() {
System.out.println("Bean100.m3");
}
private void m4() {
System.out.println("Bean100.m4");
}
}
准备aspect
@Component
@Aspect
public class Bean1Aspect {
@Before("execution(* com.you.meet.nice.test.web.spring.aop.spring.springaop.Bean100.*(..))")
public void before() {
System.out.println("Bean1Aspect.before...");
}
}
测试
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class, MapperAutoConfiguration.class})
public class TestSpringAOP {
@SneakyThrows
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(TestSpringAOP.class, args);
Bean100 proxy = applicationContext.getBean(Bean100.class);
showProxyAndTarget(proxy);
System.out.println("proxy.getBean2() = " + proxy.getBean2());
System.out.println("proxy.isInitialized() = " + proxy.isInitialized());
proxy.m1();
proxy.m2();
proxy.m3();
Method m4 = Bean100.class.getDeclaredMethod("m4");
m4.setAccessible(true);
m4.invoke(proxy);
applicationContext.close();
}
@SneakyThrows
private static void showProxyAndTarget(Bean100 proxy) {
System.out.println("====>代理类" + proxy + "中的成员变量");
System.out.println("proxy.initialized = " + proxy.initialized);
System.out.println("proxy.bean2 = " + proxy.bean2);
if (proxy instanceof Advised) {
Bean100 bean1 = (Bean100) ((Advised) proxy).getTargetSource().getTarget();
System.out.println("====>目标类" + bean1 + "中的成员变量");
System.out.println("bean1.initialized = " + bean1.initialized);
System.out.println("bean1.bean2 = " + bean1.bean2);
}
}
}
小结
- 依赖注入和初始化影响的原始对象�
- 代理与目标是两个对象,两者成员变量并不共用�