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();

}

}

posted @ 2020-07-21 16:23  南巷北口  阅读(485)  评论(0)    收藏  举报