深入认识Spring两大特性IOC和AOP

命运对每个人都是一样的,不一样的是各自的努力和付出不同,付出的越多,努力的越多,得到的回报也越多,在你累的时候请看一下身边比你成功却还比你更努力的人,这样,你就会更有动力。

导读:本篇文章讲解 深入认识Spring两大特性IOC和AOP,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

众所周知,Spring有两大特性:Ioc和Aop。

IOC:英文全称是Inversion of Control,意为控制反转/依赖注入。

AOP:英文全称是Aspect-Oriented Programming,意为面向切面编程。

总的来说,Spring是一个轻量级的控制反转(Ioc)和面向切面编程(Aop)的容器框架.

Spring常用注解

注解名称

备注
@Controller 标注控制层
@Service 标注服务层
@Component 标注此类是Spring管理的组件
@Autowired 按类型自动装配
@Resource 按名称自动装配

控制反转ioc

通常我们实例化一个对象时,都是使用类的构造方法new一个对象,这个过程是我们自己来控制的,而ioc是把new对象的工作交给了Spring容器。

依赖注入

Spring依赖注入的方式主要有4个:基于注解注入方式、set注入方式、构造器注入、静态方法注入。目前大都使用的是注解注入,配置少,比较方便

基于注解注入示例

控制层

@Controller
public class UsersController {
    @Autowired
    private UsersService usersService;
}

我们可以使用@Autowired或@Resource来装配bean,它们的区别在于:

@Autowired默认按类型自动装配,默认要求依赖对象必须存在,如果要允许为Null,需设置required = false

@Controller
public class UsersController {
    @Autowired(required = false)
    private UsersService usersService;
}

@Resource默认按名称自动装配,名称可以通过name属性来指定,如果不指定,当注解写在字段上,默认取字段名进行装配;

如果写在setter方法上,默认取属性名进行装配。当找不到与名称相匹配的Bean时,会按照类型进行装配。

服务层

@Service
public class UsersServiceImpl implements UsersService {
}

面向切面aop

面向切面编程,通俗的讲共有功能的实现。

比如:每个接口都会调用方法,我们想记录这些调用返回的信息,不需要每一个都进行日志或其他方式记录,通过aop的概念,处理一次即可。

aop通知类型

注解名称 备注
@Before 前置通知,在方法调用前执行
@After 后置通知,在方法调用后执行
@Around 环绕通知,包裹了被通知的方法,在被通知的方法调用之前之后执行自定义的行为。
@AfterReturning 返回通知,目标方法成功执行后调用通知
@AfterThrowing 异常通知,在目标方法抛出异常后调用通知

@Pointcut语法

任意公共方法的执行: 
execution(public * *(..)) 
任何一个以“set”开始的方法的执行: 
execution(* set*(..)) 
AccountService 接口的任意方法的执行: 
execution(* com.xyz.service.AccountService.*(..)) 
定义在service包里的任意方法的执行: 
execution(* com.xyz.service.*.*(..)) 
定义在service包和所有子包里的任意类的任意方法的执行: 
execution(* com.xyz.service..*.*(..)) 

使用Aop

第一步:引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

创建一个类

@Log4j2
@Aspect
@Component
public class AopTest {
    /**
     * 指定切入点(可以是方法)
     * service下所有的方法
     */
    @Pointcut("execution(* com.ssw.core.service.*.*(..))")
    public void aopTest(){}

    /**
     * 前置通知
     * @param joinPoint
     */
    @Before("aopTest()")
    public void doBefore(JoinPoint joinPoint){
        log.info("即将进入方法:{}",joinPoint.getSignature().getName());
        List<Object> params=Arrays.asList(joinPoint.getArgs());
        log.info("输入参数为:{}",params);
    }

    /**
     * 后置通知
     * @param joinPoint
     */
    @After("aopTest()")
    public void doAfter(JoinPoint joinPoint){
        log.info("执行完成方法:{}",joinPoint.getSignature().getName());
    }
}

写一个get的测试方法

深入认识Spring两大特性IOC和AOP

深入认识Spring两大特性IOC和AOP

输入参数在进行输出,调用查看下效果

深入认识Spring两大特性IOC和AOP

深入认识Spring两大特性IOC和AOP

接下来重点介绍下@Around,环绕通知,该方法可以包含@Before、@After、@AfterThrowing、@AfterRunning。

环绕通知的功能最全面,需要携带ProceedingJoinPoint 类型的参数,且必须有返回值,返回值为目标方法的返回值。

示例如下:

/**
     * 环绕通知
     * @param joinPoint
     * @return
     */
    @Around("aopTest()")
    public Object doAround(ProceedingJoinPoint joinPoint){
        //返回结果
        Object result=null;
        String methodName=joinPoint.getSignature().getName();
        //1.前置通知
        log.error("前置通知=====>方法名:{},方法参数:{}",methodName,Arrays.asList(joinPoint.getArgs()));
        //执行目标方法
        try {
            result=joinPoint.proceed();
            //2.返回通知方法
            log.error("返回通知=====>返回结果:{}",result);
        } catch (Throwable throwable) {
            //3.异常通知方法
            log.error("异常通知=====>方法名:{}",methodName);
            throwable.printStackTrace();
        }
        //4.后置通知
        log.error("后置通知=====>{}",methodName);
        return result;
    }

调用方法

深入认识Spring两大特性IOC和AOP

可以看到环绕通知包含了4中通知方法

至此Spring的两大特性就介绍完了。

如果您觉得有用,记得关注下哦。

深入认识Spring两大特性IOC和AOP

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/143385.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!