Aop:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
proxyFactoryBean代理
package com.dao;
/*
* 接口
*/
public interface IDAO {
public void query();
public void add();
public void del();
public void upd();
}
package com.dao;
public class DAOImp implements IDAO {
@Override
public void query() {
System.out.println("####正在查询中..........");
}
@Override
public void add() {
System.out.println("####正在增加中..........");
}
@Override
public void del() {
System.out.println("####正在删除中..........");
}
@Override
public void upd() {
System.out.println("####正在修改中..........");
}
}
package com.interceptor;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
/*
* 拦截器
*/
public class ServiceInterceptor implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("开始操作.....");
System.out.println("操作中.....");
System.out.println("准备开始事件...........");
//拦截到方法后让方法继续执行
Object obj=methodInvocation.proceed();
System.out.println("操作中.....");
System.out.println("事件结束.....\n");
return obj;
}
}
<!-- 注入接口实现类 -->
<bean id="daoImp" class="com.dao.DAOImp"></bean>
<!-- 注入拦截器-->
<bean id="serviceInterceptor" class="com.interceptor.ServiceInterceptor"></bean>
<!-- proxyFactoryBean设定代理类 -->
<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 指定特定代理的接口 -->
<property name="proxyInterfaces">
<value>com.dao.IDAO</value>
</property>
<!-- 程序的切入点,接口的具体实现类 -->
<property name="target">
<ref bean="daoImp"/>
</property>
<!-- 引入拦截器 -->
<property name="interceptorNames">
<value>serviceInterceptor</value>
</property>
</bean>
package com.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dao.IDAO;
/*
* 测试
*/
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
/*
* proxyFactoryBean代理
* 从代理工厂类中获取业务对象,
* 从代理工厂取出的对象必须是接口类型
*/
IDAO id = (IDAO) ac.getBean("proxyFactoryBean");
id.add();
id.del();
id.upd();
id.query();
}
}
CGLIB代理
<!-- 注入接口实现类 -->
<bean id="daoImp" class="com.dao.DAOImp"></bean>
<!-- 注入拦截器-->
<bean id="serviceInterceptor" class="com.interceptor.ServiceInterceptor"></bean>
<!-- CGLIB代理 :设定代理类 -->
<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 设定代理的类 -->
<property name="proxyTargetClass">
<value>true</value>
</property>
<!-- 程序的切入点,接口的具体实现类 -->
<property name="target">
<ref bean="daoImp"/>
</property>
<!-- 引入拦截器 -->
<property name="interceptorNames">
<value>serviceInterceptor</value>
</property>
</bean>
package com.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dao.DAOImp;
/*
* 测试
*/
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
/*
* CGLIB代理
* 从代理工厂类中获取业务对象,
* 从代理工厂取出的对象必须是实现类
*/
DAOImp id = (DAOImp) ac.getBean("proxyFactoryBean");
id.add();
id.del();
id.upd();
id.query();
}
}
自动代理
<!-- 注入接口实现类 -->
<bean id="daoImp" class="com.dao.DAOImp"></bean>
<!-- 注入拦截器-->
<bean id="serviceInterceptor" class="com.interceptor.ServiceInterceptor"></bean>
<!-- 自动代理 :设定代理类 -->
<bean id="beanNameAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" p:optimize="true">
<!-- 设定代理-->
<property name="beanNames">
<list>
<value>*Imp</value><!-- 代理所有以Imp结尾的 -->
</list>
</property>
<!-- 引入拦截器 -->
<property name="interceptorNames">
<value>serviceInterceptor</value>
</property>
</bean>
package com.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dao.DAOImp;
/*
* 测试
*/
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
/*
* 自动代理
* 可以直接从容器获取实现类
*/
DAOImp id = (DAOImp) ac.getBean("daoImp");
id.add();
id.del();
id.upd();
id.query();
}
}