• spring注解(1)


    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);    获得ioc容器

    1.@ComponentScan中如果想用includeFilters必须要加上userDefaultFilters=false

    @ComponentScan由于有@Repeatable(ComponentScans.class)注解,所以可以配置多次

    或者是用ComponentScans来配置多个ComponentScan

    //@ComponentScan value:指定要扫描的包
    //excludeFilters = Filter[] :指定扫描的时候按照什么规则排除那些组件
    //includeFilters = Filter[] :指定扫描的时候只需要包含哪些组件
    //FilterType.ANNOTATION:按照注解
    //FilterType.ASSIGNABLE_TYPE:按照给定的类型;
    //FilterType.ASPECTJ:使用ASPECTJ表达式
    //FilterType.REGEX:使用正则指定
    //FilterType.CUSTOM:使用自定义规则

     2. @Scope

    //默认是单实例的
    /**
    * ConfigurableBeanFactory#SCOPE_PROTOTYPE
    * @see ConfigurableBeanFactory#SCOPE_SINGLETON
    * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST request
    * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION sesssion
    * @return
    * @Scope:调整作用域
      * prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。
      * 每次获取的时候才会调用方法创建对象;
      * singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。
      * 以后每次获取就是直接从容器(map.get())中拿,
      * request:同一次请求创建一个实例
      * session:同一个session创建一个实例
    *
    * 懒加载:lazy Bean
    * 单实例bean:默认在容器启动的时候创建对象;
    * 懒加载:容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化;
    *
    */

    3. 给容器中注册组件
    * 1)、包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类]
    * 2)、@Bean[导入的第三方包里面的组件]
    * 3)、@Import[快速给容器中导入一个组件]
      * 1)、@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
      * 2)、ImportSelector:返回需要导入的组件的全类名数组;
      * 3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中
      * 4)、使用Spring提供的 FactoryBean(工厂Bean);
        * 1)、默认获取到的是工厂bean调用getObject创建的对象
        * 2)、要获取工厂Bean本身,我们需要给id前面加一个&
            * &colorFactoryBean

    4. 生命周期

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

    * 初始化:
    *    对象创建完成,并赋值好,调用初始化方法。。。
    *   BeanPostProcessor.postProcessAfterInitialization

    * 销毁:
    *    单实例:容器关闭的时候
    *    多实例:容器不会管理这个bean;容器不会调用销毁方法;
    *
    *
    * 遍历得到容器中所有的BeanPostProcessor;挨个执行beforeInitialization,
    * 一但返回null,跳出for循环,不会执行后面的BeanPostProcessor.postProcessorsBeforeInitialization
    *
    * BeanPostProcessor原理
    * populateBean(beanName, mbd, instanceWrapper);给bean进行属性赋值
    * initializeBean
    * {
    * applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    * invokeInitMethods(beanName, wrappedBean, mbd);执行自定义初始化
    * applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    *}
    *
    *
    *
    * 1)、指定初始化和销毁方法;
    *    通过@Bean指定init-method和destroy-method;
    * 2)、通过让Bean实现InitializingBean(定义初始化逻辑),
    *    DisposableBean(定义销毁逻辑);
    * 3)、可以使用JSR250;
    *    @PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
    *    @PreDestroy:在容器销毁bean之前通知我们进行清理工作
    * 4)、BeanPostProcessor【interface】:bean的后置处理器;
    *    在bean初始化前后进行一些处理工作;
    *   postProcessBeforeInitialization:在初始化之前工作
    *    postProcessAfterInitialization:在初始化之后工作
    *
    * Spring底层对 BeanPostProcessor 的使用;
    * bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor;
    *

    5. @value

    //使用@Value赋值;
      //1、基本数值
      //2、可以写SpEL; #{}
      //3、可以写${};取出配置文件【properties】中的值(在运行环境变量里面的值)

        需要在MainConfigOfPropertyValues上加上@PropertySource(value = {"classpath:/person.properties"})注解

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

    6.自动装配

    /**
    * 自动装配;
    * Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值;
    *
    * 1)、@Autowired:自动注入:
    *    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的名字
    *    BookService{
    *    @Autowired
    *    BookDao bookDao;
    *    }
    *
    * 2)、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)、 @Autowired:构造器,参数,方法,属性;都是从容器中获取参数组件的值
    *    1)、[标注在方法位置]:@Bean+方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配

        

                  
    *    2)、[标在构造器上]:如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取

                       

    *    3)、放在参数位置:
    *              

          放在参数上的 不能实现无参构造,否则会默认调用无参数构造

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

    7.Profile

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

    * 2)、写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效
    * 3)、没有标注环境标识的bean在,任何环境下都是加载的;

    */

  • 相关阅读:
    (转载)自己实现spring
    重装mysql步骤
    华为过滤字符串(java)
    华为 去掉最大最小值
    Class.forName()数据库驱动
    线程中Join的使用例子
    基数排序的总结
    javaweb要点复习 jsp和servlet
    Qt实现360安全卫士10.0界面(编译时出现的一些问题)
    VS2010 添加资源文件后,出现 “LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”错误
  • 原文地址:https://www.cnblogs.com/doyi111/p/12392814.html
Copyright © 2020-2023  润新知