• spring常用注解+Aop


    1、扫包

    1. 扫描指定类文件
       @ComponentScan(basePackageClasses = Person.class)
    2. 扫描指定包,使用默认扫描规则,即被@Component, @Repository, @Service, @Controller或者已经声明过@Component自定义注解标记的组件;
       @ComponentScan(value = "com.yibai")
    3. 扫描指定包,加载被@Component注解标记的组件和默认规则的扫描(因为useDefaultFilters默认为true)
       @ComponentScan(value = "com.yibai", includeFilters = { @Filter(type = FilterType.ANNOTATION, value = Component.class) })
    4. 扫描指定包,只加载Person类型的组件
       @ComponentScan(value = "com.yibai", includeFilters = { @Filter(type = FilterType.ASSIGNABLE_TYPE, value = Person.class) }, useDefaultFilters = false)
    5. 扫描指定包,过滤掉被@Component标记的组件
       @ComponentScan(value = "com.yibai", excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = Component.class) })
    6. 扫描指定包,自定义过滤规则
       @ComponentScan(value = "com.yibai", includeFilters = { @Filter(type = FilterType.CUSTOM, value = ColorBeanLoadFilter.class) }, useDefaultFilters = true)

    示例:

    boy类

    package com.xiangwen.test;
    
    import com.xiangwen.test.aop.IBuy;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Boy implements IBuy {
        @Override
        public String buy() {
            System.out.println("男孩买了一个游戏机");
            return "游戏机";
        }
    }

    扫包

    package com.xiangwen.test.aop;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ComponentScan( "com.xiangwen.test")
    public class AppConfig {
    }

    运行

    package com.xiangwen.test.aop;
    
    import com.xiangwen.test.Boy;
    import com.xiangwen.test.Girl;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class AppTest {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
            Boy boy = context.getBean("boy",Boy.class);
            Girl girl = (Girl) context.getBean("girl");
            boy.buy();
            girl.buy();
        }
    }

     2、AOP

    package com.xiangwen.test.aop;
    
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class BuyAspectJ {
        @Before("execution(* com.xiangwen.test.aop..*.*(..))")
        public void haha(){
            System.out.println("男孩女孩都买自己喜欢的东西");
        }
    }

    execution表达式

     5种通知类型

     通过@Pointcunt来定义一个切点

    package com.xiangwen.test.aop;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class BuyAspectJ {
        @Pointcut("execution(* com.xiangwen.test.aop..*.*(..))&& args(price)")
        public void myPonit(double price){};
    
        @Before("execution(* com.xiangwen.test.aop..*.*(..))")
        public void haha(){
            System.out.println("before男孩女孩都买自己喜欢的东西");
        }
    
        @After("myPonit(price)")
        public void After(double price){
            System.out.println("after男孩女孩都买自己喜欢的东西");
        }
        @Around("myPonit(price)")
        public String testAround(ProceedingJoinPoint px,double price){
            try {
                System.out.println("around....start");
                px.proceed();
                System.out.println("around....end");
                if(price>50){
                    return "香蕉";
                }
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
    
            return "橘子";
        }
    }

    扩展:Spring注解常用汇总

    使用注解之前要开启自动扫描功能

    其中base-package为需要扫描的包(含子包)

    <context:component-scan base-package=“cn.test”/>
    @Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
    @Scope注解 作用域
    @Lazy(true) 表示延迟初始化
    @Service用于标注业务层组件、
    @Controller用于标注控制层组件(如struts中的action)
    @Repository用于标注数据访问组件,即DAO组件。
    @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
    @Scope用于指定scope作用域的(用在类上)
    @PostConstruct用于指定初始化方法(用在方法上)
    @PreDestory用于指定销毁方法(用在方法上)
    @Resource 默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
    @DependsOn:定义Bean初始化及销毁时的顺序
    @Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常。(只对接口的多个实现生效)
    @Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用
    @Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用

  • 相关阅读:
    vue 设置请求超时时间处理
    element 表格只展开一行(点击下一行上一行关闭)
    element菜单刷新后定位问题?
    自己觉得不错的滚动条样式
    $.ajax()方法详解
    安卓获取自有证书的SHA1码
    sortable.js 拖拽排序及配置项说明
    uni-app 引入本地iconfont的正确姿势以及阿里图标引入
    mui slider禁止滑动
    stl源码剖析 详细学习笔记 仿函数
  • 原文地址:https://www.cnblogs.com/wenwenzuiniucha/p/14755681.html
Copyright © 2020-2023  润新知