AOP的全称是Aspect-Oriented Programming.即面向切面编程,也称为面向方面编程,它是面向对象编程(OOP)的一种补充。
1.string的通知类型
>>org.aopalliance.intercept.MethodInterceptor(环绕通知):在目标方法执行前后实施增强,可以应用于日志、事务管理等功能。
>>org.springframework.aop.MethodBeforeAdvice(前置通知):在目标方法执行前实施增强,可以应用于权限管理等功能
>>org.springframework.aop.AfterReturningAdvice(后置通知):在目标方法执行后实施增强,可以应用于关闭流、上传文件、删除临时文件等功能。
>>org.springframework.aop.ThrowsAdvice (异常通知):在方法抛出后实施增强,可以应用于处理异常记录日志等功能
>>org.springframework.aop.IntroductionInterceptor(引介通知):在目标类添加一些新的方法和属性,可以应用修改老版本程序(增强类)。
2.ProxyFactoryBean
ProxyFactoryBean是FactoryBean接口的实现类,FactoryBean负责实例化一个Bean,而ProxyFactoryBean负责为其它Bean创建代理实例。
ProxyFactoryBean类中常用的配置属性如下:
target:代理的目标对象
proxyinterfaces:代理要实现的接口,如果有多个接口,可以使用<list></list>赋值
proxyTargetClass:是否对类代理而不是接口,设置true时,使用的是cglib代理。
interceptorNames:需要织入目标的Advice
singleton:返回代理是否为但实例,默认为true ,即默认为返回单实例
optimize:当设置为true时。强制使用GGLIB。
3.练习(环绕通知)
(1)jar包,出了需要的核心jar包,还需要spring-aop-4.3.6.RELEASE.jar和aopalliance-1.0.jar。
(2)在src下创建一个包com.items.proxyfactorybean。并创建接口,接口实现类,切面类:
接口:
package com.items.proxyfactorybean;
public interface UserDao {
public void hello();
public void hello2();
}
实现类:
package com.items.proxyfactorybean;
public class UserDaoIml implements UserDao{
@Override
public void hello() {
System.out.println("hello factoryBean");
}
@Override
public void hello2() {
System.out.println("hello factoryBean two");
}
}
切面类:
package com.items.proxyfactorybean;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyAspect implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation mi) throws Throwable {
//执行目标方法
check();
Object obj = mi.proceed();
log();
return obj;
}
public void check(){
System.out.println("**模拟检查权限");
}
public void log() {
System.out.println("***模拟检查日志");
}
}
(2)创建aplicationContext.xml文件,并指定代理对象。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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.xsd">
<!-- 目标类 -->
<bean id = "userDao" class = "com.items.proxyfactorybean.UserDaoIml"></bean>
<!-- 切理类 -->
<bean id = "myAspect" class = "com.items.proxyfactorybean.MyAspect"></bean>
<!-- 使用spring代理工厂定义一个名称为userDaoProxy的代理对象 -->
<bean id = "userDaoProxy" class = "org.springframework.aop.framework.ProxyFactoryBean">
<!-- 指定代理实现的接口 -->
<property name="proxyInterfaces" value="com.items.proxyfactorybean.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>
(4)创建测试类ProxyFactoryTexst
package com.items.proxyfactorybean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ProxyFactoryTexst {
public static void main(String [] args){
String xmlPath = "com/items/proxyfactorybean/aplicationContext.xml" ;
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
UserDao userDao = (UserDao) applicationContext.getBean("userDaoProxy");
userDao.hello();
userDao.hello2();
}
}
学习书籍:《javaEE企业级开发程序》
网友评论