简化开发的策略
POJO轻量级,最小侵入性编程。(代理模式:JDK方式要求被代理类实现一个接口,Cglib没有要求)(原型模式:JDK方式要求类实现Cloneable接口,Jackson没有要求) 依赖注入、面向接口松耦合。 基于切面和惯性进行声明式开发。 通过切面和模板减少样板式代码。
用到的思想
OOP:面向对象编程 BOP:面向Bean编程 AOP(基于代理模式):面向切面编程 IOC:控制反转 DI/DL:依赖注入、依赖查找
常用注解
@Transactional @ManageResource
@Required @Repository @Aspect
@Service @Controller @RequestMapping @ModelAttribute @Resource
@Configuration @Component @ComponentScan
@Conditional @ComponentScans
@EventListener
注解解析
IOC
注解Bean的使用名称相同时,@Primary可以进行优先匹配。 @Controller、@Service、@Repository、@Configuration是@Component的子。 @ComponentScan扫描@Component,includeFilters可以定义过滤逻辑,useDefaultFilters决定是否启动默认过滤逻辑。@ComponentScans可配置多个@ComponentScan。 @Bean的value()为空时匹配被注解的方法名。借助initMethod,destroyMethod写明对象创建和销毁时的执行方法。借助BeanPostProcessor接口的方法可以写明对象创建和销毁时的执行逻辑。 @Import可以直接导入Bean。借助ImportSelector接口可以导入多个Bean。借助ImportBeanDefinitionRegistrar接口可以手动将Bean注入到Ioc容器。 @Lazy可改Bean为懒加载,即getBean时创建Bean实例,默认getBean前已经创建了Bean实例。 @Scope("prototype")可改Bean为多例,默认singleton。web中的请求对应单例为request,多例为session。 FactoryBean接口可声明注入的类、类类型、是否单例。getBean可注入FactoryBean接口实现类的getObject(),名称以&开头可注入FactoryBean接口的实现类。 @Conditional对应的Condition接口实现类可声明注入Bean的条件。
源码解析
IOC:
AnnotationConfigApplicationContext会调用AnnotatedBeanDefinitionReader。
ClassPathXmlApplicationContext会调用XmlBeanDefinitionReader。
AnnotatedBeanDefinitionReader会扫描注解,解析出BeanDefinition。
XmlBeanDefinitionReader会加载xml,解析出BeanDefinition。
BeanDefinitionRegistry的registerBeanDefinition会将BeanDefinition放到beanDefinitionMap里,这是个ConcurrentHashMap,key是beanName,value是BeanDefinition。
DI:
依赖注入可以通过构造方法、设值方法、注解来注入。
可以自动装配,也可以ref指定Bean,也就是手动装配。
AbstractApplicationContext调用getBean,会走到AbstractBeanFactory的getBean,里面调用doGetBean。FactoryBeanRegistrySupport的factoryBeanObjectCache有Bean就返回。没有Bean就会走到AbstractAutowireCapableBeanFactory的doCreateBean。里面是如果factoryBeanInstanceCache里有对应的BeanWrapper,就用BeanWrapper里的Bean,没有就createBeanInstance。createBeanInstance里判断是AUTOWIRE_CONSTRUCTOR时,执行autowireConstructor,不是就走手动装配instantiateBean。doCreateBean还有populateBean里判断是AUTOWIRE_BY_NAME,就执行autowireByName;判断是AUTOWIRE_BY_TYPE,就执行autowireByType;都不是就走手动装配applyPropertyValues,里面会执行setPropertyValues。
https://blog.csdn.net/weixin_44273302/article/details/113716352
————————————————————————————————————
预加载单例型的Bean:
ApplicationContext的子类实例化会调用AbstractApplicationContext的refresh,然后走到finishBeanFactoryInitialization,最后走到DefaultListableBeanFactory的preInstantiateSingletons,里面是AbstractBeanFactory的getBean。
https://blog.csdn.net/Bronze5/article/details/106244573
DI
@Resource、@Qulifier、@Autowired都可注入Bean,优先级为@Resource > @Qulifier > @Autowired @Value可以进行赋值,不只是String。@Value("#{算式}")可进行算式结果赋值。@PropertySource可从配置文件中读取信息,@Value("$Key名")即可给Bean赋值。
核心模块
spring-core:IOC、DI spring-beans:Bean spring-context:Context spring-context-support:IOC spring-context-indexer:ClassPath spring-expression:表达式 spring-aop:AOP spring-aspects:AspectJ spring-instrument:动态类加载 spring-jdbc:JDBC spring-tx:事务 spring-orm:对象关系映射,如Hibernate spring-oxm:XML和对象的映射 spring-jms:JMS spring-web:Servlet spring-webmvc:Spring MVC spring-websocket:WebSocket spring-webflux:响应式Web:异步、非阻塞、事件驱动的Web spring-message:报文传输 spring-test:测试 spring-bom:Bill Of Materials,解决Spring不同模块的依赖的版本不同
版本
主版本号:API兼容性改变 次版本号:增加了功能(不影响API兼容性) 修订版本号:BUG修复(不影响API兼容性)
Build内部开发版 GA(General Availability)基本可用版 M(Milestone) 里程碑版(有全新功能或者有里程碑意义) RC(Release Candidate) 候选发布版/最终测试版 Release 发布版(功能稳定,对外发布,但有时间限制) SR(Service Release)服务发布版(正式发布后的修正和优化版)