目录
Spring两大核心,IOC和AOP
Aop的实现原理
Spring基于xml注入bean的几种方式:
Spring的自动装配
Spring的bean加载过程
Spring框架中都用到了哪些设计模式?
Spring常用注解:
Spring两大核心,IOC和AOP
Ioc就是控制反转:
像我们之前开发,想创建对象就new一个。想要在对象里创建方法和变量,就在对象内部创建成员变量。但是现在我们想用这个类的对象,可以再spring里配置一个bean,指定对应全路径名称,spring通过配置文件用反射的方式,可以直接帮我们获取到这个类的对象。
依赖注入由三种方式:set注入,构造器注入,注解注入(注解有@Autowird[由Spring提供的] 默认按类型注入,@Resouce[由jdk提供的]默认按名称注入)。
AOP就是面向切面:
Aop是面向切面编程,在不改变源代码的情况下,对代码做增强,具体就是说一个切点,一个切面。切点就是在哪里添加业务,切面就是在指具体的业务,Aop常用于处理事务和日志记录(理解:将我常用的方法抽成工具类,哪里需要哪里调用)
Aop的实现原理
首先通过aop配置切面以及切面的增强逻辑,当sping的容器中目标类的对象的方法被调用时,aop框架就会拦截此次调用,aop框架会帮你生成一个动态代理对象,先运行增强类中的前置增强方法,在运行原业务方法,最后再运行增强类的后置增强方法
注意:aop默认是通过jdk提供proxy来生成动态代理对象,但是也可以手动指定使用cglib来生成动态代理对象。
Spring AOP的底层都是通过代理来实现的
- 一种是基于JDK的动态代理
- 一种是基于CgLIB的动态代理
jdk的动态代理和cglib动态代理有什么区别?
jdk的动态代理要求业务类必须得实现业务接口,底层是通过生成业务接口得动态代理来实现类来完成功能增强
cglib不需要业务类实现接口,底层是通过衍生出当前业务类的子类对象来完成功能增强
Spring基于xml注入bean的几种方式:
Set()方法注入
构造器注入:1.通过index设置参数的位置,2.通过type设置参数类型
静态工厂注入
实例工厂
Spring的自动装配
byname:通过bean的名称进行自动装配
byType:通过参数的数据类型进行自动装配
@Autowired可用于:构造函数,成员变量,Setter方法
@Autowired和@Resource之间的区别:
@Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)
@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入
Spring的bean加载过程
1获取 BeanName,对传入的 name 进行解析,转化为可以从 Map 中获取到 BeanDefinition 的 bean name。
2合并 Bean 定义,对父类的定义进行合并和覆盖,如果父类还有父类,会进行递归合并,以获取完整的 Bean 定义信息。
3实例化,使用构造或者工厂方法创建 Bean 实例。
属性填充,寻找并且注入依赖,依赖的 Bean 还会递归调用 getBean 方法获取。
4初始化,调用自定义的初始化方法。
5获取最终的 Bean,如果是 FactoryBean 需要调用 getObject 方法,如果需要类型转换调用 TypeConverter 进行转化。
Spring框架中都用到了哪些设计模式?
工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
单例模式:Bean默认为单例模式。
代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener
Spring常用注解:
@service:业务逻辑
@Transaction:事物的注解
@Controller:声明控制器
@Autowired:自动注入
有时候需要注入DAO的话还会用到@Repository对应数据访问层bean)



