• spring注解整理


    原文链接http://zhhll.icu/2021/02/21/%E6%A1%86%E6%9E%B6/spring/spring%E6%B3%A8%E8%A7%A3%E6%95%B4%E7%90%86/

    spring注解整理

    @Configuration

    使用@Configuration注解来标注的类为配置类,配置类就相当于配置文件,可以在配置类中来配置bean

    @Configuration
    public class MainConfig {
    
        /**
         * bean的类型是返回类型,bean的id默认是方法名称
         * @return
         */
        @Bean
        public Person person(){
            return new Person("张三",18);
        }
    }
    

    Bean

    使用@Bean来标注方法以此来进行bean的实例化,bean的类型是返回类型,bean的id默认是方法名称,可以使用@Bean注解来自定义bean的id以及初始化方法、销毁方法

    public @interface Bean {
        @AliasFor("name")
        String[] value() default {};
    
        @AliasFor("value")
        String[] name() default {};
    
        Autowire autowire() default Autowire.NO;
    
        String initMethod() default "";
    
        String destroyMethod() default "(inferred)";
    }
    
    bean的作用域@Scope

    可以在生成bean的方法上使用@Scope来指定bean的作用域

    • ConfigurableBeanFactory#SCOPE_PROTOTYPE
    • ConfigurableBeanFactory#SCOPE_SINGLETON
    • org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
    • org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
    懒加载@Lazy

    对于单例bean默认是在容器启动的时候加载,可以使用懒加载来使其第一次调用时在进行加载

    在生成bean的方法上使用@Lazy来使用来加载

    bean的条件注册@Conditional

    @Conditional可以标注在类上,也可以标注在方法上,

    public @interface Conditional {
    
       //Condition类数组
       Class<? extends Condition>[] value();
    
    }
    

    可以自定义Condition,需要实现Condition接口

    @Primary

    如果存在多个相同类型的bean,可以使用@Primary注解来标注bean,使得该bean为默认获取到的bean

    工厂bean

    可以使用FactoryBean来使用工厂bean来实例化bean,此时使用personFactoryBean来获取到的是Person的实例

    @Bean
    public PersonFactoryBean personFactoryBean(){
        return new PersonFactoryBean();
    }
    
    public class PersonFactoryBean implements FactoryBean<Person> {
        @Override
        public Person getObject() throws Exception {
            return new Person();
        }
    
        @Override
        public Class<?> getObjectType() {
            return Person.class;
        }
    
        @Override
        public boolean isSingleton() {
            return true;
        }
    }
    

    如果想要获取到FactoryBean本身的实例,可以使用&personFactoryBean来获取

    @ComponentScan

    在配置类上标注组件扫描,相当于<context:component-scan>可以配置扫描的规则,使用basePackages来指定扫描的包,includeFilters和excludeFilters来配置包含或者排除的规则,与配置文件相似

    两个示例

    //排除Controller注解标识的bean
    @ComponentScan(basePackages = {"com.zhanghe.study.spring4.annotation"},excludeFilters = {
            @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
    })
    
    // 只包含Controller注解标识的bean,不要忘记useDefaultFilters = false,与使用配置文件相似
    @ComponentScan(basePackages = {"com.zhanghe.study.spring4.annotation"},
            useDefaultFilters = false,
            includeFilters = {
            @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
    
    })
    

    过滤的类型有以下几种

    • ANNOTATION 按照注解,最常用
    • ASSIGNABLE_TYPE 按照类型
    • ASPECTJ 使用ASPECTJ表达式
    • REGEX 使用正则表达式
    • CUSTOM 使用自定义规则,实现TypeFilter接口

    @Import

    使用Import可以进行组件导入,对于第三包中的所需要用到的bean,没有必要每一个都使用@Bean来进行一个个的实例化,可以使用@Import来直接导入bean组件

    • @Import(要导入的组件名) bean的id默认为全类名

    • @Import(importSelector类) 实现importSelector接口,重写selectImports方法,返回值就是组件全类名的数组

      String[] selectImports(AnnotationMetadata importingClassMetadata);
      
    • @Import(ImportBeanDefinitionRegistrar类) 实现ImportBeanDefinitionRegistrar接口,重写registerBeanDefinitions方法,自己使用registry进行注册某些bean

      void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
      

    @Value

    使用@Value可以为属性进行赋值

    基本数值

    @Value("张三")
    String name;
    

    Spel表达式

    {}

    环境变量中的值(配置文件中的值)

    ${}

    需要引入配置文件,使用@PropertySource

    @PropertySource(value = "classpath:test.properties")
    @Configuration
    public class MainConfig4 {
    
        @Bean
        public TestValue testValue(){
            return new TestValue();
        }
    }
    
    public class TestValue {
    		// 取出配置文件中的值
        @Value("${test.value}")
        private int value;
    }
    

    @EnableAspectJAutoProxy

    在之前为了使@Aspect注解生效需要在配置文件中配置

    <aop:aspectj-autoproxy/>

    而该注解的作用就是使得@Aspect注解生效,开启基于注解的AOP模式,与上述配置功能相同

    @EnableTransactionManagement

    在之前为了使@Transaction注解生效,需要在配置文件中配置

    <tx:annotation-driven transaction-manager="transactionManager"/>

    而是用该注解的作用就是使得@Transaction注解生效,与上述配置功能相同

    由于本身的博客百度没有收录,博客地址http://zhhll.icu

    本文来自博客园,作者:霍家姑爷,转载请注明原文链接:https://www.cnblogs.com/life-time/p/14461823.html 个人博客-> https://zhhll.icu

  • 相关阅读:
    关系数据模型和对象数据模型之间的对应关系
    object中的方法
    重写与重载
    java中的多态总结
    int是java.lang包中可用的类的名称
    abstract关键字的说法
    7迭代器
    6python *args **kwargs
    1特征工程
    1html
  • 原文地址:https://www.cnblogs.com/life-time/p/14461823.html
Copyright © 2020-2023  润新知