ProxyFactoryBean
ProxyFactoryBean是FactoryBean接口的实现类,FactoryBean负责实例化一个Bean,而ProxyFactoryBean负责为其他Bean创建代理实例。在Spring中,使用ProxyFactoryBean是创建AOP代理的基本方式。
| 属性名称 | 描述 |
| target | 代理目标对象 |
| proxyInterfaces | 代理要实现的接口,如果有多个接口,可以使用<list><value></value></list> |
| proxyTargetClass | 是否对类代理而不是接口,设置为true时,使用CGLIB代理 |
| interceptorNames | 需要织入目标的Advice |
| singleton | 返回的代理是否为单例,默认为true(即返回的是单例) |
| optimize | 当设置为true时,强制使用CGLIB |
代码如下:
UserDao.java文件
package com.itheima.jdk;
public interface UserDao {
public void addUser();
public void deleteUser();
}
UserDaoImpl.java文件
package com.itheima.jdk;
//目标类
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
// TODO Auto-generated method stub
System.out.println("添加用户");
}
@Override
public void deleteUser() {
// TODO Auto-generated method stub
System.out.println("删除用户");
}
}
MyAspect.java文件
package com.itheima.FactoryBean;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
//切面类
public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
check_Permissions();
//执行目标方法
Object obj =arg0.proceed();
log();
return obj;
}
private void check_Permissions() {
// TODO Auto-generated method stub
System.out.println("模拟检查权限");
}
private void log(){
System.out.println("模拟记录日志");
}
}
ApplicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<!-- 目标类 -->
<bean id="userDao" class="com.itheima.jdk.UserDaoImpl"></bean>
<!-- 切面类 -->
<bean id="myAspect" class="com.itheima.FactoryBean.MyAspect"></bean>
<!-- 使用Spring代理工厂定义一个名为userDaoProxy的代理对象 -->
<bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 指定代理实现的接口 -->
<property name="proxyInterfaces" value="com.itheima.jdk.UserDao"></property>
<!-- 指定目标对象 -->
<property name="target" ref="userDao"></property>
<!-- 指定切面,织入环绕通知 -->
<property name="interceptorNames" value="myAspect"></property>
<!-- 指定代理方式,true:使用cglib,false(默认):使用jdk动态代理 -->
<property name="proxyTargetClass" value="true"></property>
</bean>
</beans>
ProxyFactoryBeanTest.java
package com.itheima.FactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.itheima.jdk.UserDao;
public class ProxyFactoryBeanTest {
public static void main(String[] args) {
String xmlPath="com/itheima/FactoryBean/ApplicationContext.xml";
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
//从spring容器中获得内容
UserDao userDao=(UserDao) applicationContext.getBean("userDaoProxy");
//执行方法
userDao.addUser();
userDao.addUser();
}
}
浙公网安备 33010602011771号