Spring学习笔记(Spring注解驱动)

Spring学习笔记(Spring注解驱动),第1张

Spring学习笔记(Spring注解驱动) 一、组件注册

1.@Configuration & @Bean 给容器中注册组件
        配置文件 == 配置类
        @Configuration 告诉Spring这是一个配置类
        @Bean
                给容器中注册一个Bean
                类型为返回值的类型
                id默认是用方法名作为id
                @Bean("id") 指定Bean的id

2.@ComponentScan 自动扫描组件 & 指定扫描规则
        @ComponentScan(value = "")
                value: 指定要扫描的包
        @ComponentScan(value = "", excludeFilters = {Filter})
                excludeFilters  指定扫描时按照什么规则排除某些组件
                includeFilters  指定扫描时按照什么规则包含某些组件
                * 使用includeFilters时需注意:
                        在ComponentScan中,有定义的默认规则生效,so指定其属性为false以禁用默认规则。
        @Filter(type = FilterType, classes = {Class})
                FilterType
                ANNOTATION      根据注解
                ASPECTJ      根据aspectj表达式
                ASSIGNABLE_TYPE      根据类型(给定类型: 子类、实现类)
                CUSTOM      根据自定义规则
                REGEX      根据正则表达式
                Class      排除规则的class
        @ComponentScans(value = {@ComponentScan})
                value: 指定多个@ComponentScan

3.自定义 TypeFilter 指定过滤规则
        实现TypeFilter接口重写match方法
                返回true    匹配成功
                返回false   匹配失败
                metadataReader:读取到的当前正在扫描的类的信息
                metadataReaderFactory:可以获取到其他任何类的信息
                通过metadataReader获取类的各种信息

4.@Scope 设置组件作用域
        @Bean 默认是单实例
        @Scope(value)
                prototype   多实例,IOC容器启动不会调用方法创建对象放在容器中,每次获取的时候才会调用方法创建对象。
                singleton   单实例(默认值),IOC容器启动时会调用方法创建对象放到IOC容器中。
                request     同一次请求创建一个实例
                session     用一个sesion创建一个实例

5.@Lazy bean懒加载
        单实例Bean   默认在容器启动时创建对象
        懒加载      容器启动不创建对象,第一次使用(获取)Bean创建对象,并初始化。

6.@Conditional 按照条件注册bean
        类上
                类中组件统一设置。满足当前条件,这个类中配置的所有bean注册才能生效。
        方法上
                按照条件注册bean,满足条件给容器中注册Bean。
                @Conditional(value = {Condition})
                value
                        实现Condition接口并实现matches方法
                        ConditionContext 判断条件能使用的上下文(环境)
                        通过ConditionContext可以获取到所需的各种信息  

7.@import 给容器快速导入一个组件
        @import(value = {Class})
                id默认是组件的全类名

8.@import 使用 importSelector
        importSelector 返回需要导入的组件的全类名的数组
        实现importSelector接口重写selectimports方法,返回值就是要导入到容器中的组件全类名。
        Annotationmetadata  当前标注@import注解的类的所有注解信息
        方法不要返回null,容器在使用此值时会调用其length属性,出现NPE。

9.@import 使用 importBeanDefinitionRegistrar
        importBeanDefinitionRegistrar  手动注册Bean到容器中
        实现importBeanDefinitionRegistrar接口重写registerBeanDefinitions方法
        Annotationmetadata  当前标注@import注解的类的所有注解信息
        BeanDefinitionRegistry  BeanDefinition注册类
        把所有需要添加到容器中的Bean 调用BeanDefinitaionRegistry.registerBeanDefinition 手工注册进来。
        指定Bean的定义信息
                RootBeanDefinition beanDefinitionRegistry = new RootBeanDefinition(Class);
        注册一个Bean,指定bean名
                registry.registerBeanDefinition("id", beanDefinitionRegistry);

10.使用FactoryBean注册组件
        FactoryBean 使用Spring提供的FactoryBean(工厂Bean)
        实现FactoryBean接口实现其中方法
        getObject()  返回一个T类型对象,这个对象会添加到容器中
        getObjectType()  返回对象的Class
        isSingleton()  是否是单例
                true 这个Bean是单实例,在容器中保存一份。
                false 多实例,每次获取都会创建一个新的Bean。
        @Bean装配自定义FactoryBean实现类后,通过容器获取,则会返回一个工厂内定义的泛型对象。
        @Bean装配自定义FactoryBean实现类后,通过容器获取其时添加&前缀,则会返回此工厂Bean。

11.给容器中注册组件
        包扫描 + 组件标注注解(@Controller、@Service、@Repository、@Component)
        @Bean(导入第三方包里的组件)
        @import快速的给容器中导入一个组件
                @import(value = {Class})        id默认是组件的全类名
                importSelector        返回需要导入的组件的全类名的数组
                importBeanDefinitionRegistrar        手动注册Bean到容器中
        使用Spring提供的FactoryBean(工厂Bean)
                默认获取到的是工厂Bean调用getObject创建的对象
                要获取工厂Bean本身,我们需要给id前面加一个 &

