spring注解开发
@Configuration //配置类
@ComponentScans(
value = {@ComponentScan(value = "com.wsy",includeFilters = {
/* @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class, Service.class}),
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {BookService.class}),*/
@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class})
},useDefaultFilters = false)}
)
//ComponentScan value:指定要扫描的包;自动扫描主键&指定扫描规则
//excludeFilters() @ComponentScan.Filter:指定扫描的时候按照什么规则排除那些组件
//includeFilters() @ComponentScan.Filter:指定扫描的时候只需要包含哪些组件;useDefaultFilters:让includeFilters生效
//FilterType.ANNOTATION:按照注解
//FilterType.ASPECTJ:使用ASPECTJ表达式
//FilterType.ASSIGNABLE_TYPE:按照给定的类型
//FilterType.CUSTOM:自定义规则
//FilterType.REGEX:使用正则表达式
@Bean(value = "person") //给容器配置一个bean;类型为返回值类型 id默认是方法名作为id
@Component:把普通pojo实例化到spring容器中,泛指各种组件,就是说当我们的类不属于各种归类的时候,我们就可以使用@Component来标注这个类
@Scope(value = "prototype") 设置组价作用域
* prototype 多实例
* singleton 单实例(默认值) ioc容器启动会直接调用方法创建对象放到ioc容器中,以后每次获取就直接从容器(map。get())里面拿。
* request 同一次请求创建一次实例 ioc容器启动并不会去调用创建对象放在容器中,每次获取的时候,才会调用方法创建对象
* session 同一次session创建一次实例
* 懒加载(@Lazy):容器启动的的时候不创建对象,第一次使用(获取)Bean的时候,创建对象,并初始化
* 单实例bean,默认在容器启动的时候创建
Ioc容器创建的时候不加载,第一次获取的时候才会加载Bean
@Conditional({Condition}):按照一定的条件进行判断,满足条件给容器中注册Bean,不满足条件,容器中就不会注册
Winodws同上。。。
当前环境是Windows环境,所以Linux环境没有注册进来
切换成linux就显示linux系统(edit---VM options修改-Dos.name=linux)
当前环境下是Linux系统,判断容器中是否包含person
将注解放在类上方
启动结果显示无法查找到person,因为当前环境是linux环境,而MainConfig2类上面@Condition({})里面的条件是WindowsCondition.class,所以Windows和person没有注册进来,
切换成windows系统,类上方标注了WindowsCondition.class,根据@Condition筛选只选择了bean@Condition({WindowsCondition.class})下的类以及Mainconfig2下其他被@Bean注解且没有被@Condition({})注解的类的信息,如下
总结:
@Conditional({Condition}):按照一定的条件进行判断,满足条件给容器中注册Bean,不满足条件,容器中就不会注册
@Import:给容器中快速的导入一个组件
/**
* 给容器中注册组件的方式
* 1,包扫描/组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的]
* 2,@Bean
* 3,@Import:给容器中快速的导入一个组件
*/
当前Color类没有注册到容器中去
MainConfig2添加@Import(Color.class)注解后,再次运行如下
使用spring提供的FactoryBean(工厂Bean)注册组件
Bean的生命周期
通过@Bean注解指定初始化和销毁方法;init-method和destory-method
如果添加了@Scop(“prototype”)注解,容器不会管理这个bean
通过让bean实现InitializingBean(定义初始化逻辑);
* 实现DisposableBean(定义销毁逻辑)
配置@Component主键注解
运行情况如下
可以用JSR250
* @PostConstruct:在Bean创建完成,并且属性赋值完成,来执行初始化;
* @PreDestroy:在容器销毁Bean之前通知我们进行清理工作;
BeanPostProcessor【interface】:bean的后置处理器,
* postProcessBeforeInitialization:在初始化之前工作
* postProcessAfterInitialization:在初始化之后工作
遍历得到容器中所有的BeanPostProcessor;挨个执行BeforeInitialization,一旦返回null 跳出for循环不会执行后面的BeforeInitialization
BeanPostProcessor原理
populateBean(beanName, mbd, instanceWrapper);给bean进行属性赋值
(初始化)initializeBean
{
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
invokeInitMethods(beanName, wrappedBean, mbd);执行自定义初始化方法
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
spring底层对BeanPostProcessor的使用
bean赋值,注入其他组件,@Autowired,生命周期注解功能 @Acync(异步请求)等,都是由BeanPostProcessor完成的