指那些被拦截到的点。。
拦截到的方法
要对那些连接点进行拦截定义。。
拦截之前通知,之后通知
在不修改类的情况下,动态的添加。。
代理的目标对象
把增强应用到目标对象,创建新的代理对象的过程称为织入,
一个类被AOP代理以后,会产生结果代理类
package com.ming.demo7;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
/**
* 前置通知
* @author ming
*/
public class MyBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("前置通知=============");
}
}
<?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="studentDao" class="com.ming.demo7.StudentDaoImpl"/>
<!-- 前置通知 -->
<bean id="myBeforeAdvice" class="com.ming.demo7.MyBeforeAdvice"/>
</beans>
<?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="studentDao" class="com.ming.demo7.StudentDaoImpl"/>
<!-- 前置通知类型 -->
<bean id="myBeforeAdvice" class="com.ming.demo7.MyBeforeAdvice"/>
<!-- 产生代理对象 -->
<bean id="studentDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 目标类 -->
<property name="target" ref="studentDao"/>
<!-- 实现的接口 -->
<property name="proxyInterfaces" value="com.ming.demo7.StudentDao"/>
<!--采用拦截的名称 -->
<property name="interceptorNames" value="myBeforeAdvice"/>
</bean>
</beans>
package com.ming.demo7;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class StudentDaoImplTest {
@Autowired
private StudentDao studentDaoProxy;
@Test
public void find() {
studentDaoProxy.find();
}
@Test
public void update() {
studentDaoProxy.update();
}
@Test
public void delete() {
studentDaoProxy.delete();
}
}
package com.ming.demo7;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
/**
* 前置通知
* @author ming
*/
public class MyBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println(method.getName());
System.out.println("前置通知=============");
}
}
package com.ming.demo7;
public interface StudentDao {
public void find();
public void update();
public void delete();
}
package com.ming.demo7;
public class StudentDaoImpl implements StudentDao {
@Override
public void find() {
System.out.println("查找");
}
@Override
public void update() {
System.out.println("更新");
}
@Override
public void delete() {
System.out.println("删除");
}
}
这里使用的是jdk的动态代理
使用cglib动态代理使用
optimize 为 true
如果需要拦截一个方法 或者某几个方法 使用带有切入点的切面
这是环绕通知
package com.ming.demo8;
public class CustomerDao {
public void find(){
System.out.println("查询客户");
}
public void save(){
System.out.println("保存客户");
}
public void update(){
System.out.println("更新客户");
}
public void delete(){
System.out.println("删除");
}
}
package com.ming.demo8;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyAroundadvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("执行前操作");
// 执行方法的操作
Object obj = methodInvocation.proceed();
System.out.println("执行后操作");
return obj;
}
}
<?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.xsd">
<!-- 目标类 -->
<bean id="customerDao" class="com.ming.demo8.CustomerDao"/>
<!-- 环绕通知 -->
<bean id="myAroundAdvice" class="com.ming.demo8.MyAroundadvice"/>
<!-- 对目标某些方法增强需要配置 使用正则配置 -->
<bean id="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<!-- 正则匹配 .任意字符 * 任意次数-->
<property name="pattern" value=".*"/>
<!-- 环绕通知 -->
<property name="advice" ref="myAroundAdvice"/>
</bean>
<!-- 产生代理 -->
<bean id="customerDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="customerDao"/>
<property name="proxyTargetClass" value="true"/>
<property name="interceptorNames" value="myAdvisor"/>
</bean>
</beans>
package com.ming.demo8;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class CustomerDaoTest {
@Autowired
CustomerDao customerDaoProxy;
@Test
public void find() {
customerDaoProxy.find();
}
@Test
public void save() {
customerDaoProxy.save();
}
@Test
public void update() {
customerDaoProxy.update();
}
@Test
public void delete() {
customerDaoProxy.delete();
}
}
对以DAO结尾的Bean进行结尾
<?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.xsd">
<!-- 配置目标类 -->
<bean id="studentDao" class="com.ming.demo10.StudentDaoImpl"/>
<bean id="customerDao" class="com.ming.demo10.CustomerDao"/>
<!-- 配置增强 -->
<!-- 前置增强 -->
<bean id="myBeforeAdvice" class="com.ming.demo10.MyBeforeAdvice"/>
<!-- 后置增强 -->
<bean id="myAroundAdvice" class="com.ming.demo10.MyAroundadvice"/>
<!-- 自动代理 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 配置那种目标类 -->
<property name="beanNames" value="*Dao"/>
<!-- 使用那种增强 -->
<property name="interceptorNames" value="myBeforeAdvice"/>
</bean>
</beans>
package com.ming.demo10;
public class CustomerDao {
public void find(){
System.out.println("查询客户");
}
public void save(){
System.out.println("保存客户");
}
public void update(){
System.out.println("更新客户");
}
public void delete(){
System.out.println("删除");
}
}
package com.ming.demo10;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyAroundadvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("执行前操作");
// 执行方法的操作
Object obj = methodInvocation.proceed();
System.out.println("执行后操作");
return obj;
}
}
package com.ming.demo10;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class MyBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("前置增强=========");
}
}
package com.ming.demo10;
public interface StudentDao {
public void find();
public void update();
public void delete();
}
package com.ming.demo10;
public class StudentDaoImpl implements StudentDao {
@Override
public void find() {
System.out.println("查找");
}
@Override
public void update() {
System.out.println("更新");
}
@Override
public void delete() {
System.out.println("删除");
}
}
<?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.xsd">
<!-- 配置目标类 -->
<bean id="studentDao" class="com.ming.demo10.StudentDaoImpl"/>
<bean id="customerDao" class="com.ming.demo10.CustomerDao"/>
<!-- 配置增强 -->
<!-- 前置增强 -->
<bean id="myBeforeAdvice" class="com.ming.demo10.MyBeforeAdvice"/>
<!-- 后置增强 -->
<bean id="myAroundAdvice" class="com.ming.demo10.MyAroundadvice"/>
<!-- 自动代理 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 配置那种目标类 -->
<property name="beanNames" value="*Dao"/>
<!-- 使用那种增强 -->
<property name="interceptorNames" value="myBeforeAdvice"/>
</bean>
</beans>
package com.ming.demo10;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class StudentDaoImplTest {
@Autowired
private StudentDao studentDao;
@Autowired
private CustomerDao customerDao;
@Test
public void find() {
studentDao.find();
customerDao.find();
}
@Test
public void update() {
studentDao.update();
customerDao.update();
}
@Test
public void delete() {
studentDao.delete();
customerDao.delete();
}
}
对切面进代理
好吧,,这个解决不了
连接点: 那些被拦截到的方法
切入点 要对那些连接点进行定义为切入点
通知: 在切入点执行之前进行通知,之后进行通知。
引介: 在不修改类的代码的前提下
目标对象: 动态生成的对象
织入 创建新的代理的过程
代理: 动态产生代理的过程
切面 切入点和连接点的结合