1、常用到的注解列表-bean相关

烟雨 5年前 (2021-05-26) 阅读数 322 #Spring
文章标签 Spring

1、@Configuration

告诉Spring这是一个配置类。替换一以前的xml配置文件。
被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义、初始化Spring容器。

2、@ComponentScan

包扫描,想到与xml中的<context:component-scan>
@ComponentScan 这个注解上,也是可以指定要排除哪些包或者是只包含哪些包来进行管理:里面传是一个Filter[]数组。

includeFilters:指定在扫描的时候,需要包含哪些组件。

excludeFilters:定在扫描的时候,需要排除哪些组件。

image.png

@Configuration
//批量定义多个扫描规则
@ComponentScans(value = {
       @ComponentScan(value = "com.zender", excludeFilters = {
                /**
                 * 这里面是一个@Filter注解数组。
                 * FilterType.ANNOTATION表示的排除的规则:按照注解的方式来进行排除.
                 * 排除规则有:
                 *      FilterType.ANNOTATION:按照注解
                 *      FilterType.ASSIGNABLE_TYPE:按照给定的类型
                 *      FilterType.ASPECTJ:使用ASPECTJ表达式
                 *      FilterType.REGEX:使用正则表达式
                 *      FilterType.CUSTOM:自定义
                 * classes = {Controller.class,Service.class}表示的是标有这些注解的类给排除掉
                 */
                @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class, Service.class})
        }),
        @ComponentScan(value = "com.zender", includeFilters = {
             	//自定义包扫描,classes中的类必须要实现TypeFilter接口。
                @ComponentScan.Filter(type = FilterType.CUSTOM, classes = MyTypeFilter.class)
        }),
})
public class MainConfig {
    @Bean
    public Person initPerson(){
        Person person = new Person();
        person.setName("张三");
        person.setAge(18);
        return person;
    }
}

3、@Scope

这个注解来指定作用域的范围:这个就相当于在xml文件中配置的<bean>标签里面指定scope=“prototype” 属性。
  • singleton : 单例bean实例,Spring中的bean默认都是单例的。

  • prototype : 每次请求都会创建一个新的bean实例。

  • request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。

  • session : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP sessio内有效。

ConfigurableBeanFactory#SCOPE_PROTOTYPE prototype //多实例的 创建时机:调用getBean()获取的时候去创建bean的实例。
ConfigurableBeanFactory#SCOPE_SINGLETON singleton //单实例的 创建时机:IOC容器在启动的时候,就会将容器中所有作用域为单例的bean的实例给创建出来。
// web环境
org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST //同一次请求创建一个实例
org.springframework.web.context.WebApplicationContext#SCOPE_SESSION //同一个session创建的一个实例

4、@Lazy

懒加载:是专门针对于单实例的bean的。
  • 单实例的bean:默认是在容器启动的时候创建对象。

  • 懒加载:容器启动的时候,不创建对象,而是在第一次使用(获取)Bean的时候来创建对象,并进行初始化。

5、@Conditional

按照条件类动态注册bean。可以写在类上,方法上。

条件类需要实现Conditon接口。
/**
 * 判断是否是Linux系统
 **/
public class LinuxConditional implements Condition {
    /**
     * @param context  判断条件所使用的上线下文环境
     * @param metadata 注释信息
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        //1.能获取到IOC容器里面的BeanFactory
        //ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        //2.获取类加载器
        //ClassLoader classLoader = context.getClassLoader();
        //3.能获取当前环境的信息
        Environment environment = context.getEnvironment();
        //4.获取到bean定义的注册类
        BeanDefinitionRegistry registry = context.getRegistry();
        //获取操作系统
        String property = environment.getProperty("os.name");
        if (property.contains("linux")) {
            return true;
        }
        return false;
    }
}
//根据条件类返回值来是否加载bean
@Conditional({WindowsConditional.class})
@Bean("zhangsan")
public Person getPerson(){
    Person person = new Person();
    person.setName("张三");
    person.setAge(20);
    return person;
}

//根据条件类返回值来是否加载bean
@Conditional({LinuxConditional.class})
@Bean("lisi")
public Person getPerson2(){
    Person person = new Person();
    person.setName("李四");
    person.setAge(18);
    return person;
}

6、@Import

@Import的三种用法:
@Import[快速的给容器中导入一个组件]
(1) @Import(要导入容器中的组件);容器中就会自动的注册这个组件,id默认是全类名
(2)ImportSelector :返回需要的组件的全类名的数组;
(3) ImportBeanDefinitionRegistrar : 手动注册bean到容器中
可以批量导入,利用ImportSelector接口批量导入
/**
 * 自定义逻辑返回需要导入的组件
 **/
public class MyImportSelector implements ImportSelector{
    /**
     * importingClassMetadata 当前标注@Import注解的类的所有的注解信息。
     * @return                返回需要的组件的全类名的数组。
     * 返回null会报空指针异常。
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[0];
    }
}

使用ImportBeanDefinitionRegistrar接口注册组件 。

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    /**
     * AnnotationMetadata 当前类的注解信息
     * BeanDefinitionRegistry BeanDefinition注册类
     * 我们把所有需要添加到容器中的bean通过BeanDefinitionRegistry里面的registerBeanDefinition方法来手动的进行注册
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //判断IOC容器里面是否含有这两个组件
        boolean definition = registry.containsBeanDefinition("com.ldc.bean.Red");
        boolean definition2 = registry.containsBeanDefinition("com.ldc.bean.Blue");
        //如果有的话,我就把RainBow的bean的实例给注册到IOC容器中
        if (definition && definition2) {
            //指定bean的定义信息,参数里面指定要注册的bean的类型:RainBow.class
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
            //注册一个bean,并且指定bean名
            registry.registerBeanDefinition("rainBow", rootBeanDefinition );
        }
    }
}

还有一种注册组件方法,实现FactoryBean接口。

//创建一个Spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {

    //返回一个Color对象,这个对象会添加到容器中
    @Override
    public Color getObject() throws Exception {
        System.out.println("ColorFactoryBean...getBean...");
        return new Color();
    }

    //返回的类型
    @Override
    public Class<?> getObjectType() {
        return Color.class;
    }

    //控制是否为单例
    // true:表示的就是一个单实例,在容器中保存一份
    // false:多实例,每次获取都会创建一个新的bean
    @Override
    public boolean isSingleton() {
        return true;
    }
}

7、@Autowired、@Component、@Repository、@Service、@Controller

  • @Autowired:自动导入对象到类中,被注入进的类同样要被Spring容器管理比如:Service 类注入到Controller类中。

  • @Component :通用的注解,可标注任意类为Spring组件。如果一个Bean不知道属于哪个层,可以使用@Component注解标注。

  • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。

  • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到Dao层。

  • @Controller : 对应Spring MVC控制层,主要用户接受用户请求并调用Service层返回数据给前端页面。

8、@RestController

@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器 bean,并且是将函数的返回值直接填入HTTP响应体中,是REST风格的控制器。

版权声明

非特殊说明,本文由Zender原创或收集发布,欢迎转载。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

作者文章
热门