没有注解的
public class MyAspect {
public void qx(){
System.out.println("前置通知");
}
public void log(){
System.out.println("后置通知");
}
public void yic(){
System.out.println("异常");
}
public void zz(){
System.out.println("最终通知");
}
public Object hr(ProceedingJoinPoint joinPoint)throws Throwable{
String className=joinPoint.getSignature().getName();
System.out.println(className+"方法环绕前通知");
Object proceed=joinPoint.proceed();
System.out.println(className+"方法环绕后");
return proceed;
}
public class UserDaoIml {
public void add(){
System.out.println("添加");
}
public void del(){
System.out.println("删除");
}
public void upp(){
System.out.println("修改");
}
public void find(){
System.out.println("查询");
}
public void yic(){
//System.out.println(1/0);
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 开启注解-->
<aop:aspectj-autoproxy/>
<!--目标类-->
<bean id="StudentDao" class="com.lgq.dao.UserDaoIml"></bean>
<!--注入增强类-->
<bean id="MyAspect" class="com.lgq.common.MyAspect"></bean>
<!--配置AOP面向切面编程,得到代理对象-->
<aop:config><!--aop切面的根对象-->
<!--
切入点表达式
[访问修饰符(可省略不写)] [返回值] [包名]方法名 ,参数个数
* cn.zz.dao.imp.UserDaoImp.save() * 代表任意返回值
全统配写法
* *..*.*(..) 任意返回值, 当前包及其子包下的所有类,及类中所有方法 ,方法中所有参数
-->
<!--配置切入点-->
<aop:pointcut id="pc1" expression="execution(* *..*.add(..))"/><!--任意位置下的add方法,任意返回类型的-->
<aop:pointcut id="pc2" expression="execution(* *..*.delete(..))"/>
<aop:pointcut id="pc3" expression="execution(* *..*.update(..))"/>
<aop:pointcut id="pc4" expression="execution(* *..*.find(..))"/>
<aop:pointcut id="pc5" expression="execution(* *..*.yic(..))"/>
<!--配置切面类(切入点和通知的组合叫做切面类)-->
<aop:aspect ref="MyAspect">
<!--配置前置通知 -->
<aop:before method="qx" pointcut-ref="pc1"/>
<!--后置通知-->
<aop:after-returning method="log" pointcut-ref="pc3"/>
<!--最终通知-->
<aop:after method="zz" pointcut-ref="pc4"/>
<!--异常通知-->
<aop:after-throwing method="yic" pointcut-ref="pc5"/>
<!--环绕-->
<aop:around method="hr" pointcut-ref="pc1"/>
</aop:aspect>
</aop:config>
<!--配置读取jdbc-->
<context:property-placeholder location="db.properties"/>
<!--c3p0设置配置信息-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--将jdbc模板交给容器管理-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--读取c3p0数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
测试
@RunWith(SpringRunner.class)
@ContextConfiguration("classpath:applicationContext1.xml")
public class UserTest {
@Resource
UserDaoIml userDaoIml;
@Test
public void test01(){
userDaoIml.add();
userDaoIml.del();
userDaoIml.upp();
userDaoIml.find();
userDaoIml.yic();
}
结果
注解的
@Component
@Aspect
public class MyAspect2 {
@Pointcut("execution(* *..*.add(..))")
public void add1(){
}
@Pointcut("execution(* *..*.del(..))")
public void del1(){
}
@Pointcut("execution(* *..*.upd(..))")
public void upd1(){
}
@Pointcut("execution(* *..*.find(..))")
public void find1(){
}
@Pointcut("execution(* *..*.ex(..))")
public void ex1(){
}
@Before("add1()")
public void log(){
System.out.println("前置通知");
}
@AfterReturning("upd1()")
public void hz(){
System.out.println("后置通知");
}
@After("find1()")
public void zz(){
System.out.println("最终");
}
@AfterThrowing("ex1()")
public void yc(){
System.out.println("异常通知");
}
@Around("del1()")
public Object hr(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕前通知");
Object proceed=null;
proceed=proceedingJoinPoint.proceed();
System.out.println("环绕后通知");
return proceed;
}
}
接口
public interface StudentDao {
void add();//连接点
void upd();//连接点 (增强功能)→ 切入点
void del();//连接点
void find();//连接点
void ex();//连接点
}
-------------
@Repository
public class StudentDaoIml implements StudentDao{
@Override
public void add() {
System.out.println("添加");
}
@Override
public void upd() {
System.out.println("修改");
}
@Override
public void del() {
System.out.println("删除");
}
@Override
public void find() {
System.out.println("查询");
}
@Override
public void ex() {
System.out.println(1/0);
}
}
配置文件和上面的一样,只不过不需要这一部分了
<!-- <!–配置AOP面向切面编程,得到代理对象–>-->
<!-- <aop:config><!–aop切面的根对象–>-->
<!-- <!–-->
<!-- 切入点表达式-->
<!-- [访问修饰符(可省略不写)] [返回值] [包名]方法名 ,参数个数-->
<!-- * cn.zz.dao.imp.UserDaoImp.save() * 代表任意返回值-->
<!-- 全统配写法-->
<!-- * *..*.*(..) 任意返回值, 当前包及其子包下的所有类,及类中所有方法 ,方法中所有参数-->
<!-- –>-->
<!-- <!–配置切入点–>-->
<!-- <aop:pointcut id="pc1" expression="execution(* *..*.add(..))"/><!–任意位置下的add方法,任意返回类型的–>-->
<!-- <aop:pointcut id="pc2" expression="execution(* *..*.delete(..))"/>-->
<!-- <aop:pointcut id="pc3" expression="execution(* *..*.update(..))"/>-->
<!-- <aop:pointcut id="pc4" expression="execution(* *..*.find(..))"/>-->
<!--<!– <aop:pointcut id="pc5" expression="execution(* *..*.yic(..))"/>–>-->
<!-- <!–配置切面类(切入点和通知的组合叫做切面类)–>-->
<!-- <aop:aspect ref="MyAspect2">-->
<!-- <!–配置前置通知 –>-->
<!-- <aop:before method="log" pointcut-ref="pc1"/>-->
<!-- <!–后置通知–>-->
<!-- <aop:after-returning method="hz" pointcut-ref="pc3"/>-->
<!-- <!–最终通知–>-->
<!-- <aop:after method="zz" pointcut-ref="pc4"/>-->
<!-- <!–异常通知–>-->
<!-- <aop:after-throwing method="yc" pointcut-ref="pc4"/>-->
<!-- <!–环绕–>-->
<!-- <aop:around method="hr" pointcut-ref="pc1"/>-->
<!-- </aop:aspect>-->
<!-- </aop:config>-->
测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class StudentTest {
@Autowired
private StudentDao dao;
@Test
public void test2() {
dao.add();
dao.upd();
dao.del();
dao.find();
dao.ex();
}
}
测试结果,这是加了异常后的,不加异常的话得把dao包里的继承接口的类里的(1/0)给注解掉.....