在某些类中, 什么时机, 做什么事情
切入点(point-cut): 在某些类中(Class<?>[] itfc = new Class<?>[] { IStudentService.class })
通知: 什么时机, 做什么事情(InvocationHandler的invoke方法)
切面: 切入点 + 通知
织入(weaver): Proxy.newProxyInstance: 把切入点和通知施加到具体的业务逻辑上的过程
XML配置AOP步骤:
1,准备了一个实现接口的bean, 还有一个事务的碎片化方法的类;
2,把这两个类配置到Spring容器中;
3,配置springAOP
1)引入aop命名空间;
2)配置AOP,格式如下
<aop:config>
<aop:point-cut expression="" id="sample" />
<aop:aspect ref="">
<aop:before method="" pointcut-ref="sample">
<aop:after-returning method="" pointcut-ref="sample">
<aop:after-throwing method="" pointcut-ref="sample">
</aop:aspect>
</aop:config>
1] aop:config: AOP配置
2] aop:point-cut: AOP切入点
3] aop:aspect: AOP切面配置
4] aop:* 都是一个AOP切面
4,在接口文件中配置一个业务逻辑对象的接口,DI注入,并在test方法中直接调用该接口的具体业务逻辑
//接口: package com.xk.spring.kp04_aop.aop.s01_xml; public interface IStudentService { public void save(Student stu); public void update(Student stu); }
//Dao 实现类(service) 实现业务逻辑 package com.xk.spring.kp04_aop.aop.s01_xml; public class StudentServiceImpl implements IStudentService { @Override public void save(Student stu) { System.out.println("调用Dao的save方法...."); } @Override public void update(Student stu) { System.out.println("调用Dao的update方法..."); @SuppressWarnings("unused") int i = 10/0; } }
//事物管理:将代码中的污染源抽出一个类,专门处理事物 package com.xk.spring.kp04_aop.aop.s01_xml; public class TransactionManager { /** * 事物开始 */ public void begin(){ System.out.println("TransactionManager.begin()"); } /** * 事物提交 */ public void commit(){ System.out.println("TransactionManager.commit()"); } /** * 事物回滚 */ public void rollback(Throwable e){ System.out.println("TransactionManager.rollback()"); System.out.println("rollback()"); } /** * 事物结束 */ public void finished(){ System.out.println("TransactionManager.close()"); } }
//Bean //将bean注入就是指将数据注入Spring package com.xk.spring.kp04_aop.aop.s01_xml; public class Student { private String name; private Integer age; public Student() { } public Student(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } }
//测试类 package com.xk.spring.kp04_aop.aop.s01_xml; 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; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class AOPXMLTest { @Autowired IStudentService seriver; @Test public void testAOPXML() throws Exception { seriver.save(new Student("张三", 18)); seriver.update(new Student("张4", 18)); } }
<!-- xml配置aop --> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="service" class="com.xk.spring.kp04_aop.aop.s01_xml.StudentServiceImpl" /> <bean id="manager" class="com.xk.spring.kp04_aop.aop.s01_xml.TransactionManager" /> <aop:config> <!-- 需要导入两个依赖包 com.springsource.org.aopalliance-1.0.0.jar 和com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar --> <aop:pointcut expression="execution(* com.xk.spring.kp04_aop.aop.s01_xml.*Service.*(..))" id="stuService" /> <aop:aspect ref="manager"> <aop:before method="begin" pointcut-ref="stuService" /> <!-- 回滚:在回滚的时候 throwing是要在TransactionManager类中配置的 参数"(throwable e)" --> <aop:after-throwing method="rollback" pointcut-ref="stuService" throwing="e" /> </aop:aspect> </aop:config> </beans> <!-- 错误:Pointcut is not well-formed: expecting 'name pattern' at character position 配置aop报错:原因是配置切点表达式的时候报错了, 星号后面没有加空格: <aop:config> <aop:pointcut id="transactionPointcut" expression="execution(* project.mybatis.service.*.*(..))" /> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="omsMTransactionAdvice" /> </aop:config> 其中,切入点表达式的使用规则: 1、execution(): 表达式主体。 2、第一个*号:表示返回类型,*号表示所有的类型。 3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。 4、第二个*号:表示类名,*号表示所有的类。 5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。 -->