IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> IoC 及 AOP 使用扩展 -> 正文阅读

[Java知识库]IoC 及 AOP 使用扩展

目录

1.IOC的注入方式扩展:

1.1.IOC构造注入 (constructor-arg):

1.2 设值注入(set) 与构造注入的区别

?1.3 集合、数组、Map、Properties类型注入

2. AOP扩展使用

异常通知: 在出现异常时,Spring AOP会自动捕获异常,并使用代理对象处理。

最终通知 Spring AOP的最终通知是通过finally实现的,无论发生任何情况,都会执行。

环绕通知???? 环绕通知功能非常强大,包含了四种全部通知类型,主要是通过暴露的原生方法调用所执行的目标方法,因此可以获取到原生方法的所有状态加以处理

3. 使用注解实现IoC及DI依赖注入

3.1 在配置文件中打开包扫描机制

3.2 注解实现IoC (直接使用注解实现加载到容器当中)

3.3 使用Autowired或者是Resources来完成DI依赖注入

4.以Annotation注解形式实现AOP

4.1自定义一个全注解的AOP的类

4.2 在配置文件中,添加开启自动代理的功能,不然Annotation不会运行


1.IOC的注入方式扩展:

??????? 以往我们完成注入的方式是通过基本参数类型进行注入,那么引用数据类型呢?答案当然是可以的,接下来,来学习其他注入的几种方式:

1.1.IOC构造注入 (constructor-arg):

????????使用内部bean

????????使用ref引用形式

??????? index(按位置) type (按类型) name(按名称)

?? ????????日期格式注入

1.2 设值注入(set) 与构造注入的区别

?1.3 集合、数组、MapProperties类型注入

2. AOP扩展使用

//添加依赖
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.9.1</version>
</dependency>

异常通知: 在出现异常时,Spring AOP会自动捕获异常,并使用代理对象处理。

最终通知 Spring AOP的最终通知是通过finally实现的,无论发生任何情况,都会执行。

环绕通知???? 环绕通知功能非常强大,包含了四种全部通知类型,主要是通过暴露的原生方法调用所执行的目标方法,因此可以获取到原生方法的所有状态加以处理

3. 使用注解实现IoCDI依赖注入

3.1 在配置文件中打开包扫描机制

3.2 注解实现IoC (直接使用注解实现加载到容器当中)

在使用以上注解时,能够给每一个组件进行重命名。默认情况下,以首字母小写的形式,存储到
IoC 容器之中。

3.3 使用Autowired或者是Resources来完成DI依赖注入

???????? 1.@Autowird : 按照类型实现自动装配,也就意味着在容器中必须拥有对应类型。如果出现了多个要 注入的类型,此时,IoC容器就会发现不知道该如何注入,可以通过@Qualifier来完成以名称为标识进行注入。

????????????????????????????????????????????? 添加依赖:

假如在同一个项目中,有两个或以上的类实现了 UserService 接口,按以上写法就会产生异常。会
告诉使用者在注入时根据类型找到了两个或两个以上的实现类,无法实现自动注入。
解决方案 是通过在注入时,添加 @Qulifier ,该注解是实现通过名称辅助 @Autowired 实现自动注
入。
@Autowired
@Qualifier ( "userService" )?? // 在没有自定义的情况下,采用要找到的类的名称首字母小写。
private UserService userService ;

2.????????Resource:按照 名称 进行装配,若通过名称没有找到对应名字的对象,就会应用 Type 方式继续查 找,如果都没有找到就会报错。在 Spring 中,加入了注解后,会将对应的类名,以首字母小写的形 式,存储到 IoC 容器之中,作为 Resource 会自动以 ByName 的方式进行匹配。
如果也出现了两个实现类的情况,对于 Resource 的解决方案
@Resource
private UserService userServiceImpl ;

默认情况下Resource会采用名称的匹配方式,要求变量名与被注解修饰的组件名称要一致! 如果不一致,此时Resource就不再通过名称来注入了,而是采用类型方式进行注入!

4.Annotation注解形式实现AOP

4.1自定义一个全注解的AOP的类

package com.csi.proxy;

import org.aopalliance.intercept.Joinpoint;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
@Aspect
public class LogManagerAdvice {
    //构造
    public LogManagerAdvice(){

        System.out.println("建立数据库连接.....");
    }

    @Pointcut("execution(* com.csi.service..*.*(..))")
    public void pointcut(){ }

    //前置增强
    @Before("pointcut()")
    public void before(JoinPoint joinpoint){

        System.out.println("被增强的类:"+joinpoint.getTarget().getClass().getName()
                            + "被拦截的方法:" +joinpoint.getSignature().getName()
                            +"参数是:"+ Arrays.toString(joinpoint.getArgs()));

        System.out.println("开始记录日志。。。。");

    }
    //后置增强
    @AfterReturning(pointcut = "pointcut()",returning = "o")
    public void afterReturning(JoinPoint joinPoint ,Object o){


        System.out.println("结束日志记录。。。");

    }
    //异常通知
    @AfterThrowing(pointcut = "pointcut()",throwing = "e")
    public void afterThrowing(JoinPoint joinPoint,RuntimeException e){

        System.out.println(joinPoint.getTarget()+"的"+joinPoint.getSignature().getName()+",报出的信息是:"+e);

    }
    //最终通知
    @After("pointcut()")
    public void after(JoinPoint joinPoint){

        System.out.println("最终通知:"+joinPoint.getTarget()+"的"+joinPoint.getSignature().getName()+",参数是"+Arrays.toString(joinPoint.getArgs()));

    }

    //环绕通知
    @Around("pointcut()")
    public void afterAround(ProceedingJoinPoint pjp){

        System.out.println("开启事务.....");

        try {
            Object result = pjp.proceed();

            System.out.println("事务提交....");

        } catch (Throwable e) {
            e.printStackTrace();

            System.out.println("事务回滚....");

        }finally {
            System.out.println("释放SqlSession对象");
        }


    }
}

4.2 在配置文件中,添加开启自动代理的功能,不然Annotation不会运行

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-25 23:07:17  更:2022-09-25 23:08:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 4:37:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码