二、生命周期

bean创建---初始化----销毁的过程
        容器管理bean的生命周期
        我们可以自定义初始化和销毁方法
        容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
        构造(对象创建)
                单实例:在容器启动的时候创建对象
                多实例:在每次获取的时候创建对象

        1.@Bean指定初始化和销毁方法
                通过@Bean指定init-method和destroy-method
                @Bean(initMethod="init",destroyMethod="detory")

        2.InitializingBean 和 DisposableBean
                通过让Bean实现并重写其中方法
                        InitializingBean(定义初始化逻辑) destroy()
                        DisposableBean(定义销毁逻辑) afterPropertiesSet()

        3.@PostConstruct & @PreDestroy
                标注在bean方法上
                @PostConstruct
                        在bean创建完成并且属性赋值完成时来执行初始化方法
                @PreDestroy
                        在容器销毁bean之前通知我们进行清理工作

        4.BeanPostProcessor-后置处理器
                BeanPostProcessor.postProcessBeforeInitialization
                        初始化
                                对象创建完成,并赋值好,调用初始化方法。
                BeanPostProcessor.postProcessAfterInitialization
                        销毁:
                                单实例:容器关闭的时候
                                多实例:容器不会管理这个bean,容器不会调用销毁方法。
                遍历得到容器中所有的BeanPostProcessor;挨个执行beforeInitialization,一但返回null,跳出for循环,不会执行后面的BeanPostProcessor.postProcessorsBeforeInitialization。

                BeanPostProcessor【interface】:bean的后置处理器
                        在bean初始化前后进行一些处理工作
                        postProcessBeforeInitialization:在初始化之前工作
                        postProcessAfterInitialization:在初始化之后工作

        5.BeanPostProcessor原理
                populateBean(beanName, mbd, instanceWrapper);给bean进行属性赋值
                initializeBean
                {
                        applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
                        invokeInitMethods(beanName, wrappedBean, mbd);//执行自定义初始化
                        applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
                }

        6.BeanPostProcessor在Spring底层的使用
                bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor。

   
三、属性赋值

1.@Value赋值
        基本数值
                @Value("张三")
                        可以写SpEL
                #{}
                @Value("#{20-2}")
                        可以写${}
                取出配置文件【properties】中的值(在运行环境变量里面的值)
                @Value("${person.nickName}")
                @Bean标注的方法创建对象的时候,方法参数的值从容器中获取。

2.@PropertySource加载外部配置文件
        使用@PropertySource读取外部配置文件中的k/v保存到运行的环境变量中
        加载完外部的配置文件以后使用${}取出配置文件的值

四、自动装配

Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值。

1.@Autowired & @Qualifier & @Primary
        1)默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);找到就赋值。
        2)如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
applicationContext.getBean("bookDao")
        3)@Qualifier("bookDao"):使用@Qualifier指定需要装配的组件的id,而不是使用属性名。
        4)自动装配默认一定要将属性赋值好,没有就会报错;可以使用@Autowired(required=false);
        5)@Primary:让Spring进行自动装配的时候,默认使用首选的bean;也可以继续使用@Qualifier指定需要装配的bean的名字。
2.@Resource & @Inject
        Spring还支持使用@Resource(JSR250)和@Inject(JSR330)[java规范的注解]
                @Resource:
                        可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的;
                        没有能支持@Primary功能没有支持@Autowired(reqiured=false);
                @Inject:
                    需要导入javax.inject的包,和Autowired的功能一样。没有required=false的功能;
        @Autowired:Spring定义的; @Resource、@Inject都是java规范
        AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能

3.方法、构造器位置的自动装配
        默认加在IOC容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等 *** 作。
        @Autowired:构造器,参数,方法,属性;都是从容器中获取参数组件的值
                1)[标注在方法位置]:@Bean+方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配。
                2)[标在构造器上]:如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还可以自动从容器中获取。

4.Aware注入Spring底层组件&原理
        自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFactory,xxx);
                自定义组件实现xxxAware;在创建对象的时候,会调用接口规定的方法注入相关组件;Aware;
                把Spring底层一些组件注入到自定义的Bean中;
                xxxAware:功能使用xxxProcessor;
                        ApplicationContextAware==》ApplicationContextAwareProcessor;

5.@Profile环境搭建
        Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能;
                开发环境、测试环境、生产环境;
                数据源:(/A)(/B)(/C);
        @Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件。
6.@Profile根据环境注册bean
        1)加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中,默认是default环境。
        2)写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效。
        3)没有标注环境标识的bean在任何环境下都是加载的。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5706916.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存