spring注解
@Configuration
告诉spring这是一个配置类(配置类==配置文件)
@Bean
给容器中注册一个bean;类型为返回值的类型;id默认用方法名作为id;
@ComponentScan(value=”要扫描的包”)
包扫描注解
@Scope
调整组件的作用域(默认是单实例)
@Lazy
懒加载(默认单实例bean在容器创建的时候创建)
@Conditional({Condition})
按照一定的条件进行判断,满足条件给容器中注册bean;
Condition实现Condition接口,实现matches方法;
放在类上,统一设置。
@Import,给容器中注册组件方式:
- 包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类]
- @Bean[导入的第三方包里面的组件]
- @Import[快速给容器中导入一个组件];
- @Import(要导入容器中的组件),容器中就会自动注册这个组件,id默认是全类名。
- 实现ImportSelector接口:返回需要导入的组件的全类名数组,方法不要返回null。
- ImportBeanDefinitionRegistrar的实现类。
- 使用spring提供的FactoryBean;默认获取到的是工厂bean调用getObject创建的对象。要获取工厂bean本身,需要给id前面加一个&
生命周期
指定初始化和销毁方法
@Bean(init-method=””,destory-method=””)
初始化:对象创建完成并赋值好,调用初始化方法
销毁:单实例:容器关闭的时候;多实例:容器不会管理这个bean,容器不会调用销毁方法。
让bean实现接口InitializingBean、DisposableBean。
@PostConstruct:在bean创建完成并且属性赋值完成,来进行初始化方法;@PreDistory:销毁时要调用的方法。
BeanPostProcessor:bean的后置处理器,在bean初始化前后进行一些处理工作。
postProcessBeforeInitialization:bean初始化之前调用方法。
postProcessAfterInitialization:在初始化之后工作。
属性赋值
- @Value赋值
- 基本数值
- SpEL表达式:#{}
- ${}:取出配置文件中的值
- @Value赋值
@PropertySource(value=”classpath:”)
读取外部配置文件
自动装配
- @Autowired;默认优先按照类型去容器中找对应的组件,如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找。
- @Qualifire(“bookDao”);明确指定要装配的id
- @Primary:spring自动装配的时候,默认使用首选的bean;也可以使用@Qualifire明确指定。
- Spring还支持使用@Resource(JSR250)和@Inject(JSR330)[java规范注解]
- @Resource没有支持@Primary和@Autowired(required=false)的功能。
- @Inject:需要先导入javax.inject的包。
- Spring还支持使用@Resource(JSR250)和@Inject(JSR330)[java规范注解]
- 如果组件只有一个有参构造器,@Autowired可以省略。
- @Bean标注的方法创建对象时,方法参数的值从容器中获取。
自定义组件使用spring容器底层的一些组件(ApplicationContext、BeanFactory…),自定义组件实现xxxAware。xxxAware的功能是使用xxxProcessor实现的:
ApplicationContextAware—>ApplicationContextAwareProcessor后置处理器。
@Profile
spring为我们提供的可以根据当前的环境,动态的激活和切换一系列组件的功能。
指定组件在哪个环境的情况下才能注册到容器中。
@Profile(“default”) @Profile(“dev”) @Profile(“test”) @Profile(“prod”) 默认是default
使用命令行动态参数切换 (在虚拟机参数位置) -Dspring.profiles.active=test 激活test环境
使用代码的方式
applicationContext.getEnvironment().setActiveProfiles("test")
没有标注@Profile的bean,在所有环境下都会注册到容器。