Spring中常用的注解

1、 @Configuration

​ 表明这个一个配置类,主要用于配置Bean。例如通过@Bean注解往IOC容器中添加Bean

@Configuration
public class MainConfig {

    @Bean
    public Person Person(){
        return new Person();
    }
}

再使用AnnotationConfigApplicationContext类传入这个配置类

public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println(ctx.getBean("Person")); //获取实例
    }
}

2、@ComponetScan

​ 可以扫描指定包下的带有@Componet、@Service等注解的类,并把他们加入到IOC容器中,就可以不用自己去@Bean注解手动返回一个Bean了。

@Configuration
@ComponentScan(basePackages = "service")
public class MainConfig {}

3、@Scope

​ 使用@Scope注解指定Bean的作用域,一般与@Bean注解一起作用于方法上,或者与Compoent注解作用在类上。其共有四种作用域

singleton 单例(默认)

prototype 多例

request 同一请求

session 同一回话

​ 在使用Application接口的话,单例默认是非懒加载的,多例是懒加载的

4、Import

​ 除开@ComponetSan+@Service、@Controller.. 和@Bean,Import也可以往IOC容器中加入组件

@Configuration
@Import({Person.class, Cat.class}) //默组件id是类的全路径名称
public class MainConfig {
}
ImportSelecotr

​ 通过@Import中的ImportSelector可以指定类名称

public class ZhaiImportSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"entity.Cat"};
    }
}
@Configuration
@Import({Person.class, ZhaiImportSelector.class})
public class MainConfig {
}
ImportBeanDefinitionRegister

通过@Import中的ImportBeanDefinitionRegister可以指定Bean的名称

public class ZhaiImportDefinitionRegister implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        RootBeanDefinition definition = new RootBeanDefinition(Cat.class);
        registry.registerBeanDefinition("MyCat", definition); //指定Bean的名称
    }
}
@Configuration
@Import({Person.class, ZhaiImportSelector.class, ZhaiImportDefinitionRegister.class})
public class MainConfig {
}

5、Bean的初始化方法和销毁方法

Bean的声明周期
  1. 注册bean定义信息到容器中 -> 执行构造方法 -> 属性赋值 -> 初始化 ->销毁
  2. 单例模式下,容器启动时,bean对象就初始化了,当容器销毁时也会调用bean对象的destory方法
  3. 多例模式下,容器启动时,bean对象不会被初始化,而是当调用是才会被初始化。并且bean销毁不受容器管理,而是有GC回收。
指定bean的初始化方法和销毁方法
  1. 实现InitializingBean和DisposableBean

    public class Person implements InitializingBean, DisposableBean {
    
        public Person(){
            System.out.println("我是人类,这是我的构造方法");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("调用了销毁方法");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("调用了初始化方法");
        }
    }
    
  2. 手动指定

    @Configuration
    public class MainConfig {
    
        @Bean(initMethod = "init", destroyMethod = "destroy")
        public Person Person(){
            return new Person();
        }
    }
    
posted @ 2020-11-18 15:19  zcr小翟  阅读(160)  评论(0编辑  收藏  举报