spring注解驱动
容器 AnnotationConfigApplicationContext
组件添加
组件赋值
组件注入
AOP
声明事务
原理
BeanFactoryPostProcessor
BeanDefinitionRegistryPostProcessor
ApplicationListener
Spring容器创建过程
WEB
servlet3.o
异步请求
/**
* 给容器注册组件
* 1.包扫描+组件标注注解(@Controller...) [我们自己写的]
* 2.@Bean+ @Configuration [别人写的,导入的第三方包]
* 3.@Import [快速的给容器中导入组件]
* 1. @Import({要导入的容器的组件...}) id默认为全类名
* 2. @ImportSelector 返回要导入的全类名数组
* 3. ImportBeanDefinitionRegistrar 通过registerBeanDefinitions给容器中增加自己的bean
* 4.使用spring提供的FactoryBean[工厂Bean]
* 1.默认获取到的是工厂Bean调用getObject创建的对象
* 2.通过前缀&获取FactoryBean注入的工厂bean本身
* 5.@Condition按条件进行判断,满足条件的给容器中注册Bean
*
* 赋值方式
* 1.xml中指定
* 2.使用Bean创建时指定
* 3.使用@Value赋值
* 1.基本数值
* 2.SpEL #{}
* 3.配制文件,运行环境变量中的值 ${} 可以使用@PropertySource加载外部配制文件保存到运行的变量中,yml文件先在静态资源中引入
*
* 自动装配
* spring利用依赖注入DI,完成对IOC容器中各个组件的依赖关系赋值
* 默认加在ioc容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作
* 1.@Autowired 自动注入 [Spring规范]
* AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能
* 1.默认优先按照类型去容器中找对应的组件:applicationContext.getBean(beanName.Class),找到并赋值
* 2.如果找到多个相同类型的组件,再将属性的名字作为组件的ID去容器中查找 applicationContext.getBean(beanName),找到并赋值
* 3.@Qualifier("beanName")明确指定要装配的组件ID,而不傅属性
* 4.自动装配默认一定要将属性赋值好,没有就会报错,可以使用@Autowired(required = false)没有就不装配
* 5.@Primary spring进行装配的时候,默认使用首选的Bean,也可以继续使用@Qualifier指定
* 2.还支持@Resource(JSR250规范)和@Inject(JSR330规范) [java规范]
* 1.@Resource 可以和@Autowired一样实现自动装配,默认按照组件名称进行装配,不支持@Primary和@Autowired(required = false)
* 2.@Inject 使用先导入javax.inject依赖,可以和@Autowired一样实现自动装配,支持@Primary和不支持@Autowired(required = false)
* 3.@Autowired 可以标在构造器,方法,属性,参数;都是从容器中获取参数组件的值
* 1.标注在方法,spring容器创建当前对角,就会调用方法,完成赋值,方法使用的参数,自定义类型的值从Ioc容器中获取;@Bean标注的方法创建对象的时候,方法参数的值从容器中获取;默认不写@Autowired效果都是一样的
* 2.标注在有参构造器时,容器启动调用这有参构造器创建对象,构造器要用的组件,都是从容器中获取;只有一个有参构造器时,可以省略@Autowired,参数位置的组件还是从容器中获取
* 3.标在参数时,也同2
* 4.自定义组件想要使用spring容器底层的一些组件(applicationContext,BeanFactory,xxx),自定义组件只需实现xxxAWare接口,有回调的风格,总体参照AWare;
* xxxAWare的功能使用xxxAWarePostProcessor后置处理器完成
* 5.@Profile: spring为我们提供可以根据当前环境,动态激活和切换一系列组件的功能,不指定,在任何环境下都能注册
* 环境切换:
* 1使用命令行动态参数-Dspring.profiles.active
* 2使用代码方式,applicationContext不能使用有参构造器,用无参构造器
* //指定主配制类,获得容器
* //AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfProfile.class);
* AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
* //使用无参构造器设置需要激活的环境,一次可以设多个
* applicationContext.getEnvironment().setDefaultProfiles("test");
* //注册主配制类
* applicationContext.register(MainConfigOfProfile.class);
* //启动刷新容器
* applicationContext.refresh();
* log.info("容器创建完成...[{}]",applicationContext);
* 3.使用配制文件spring.profiles.active=dev
* 1.加了环境标识的Bean,只有在环境激活的情况下注册到容器中,默认是default环境
* 2.写在配置类上,只有在只有在环境激活的情况下,整个配置类里面的所有配置才生效
* 3.没有标注的,在任何环境下都是加载的
*
*/