AOP: 首先是因为加上了 @EnableAspectJAutoProxy , 他会给容器导入一个 AnnotationAwareAspectJAutoProxyCreator, 这是一个后置处理器,在Spring容器启动创建剩下的bean的时候,会给相应的后置处理器一个机会去创建代理对象, 而
AnnotationAwareAspectJAutoProxyCreator,就是可以拦截bean初始化,他会判断当前bean是否符合生成代理对象的条件,如果符合的话,他会把切面方法包装成增强器,并且生成一个代理对象。
比如说 Calculator 是一个符合代理的bean, 在使用 Calculation cal = application.getBean("calculation"); 返回的 cal 就是一个代理对象。 在执行 cal 的某个方法,比如说 div 的时候, 执行的其实是 代理对象的inceptor 方法,这个方法会把增强器包装整
理成拦截器链,然后按照这个拦截器链依次执行,其中有一环就是执行 div 方法,有两种执行流程
1、前置方法 -> 目标方法 -> 后置方法 -> 返回方法
2、前置方法 -> 目标方法 -> 后置犯法 -> 异常方法
使用PreparedStatement为什么可以防止sql注入?
sql注入主要利用的是单引号 ' ,就像一个sql语句是 select * from user where username = '等待拼接的内容', sql 注入可以这样子写 select * from user where username = 'a' or 1
这样子user 中的数据就会都被查找出来了,而preparedStatemt会把后来加进去的单引号替换成/' 也就是把单引号给转义了,后来加进去的内无法“切割”sql 语句了,所以他可以防止sql 注入
shiro 的认证过程
首先是在controller 中将用户名和密码封装成UsernameAndPasswordToken 调用 Subject.login(token)方法,这个Subject是一个接口,运行的时候注入的是DelegatingSubject 的login 方法,DelagatingSubject类中有一个成员变量SecuriManager,这个也是一个接口,注入的是DefaultSecurityManager, 所以说实际上调用的是 DefaultSecurityManager 的login 方法,这个login方法调用的是他的一个成员变量Authenticator,这个接口的实现类的认证方法Authenticator 会去遍历所有是Realm,并且调用他们的认证方法
Spring 启动过程
1、先创建BeanFactoty(第一步是把BaenFactory new出来,然后对他进行各种赋值)
2、执行BeanFactory 创建完成后的后置处理器对应的方法
3、注册后置处理器
1、不同的后置处理器的注册时机是不一样的
2、相同的后置处理器会先注册实现了优先级接口的后置处理器
4、注册国际化组件
5、初始化事件派发器
6、注册监听器
7、初始化剩下的bean
1、会先去看缓存中有没有,有的话直接拿,就不直接创建了
2、会给后置处理器一个创建代理对象的机会,如果后置处理器可以返回对象的话,就拿这个代理对象了。
3、在bean实例创建完成之后,就是属性的赋值,在赋值之前和赋值之后都会有相应的后置处理器进行处理。
4、之后执行的是对象的初始化