入门代码
SpringMVC创建的基于XML配置<br>
XmlWebApplicationContext
ClassPathXmlApplicationContext
SpringBoot创建的基于注解
AnnatationConfigApplicationContext
Spring如何创建一个对象<br>
解析AppConfig.class,得到扫描路径
遍历路径下所有类,发现类上有@Component@Service等注解,将这个类记录到BeanDefinitionMap中,是一个Map<String,Class><br>
Spring根据规则生成类对应的beanName,作为key存入Map中,类对象作为value<br>
Bean的创建过程
通过类构造方法实例化对象,如果有多个方法,通过推断构造方法进行创建<br>
判断该对象中属性有@Autowired注解,对应的进行依赖注入<br>
当前对象是否实现了BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口,<br>如果实现了,则调用对应的setBeanName(),setBeanCLassLoader(),setBeanFactory方法<br>
Aware回调后,Spring会判断该对象中是否存在某个方法被@PostConstruct注解了,如果存在,<br>Spring会调用当前对象的此方法(初始化前)
紧接着,Spring会判断该对象是否实现了InitializingBean接口,如果实现了,就表示当前对象必须实现该接口中的afterPropertiesSet()方法,<br>那Spring就会调用当前对象中的afterPropertiesSet()方法(初始化)
最后,Spring会判断当前对象需不需要进行AOP,如果不需要那么Bean就创建完了,如果需要进行AOP,<br>则会进行动态代理并生成一个代理对象做为Bean(初始化后)
推断构造方法
类只有一个构造方法,调用当前构造方法<br>
有无参构造器也有其他构造方法,还是调用无参构造器
没有无参构造器,存在两个以及以上有参构造器,spring无法选择会报错
AOP流程
判断是否要进行AOP
找出所有切面Bean
遍历每个方法是否有@Before@After等注解
有则判断对应Pointcut是否与当前Bean对象的类匹配
匹配则需要进行AOP
cglib进行AOP流程
代理类继承UserService生成UserServiceProxy
代理类重写父类方法,例如UserService中的test()
代理类有一个target属性,父类的对象,该属性的值是被代理对象<br>
代理类中test()方法执行逻辑
执行切面逻辑(@Before)
调用被代理对象方法target.test()
Spring事务:@Transactional
判断当前执行方法是否有@Transactional注解
存在则通过事务管理器(TransactionMananger)新建一个数据库连接
修改自动提交关闭,autocommit=false
执行业务代码和sql
执行结果无异常则提交,异常则回滚
Spring事务是否会失效的判断标准:某个加了@Transactional注解的方法被调用时,<br>要判断到底是不是直接被代理对象调用的,如果是则事务会生效,如果不是则失效