下面的main方法是IOC和AOP的整个原理, 我一定要把下面每一行代码理解.
public static void main(String[] args) {
/*===================IOC&AOP==========================================*/
// 1. 启动spring容器
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions(new ClassPathResource("spring.xml"));
// 2. 从容器中拿到proxyFactoryBean
// test1:从proxyFactoryBean拿到dog
ProxyFactoryBean proxyFactoryBean = beanFactory.getBean(ProxyFactoryBean.class);
IDog dogHashA1 = (IDog) proxyFactoryBean.getObject();
System.out.println("do the loud:" + dogHashA1.loud());
// test2:直接从容器拿到dog
IDog dogHashB1 = (IDog) beanFactory.getBean("dog");
System.out.println("do the loud:" + dogHashB1.loud());
// test3:再从容器拿到dog, 看一下是不是相同的dog
IDog dogHashB2 = (IDog) beanFactory.getBean("dog");
System.out.println("do the loud:" + dogHashB2);
// test4:直接用名字从容器中拿到proxyFactoryBean
IDog dogHashA2 = (IDog) beanFactory.getBean("proxyFactoryBean");
ProxyFactoryBean proxyFactoryBean3 = (ProxyFactoryBean) beanFactory.getBean("&proxyFactoryBean");
/*=Q&A=====================================================================*/
/*问题, 为什么从容器中拿到proxyFactoryBean, 再生产一个bean, 和从容器中拿到proxyFactoryBean生产的bean一样,
不是每一次重新建一个代理吗?*/
/*问题, 问什么直接从容器中拿bean, 和从容器中拿proxyFactoryBean 不一样? 不应该是同一个代理吗?*/
}
测试项目构成
1. Dog类
上面项目用到IDog和DogImpl, 有一个loud方法, 随便打印个什么就好了
2. MyAdvisor 通知方法
实现 MethodBeforeAdvice, 随便打印个什么
3. spring.xml 配置增强
<!--AOP-->
<bean class="org.springframework.aop.framework.ProxyFactoryBean" id="proxyFactoryBean">
<property name="target" ref="dog"/>
<property name="proxyInterfaces">
<list>
<value>cn.gasin.spring.aop.inter.IDog</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>myAdvisor</value>
</list>
</property>
</bean>
没有了