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>
相关推荐
API小爬虫3 分钟前
如何设置动态代理提高Python爬虫稳定性?
开发语言·爬虫·python
无名之逆4 分钟前
hyperlane:Rust HTTP 服务器开发的不二之选
服务器·开发语言·前端·后端·安全·http·rust
篝火悟者5 分钟前
自学-python-爬虫入门
开发语言·爬虫·python
Chandler2411 分钟前
Redis:持久化 RDB快照 AOF日志
数据库·redis·缓存
LCY13313 分钟前
redis错误分析 forceUnlock的问题说明
数据库·redis·缓存
老赵骑摩托13 分钟前
Go语言nil原理深度解析:底层实现与比较规则
开发语言·后端·golang
酷爱码14 分钟前
python和Java的区别
java·开发语言
胡斌附体25 分钟前
Qt下载模板到本地文件内容丢失问题
开发语言·qt
Cloud_.41 分钟前
Spring Boot整合Redis
java·spring boot·redis·后端·缓存
盖世英雄酱581361 小时前
Java开发工程师必须掌握的线程知识指南
java