自动装配运用Spring的Bean后处理功能自动为每个对象产生代理对象,省略了手动装配的工作量
Spring装配文件一:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <!-- 在大型应用当中,当我们有几个,几百个类需要通知时,显示地创建每个代理就会显得很笨拙 --> <!-- spring有一个自动代理机制,它可以让容器为我们产生代理. --> <!-- 装配环绕通知Bean(通知) --> <bean class="org.niit.springaop.example5.AroundAdvice" name="waiter"></bean> <!-- 装配顾客Bean(要被代理的目标对象) --> <bean class="org.niit.springaop.example5.ConsumerImpl" name="consumer"> <property name="foodName" value="汉堡"></property> <property name="name" value="张先生"></property> </bean> <!-- 大多数切面是由定义切面行为的通知和定义切面在什么地方执行的切入点组合而成的。 spring认识到这一点,提供了Advisor,它把通知和切入点组合到一个对象中。 --> <!-- 顾问 --> <bean class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor" name="myAdvisor"> <property name="advice" ref="waiter"></property> <!-- 切入点 --> <!--当被调用的方法名字与给出的映射名字匹配时,这个切入点才匹配. 你可以使用明确的方法名也可以在名字的开始或者结束处使用通配符* --> <!-- 可以有一个或者多个映射 --> <property name="mappedNames"> <list> <value>ea*</value> </list> </property> <!--一个映射如下 --> <!-- <property name="mappedName"> <value>ea*</value> </property> --> </bean> <!--通过名字进行匹配的自动代理对创建器--> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>con*</value> </list> </property> <property name="interceptorNames"> <list> <value>myAdvisor</value> </list> </property> </bean> </beans>
Spring装配文件二:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <!-- 在大型应用当中,当我们有几个,几百个类需要通知时,显示地创建每个代理就会显得很笨拙 --> <!-- spring有一个自动代理机制,它可以让容器为我们产生代理. --> <!-- 装配环绕通知Bean(通知) --> <bean class="org.niit.springaop.example5.AroundAdvice" name="waiter"></bean> <!-- 装配顾客Bean(要被代理的目标对象) --> <bean class="org.niit.springaop.example5.ConsumerImpl" name="consumer"> <property name="foodName" value="汉堡"></property> <property name="name" value="张先生"></property> </bean> <!-- 大多数切面是由定义切面行为的通知和定义切面在什么地方执行的切入点组合而成的。 spring认识到这一点,提供了Advisor,它把通知和切入点组合到一个对象中。 --> <!-- 顾问 --> <bean class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor" name="myAdvisor"> <property name="advice" ref="waiter"></property> <!-- 切入点 --> <!--当被调用的方法名字与给出的映射名字匹配时,这个切入点才匹配. 你可以使用明确的方法名也可以在名字的开始或者结束处使用通配符* --> <!-- 可以有一个或者多个映射 --> <property name="mappedNames"> <list> <value>ea*</value> </list> </property> <!--一个映射如下 --> <!-- <property name="mappedName"> <value>ea*</value> </property> --> </bean> <!-- 这个类的奇妙之处在于它实现了BeanPostProcessor接口.当ApplicationContext读入所有Bean的配置信息之后, DefaultAdvisorAutoProxyCreator将扫描上下文,寻找所有的Advisor.它将这些Advisor应用到所有符合Advisor切入点的Bean中 注意:这个代理创建器只能与Advisor配合使用 --> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" /> </beans>
测试代码和前面是一样的