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的声明周期
- 注册bean定义信息到容器中 -> 执行构造方法 -> 属性赋值 -> 初始化 ->销毁
- 单例模式下,容器启动时,bean对象就初始化了,当容器销毁时也会调用bean对象的destory方法
- 多例模式下,容器启动时,bean对象不会被初始化,而是当调用是才会被初始化。并且bean销毁不受容器管理,而是有GC回收。
指定bean的初始化方法和销毁方法
-
实现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("调用了初始化方法"); } }
-
手动指定
@Configuration public class MainConfig { @Bean(initMethod = "init", destroyMethod = "destroy") public Person Person(){ return new Person(); } }