Spring注解驱动
1.容器
组件添加
@Configuration
告诉Spring这是一个配置类
@Bean
在配置类中注册一个Bean,
类型为返回值的类型,id默认为方法名的Id,也可以通过@Bean(“persion”)来命名id
@ConponentScan(”com.atguigu”)
加在配置类的类上,扫描包
可以指定排除规则 @ConponentScan(value=”com.atguigu”,excludeFilters = { @Filter(type=FilterType.ANNOTATION,classes={Controller.class})}):根据注解排除Controller注解
也可以指定包含规则@ConponentScan(value=”com.atguigu”,includeFilters = { @Filter(type=FilterType.ANNOTATION,classes={Controller.class})},useDefaultFilters = false):根据注解只包含Controller注解,前提要禁用掉默认的过滤规则
也可以指定类型@ConponentScan(value=”com.atguigu”,includeFilters = { @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={BookService.class})},useDefaultFilters = false):BookService一定会包含进去
@Scope(“”)
加在@bean上,指定作用范围
值:prototype:多实例,singleton:单实例
多实例:在容器创建时不会被调用,获取几次就调用几次
单实例:在容器创建时被调用,获取的时候直接拿出来即可,多次调用的是一个对象
@Lazy
加在@Bean上,懒加载
转对单实例对象,在容器创建时不会被调用,获取使才会被加载,并且获取的是单例对象
@Conditional({WindowsCondition.class})
可以加在@bean上,根据条件判断(WindowsCondition就是一个自动的判断方法),如果返回true,则该bean会加载容器中
也可以加在类上,返回为true,该类下的所有@Bean都会被加在容器中
@Import({color.class})
加在配置类上,快速加载组件,不需要使用无参构造器+@bean的方式
@Import({MyImportSelector.class})
加在配置类上,加载自定义方法的返回值指定的全类名组件
class MyImportSelector implements ImportSelector{
//实现方法,方法返回值就是需要导入容器中的全类名
return new String[]{"com.atguigu.bean.blue","com.atguigu.bean.red"}
}
@Import({MyImportBeanDefinitionRegister.class})
加在配置类上,加载自定义方法中自定义的组件
class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar{
//实现方法,判断是否存在red组件,如果存在,就自定义创建一个rainbow组件
boolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red");
if(defintion){
//Bean的类型
RootBeanDefinition beanDefintion =new RootBeanDefinition(RainBow.class);
//Bean的id,Bean的类型
registry.registerBeanDefinition("rainbow",beanDefintion)
}
}
FactoryBean创建组件
使用@Bean的方式FactoryBean创建组件,实际上创建的是Color组件
加在配置类中
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}
class ColorFactoryBean implements FactoryBean<Color>(){
//重写getObject:创建bean对象
return new Color()
//重写getObjectType:设置对象类型
return Color.class
//重写isSingleton:设置是否为单例,true为单例
return true
}
如果想获取FactoryBean本身,在获取的时候前面加个&
生命周期
1. @Bean(initMethod=”init”,destoryMethod=”destory”)
指定生命周期方法,init和destory为自己定义的
对象创建:
单实例:在容器启动时创建
多实例:在每次获取时创建
初始化:
- 对象创建完成,并赋值好,调用初始化方法
销毁:
单实例:容器关闭的时候
多实例:容器不会管理Bean,容器不会调用销毁方法
2. 通过让Bean实现InitializingBean和DisposableBean接口
实现destory和Init方法
3. @PostConstruct(初始化)、@PreDestroy(容器移除对象前:销毁)
在Bean的init方法和destory方法中,加上以上两个注解
4. 后置处理器BeanPostProcessor(类似监听器)
写一个后置处理器,实现BeanPostProcessor,
实现两个方法:
postProcessBeforeInitialization:初始化前调用
postProcessAfterInit ialization:初始化后调用
组件赋值
@Value
在Bean的属性上赋值
1.基本数值
2.可以写SpEL #{ }
3.可以写${ },取出配置文件中的值,前提要有@PropertySource加载配置文件
@PropertySource({“classpath:/person.properties”})
加在配置类上,读取外部配置文件中保存的k/v
自动装配(注入)
@Autowired ,Spring定义的
加在属性上,自动装配
1.默认优先按照类型去容器中找对应组件
2.如果找到多个相同类型的组件,再将属性名称作为容器的id在容器中查找
3.@Qualifier(”bookDao”),指定需要装配的id,而不是使用属性名
4.自动装配默认一定要将属性赋值好,没有找到相应组件就会报错
可以使用@Autowired(required=false),没有装配也不会报错
5.@Primary,在没有明确指定时,这个注解是首选装配,忽略属性名
还可以加在有参构造器、参数、方法上,都是从容器中拿到并自动装配,如果只有一个参数,可以省略@Autowired
@Resource(name=””) JSR250,Java规范的注解
可以和@Autowried一样实现自动装配功能,默认按照组件名称装配
不支持@Primary,@Autowired(required=false)功能
@Inject JSR330,Java规范的注解
需要导入javax.inject的包,和Autowired的功能一样
xxxAware
自定义组件实现XXXAware,在创建对象的时候,会调用接口规定的方法注入相关组件
把Spring底层的一些组件注入到自定义的Bean中
@Profile(””)
加在@Bean上,根据环境注册Bean
1.使用命令行动态参数:在虚拟机参数位置加载 -Dspring.profiles.active=test
2.代码的方式激活某种环境
(1)创建一个applicationContext
(2)设置需要激活的环境,applicationContext.getEnvironment().setActiveProfiles(“test”,”dev”)
(3)注册主配置类,applicationContext.register(MainConfigOfProfile.class)
(4)启动刷新容器,applicationContext.refresh()
加在配置类上,只有是该指定的环境,整个配置类才会起作用
没有标注环境标识的Bean,在任何环境下都是加载的