SpringMVC ,ioc和aop

IOC和AOP

IOC

控制反转,将应用程序的控制权交给spring容器管理,而不是应用程序本身

1.创建一个mapper,测试用, 就写个普通方法
public class UserMapper {
    public void addUser(){
        System.out.println("dao层新增");
    }
}
2.di.xml,将UserMapper注册入spring的bean
<bean id="userMapper" class="mapper.UserMapper"></bean>
3.测试类,从spring的容器里获取对象的实例化权限
public class Test1 {
    @Test
    public void test01() {
        UserMapper userMapper = (UserMapper) context.getBean("userMapper");
        userMapper.addUser();
    
    }
}

AOP

1.创建操作切面类

2.在spring.xml里配置切面和切点

public class LoggerAdvice {
    //创建日志对象
    Logger logger = Logger.getLogger(LoggerAdvice.class);
    //前置增强
    public void before(JoinPoint jp){
        logger.info("前置增强,调用"+jp.getTarget()+"的"+jp.getSignature().getName()
        +"参数是"+ Arrays.toString(jp.getArgs()));
    }
    //后置增强
    public void after(JoinPoint jp,Object ex){
        logger.info("后置增强,调用"+jp.getTarget()+"的"+jp.getSignature().getName()
                +"参数是"+ Arrays.toString(jp.getArgs())+"返回值:"+ex);
    }
    //异常增强
    public void afterThrowing(JoinPoint jp,Exception ex){
        logger.info("异常增强,调用"+jp.getTarget()+"的"+jp.getSignature().getName()
                +"参数是"+ Arrays.toString(jp.getArgs())+"异常:"+ex.getMessage());
    }
    //环绕增强
    public void around(ProceedingJoinPoint pj){
        try {
            logger.info("前置增强,调用"+pj.getTarget()+"的"+pj.getSignature().getName()
                +"参数是"+ Arrays.toString(pj.getArgs()));
            logger.info("后置增强,调用"+pj.getTarget()+"的"+pj.getSignature().getName()
                    +"参数是"+ Arrays.toString(pj.getArgs())+"返回值:"+pj.proceed());

        } catch (Throwable e) {
            logger.info("异常增强,调用"+pj.getTarget()+"的"+pj.getSignature().getName()
                    +"参数是"+ Arrays.toString(pj.getArgs())+"异常:"+e.getMessage());
            e.printStackTrace();
        }
    }
}

定义切面和切点

在com.j4061.springmybatis.service包及其子包下的所有公共方法执行前后添加日志记录功能

<!-- 1.这里定义了一个名为loggerAdvice的Bean,其类型为com.j4061.springmybatis.util.LoggerAdvice -->
<bean id="loggerAdvice" class="com.j4061.springmybatis.util.LoggerAdvice"></bean>
    <aop:config>
    <!-- 2.定义了切入点表达式,表示匹配com.j4061.springmybatis.service包及其子包下所有公共方法的执行。这里的public*表示任何返回类型的公共方法,*.*表示任何类中的任何方法,(..)表示接受任意数量和类型的参数 -->
    <aop:pointcut id="loggerOpintCut" expression="execution(public * com.j4061.springmybatis.service..*.*(..))"/>
        <aop:aspect ref="loggerAdvice">
        <!-- 前置增强 -->
           <aop:before method="before" pointcut-ref="loggerOpintCut"></aop:before>
           <!-- 后置增强 -->
           <aop:after-returning returning="ex" method="after" pointcut-ref="loggerOpintCut"></aop:after-returning>
           <!-- 异常增强 -->
           <aop:after-throwing method="afterThrowing" throwing="ex" pointcut-ref="loggerOpintCut"></aop:after-throwing>
           <!-- 环绕增强 -->
            <aop:around method="around" pointcut-ref="loggerOpintCut"></aop:around>
        </aop:aspect>
    </aop:config>
相关推荐
Rverdoser1 分钟前
【SQL】多表查询案例
数据库·sql
Galeoto4 分钟前
how to export a table in sqlite, and import into another
数据库·sqlite
李白同学9 分钟前
【C语言】结构体内存对齐问题
c语言·开发语言
人间打气筒(Ada)32 分钟前
MySQL主从架构
服务器·数据库·mysql
leegong2311133 分钟前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白35 分钟前
PostgreSQL:更新字段慢
数据库·postgresql
敲敲敲-敲代码36 分钟前
【SQL实验】触发器
数据库·笔记·sql
和道一文字yyds38 分钟前
MySQL 中的索引数量是否越多越好?为什么?如何使用 MySQL 的 EXPLAIN 语句进行查询分析?MySQL 中如何进行 SQL 调优?
数据库·sql·mysql
黑子哥呢?1 小时前
安装Bash completion解决tab不能补全问题
开发语言·bash
落笔画忧愁e1 小时前
FastGPT快速将消息发送至飞书
服务器·数据库·飞书