Spring是一个开源框架,它是为了解决企业应用开发的复杂性而创建的。
一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
Spring:轻量级框架
作用:Bean工厂,用来管理Bean的生命周期和框架集成。
两大核心:
1、IOC/DI(控制反转/依赖注入) :把dao依赖注入到service层,service层反转给action层,Spring顶层容器为BeanFactory。
2、AOP:面向切面编程
IOC:所谓控制反转,就是把对象交给容器去处理,用来管理Bean,使用依赖注入实现控制反转,可以很方便的整合各种框架
IOC 在项目中的作用?
作用:Ioc解决对象之间的依赖问题,把所有Bean的依赖关系通过配置文件或注解关联起来,降低了耦合度。
AOP:是一种面向切面的一种编程方式、例如我们的业务核心代码需要处理异常或者处理日志,这时我们就可以运用到AOP,还有什么遇到权限的时候都可以运用到AOP,AOP机制弥补OOP代码重复问题,将不同类不同方法中的共同处理抽取成切面,自动主入给方法执行,比如日志,异常等
IOC:通过反射机制生成对象注入
AOP:动态代理
1、配置文件配置包扫描路径
2、递归包扫描获取.class文件
3、反射、确定需要交给IOC容器管理的类
4、DI依赖注入
容器概念,控制反转,依赖注入
ioc容器
实际上就是个Map,里面存的是各种对象(xml里配置的bean节点,@repository,@service,@controller,@component),在项目启动的时候会读取配置文件里面的bean节点,根据全限定类名使用反射创建对象放到map里,扫描到打上上述注解的类或通过反射创建对象放到map里
这个时候map里就有各种对象了,接下来我们在代码里需要用到里面的对象时,再通过DI注入
(autowired,resource等注解,xml里bean节点内的ref属性,项目启动的时候会读取xml节点ref属性根据id注入,也会扫描这些注解,根据类型或id注入,id就是对象名)
控制反转:
没有引入IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B,无论是创建还是使用对象B,控制权都在自己手上.
引入IOC容器之后,对象A和对象B之间失去了直接联系,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方
通过前后的对比,不难看出,对象A获得依赖对象B的过程,由主动行为变成了被动行为,控制权颠倒过来了
IOC只是一种模式,一种思想简单说就是将原先需要new出来的对象,我先把它实例化,同时把它放到一个容器里,这样后面需要这个对象的时候,直接通过注入的方式拿到,为什么说是注入,其实应该说是从容器里面拿,只不过在spring里,用的更多的是注入, spring中使用ioc的模式,首先,在spring容器中有两个map集合,一个是用来存放bean的配置信息,另一个是用来存放bean的实例.
编程式事务管理:编程方式管理事务,极大灵活性,难维护。
声明式事务管理:可以将业务代码和事务管理分离,用注解和xml配置来管理事务。
开启事务注解驱动
事务管理器
开启注解功能,并配置扫描包
配置数据库
配置SQL会话工厂,别名,映射文件
不用编写Dao层的实现类
注册:@Controller @Service @Component
注入:@Autowired @Resource
请求地址:@RequestMapping
返回具体数据类型而非跳转:@ResponseBody
构造器注入:通过构造方法初始化
1
setter方法注入:通过setter方法初始化
1
接口注入
工厂模式:每个Bean的创建通过方法
单例模式:默认的每个Bean的作用域都是单例
代理模式:关于Aop的实现通过代理模式
ApplicationContext是BeanFactory的子接口,提供了更完整的功能
1.BeanFactory采用的是延迟加载形式来注入bean的,即只有在使用到某个bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题,如果Bean的某一个属性没有注入,BeanFactory加载后,直至第一次使用调用getBean方法才抛出异常
2.ApplicationContext,它是在容器启动时,一次性创建了所有的bean.这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖的属性是否注入.ApplicationContext启动后预载入所有的单实例Bean,通过预载入单实例bean,确保当你需要的时候,你就不用等待,因为它们已经创建好了
3.相对于基本的BeanFactory,ApplicationContext唯一的不足是占用内存空间,当应用程序配置Bean较多时,程序启动较慢
4.BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader
不安全
Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理
如果Bean是有状态的,那就需要开发人员自己来进行线程安全的保证,最简单的方法就是改变bean的作用域,把singleton改为prototype,这样每次请求bean就相当于是new Bean()
简述反射的基本概念,优缺点和使用场景。
答:
①在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为Java的反射机制。
② 优点是运行时动态获取类的全部信息,缺点是破坏了类的封装性,泛型的约束性。
③是框架的核心灵魂,动态代理设计模式采用了反射机制,还有 Spring、Hibernate 等框架也大量使用到了反射机制。
获取Class对象有哪几种方式?
能通过Class对象获取类的哪些信息?
答:
①通过类名.class
②通过对象.getClass()
③通过Class.forName(类的全限名);
注解是什么,元注解是什么,有什么作用?
答:
①注解是一种标记,可以使类或接口附加额外的信息,是帮助编译器和JVM完成一些特定功能的。
②元注解就是自定义注解的注解,包括@Target:用来约束注解的位置,值是ElementType枚举类,包括METHOD方法、VARIABLE变量、TYPE类/接口、PARAMETER方法参数、CONSTRUCTORS构造器和LOACL_VARIABLE局部变量;
@Rentention:用来约束注解的生命周期,值是RetentionPolicy枚举类,包括:SOURCE源码、CLASS字节码和RUNTIME运行时;@Documented:表明这个注解应该被javadoc工具记录;@Inherited:表面某个被标注的类型是被继承的。