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-methoddestory-method

如果添加了@Scop(“prototype”)注解,容器不会管理这个bean

通过让bean实现InitializingBean(定义初始化逻辑)

*                   实现DisposableBean(定义销毁逻辑)

配置@Component主键注解

运行情况如下

可以用JSR250
*             @PostConstruct:
Bean创建完成,并且属性赋值完成,来执行初始化;
*             @PreDestroy:在容器销毁Bean之前通知我们进行清理工作;

BeanPostProcessorinterface: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完成的