Spring
一.什么是Spring,作用是什么?
1.Spring指的是Spring Frame Work,是包含了众多工具方法的IOC容器。
2.IOC: Inversion of Control :控制反转, 将对象的控制权交给了Spring。
例如:A类需要使用B类,现在只需要从Spring当中去取B,不用再创建B类的对象来使用B,B的控制交给了Spring。
IOC容器具有对对象的存储和获取的能力,从而,使用Spring只需要将对象存入和获取就可以来实现对对象的使用,对象的创建等操作就不需要关心。
二.依赖注入DI
Spring实现了依赖注入。在IOC运行期间,动态的把某种依赖关系注入到对象当中。从而使某些对象之间产生魔咒依赖关系。
*面试题:DI和IOC区别:
IOC是一种思想,DI是一种实现,他们描述的是一件事情。
三. 传统Spring的创建和使用(不使用Springboot)
1.Spring的创建
1.创建普通maven项目
2.添加依赖(Spring-context)
3.添加启动类:包含public static void main的类(目的是为了把项目启动起来)
4.创建Spring配置文件
在resources文件下创建XXXXXXX.xml配置文件,将下面内容添加导入
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/s ... ing-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
2.Spring的使用
(1)将所需要管理的类放到Spring容器当中(放置对象)
在上述配置文件当中添加
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
上述userDao使创建出来的对象的名称,
com.itheima.dao.impl.UserDaoImpl是所要创建对象的类
(2)从Spring容器当中获取对象(拿对象)
先获取上下文,再从容器当中去拿
//1.获取Spring上下文
方法一:ApplicationContext context =new ClassPathXmlApplicationContext("所创建的Spring的核心配置文件名");
方法二:
BeanFactory beanFactory=new XmlBeanFactory(new ClassPathRescource(Spring核心配置文件路径))
从容器中获取对象:
方法一:
//1.获取Spring上下文 ApplicationContext context =new ClassPathXmlApplicationContext("所创建的Spring的核心配置文件名"); //2.从上下文当中获取所需要的对象 User user =(object)context.getBean();
方法二:
//通过bean的类型获取对象 User user=context.getbean(User.class); user.XXX //直接使用里面的方法
注意:第二种方式常见对象的情况下,当Spring中存放了不止一个对象的情况,就会报错。
方法三:
//使用getbean的构造方法,传参数name和类两个参数从而保证所获取到的对象的唯一性 User user=context.getBean("user1",User.class); user.XXXXXXX; //使用类方法
*面试题:ApplicationContext和BeanFactory的区别
1.继承关系 前者是后者的子类,前者提供了更好的一些支持和访问方法
2.性能方面有所差异,前者是启动的时候,虚拟机就全部加载了存进去的所有对象,后者是需要拿的时候才回去加载,因此更加轻量级。前者会更快一些。
四.更简单的Spring创建和使用
先创建Spring配置文件
1.更简单的存
通过注解告诉Spring要管理哪些类(更简单的存)
类注解: @Controller @Service @Respository @Component @Configuretion
方法注解:@Bean
@Controller (控制器):验证接口参数的正确性,或者参数的转换
@Service(服务):一般是服务的编排和汇总,做服务的调度等
@Respository(仓库):数据库相关的内容
@Component (组件)
@Configuretion(配置)
首先通过@XXX的注解方式将类交给Spring来管理,然后再通过context.getBean(“创建对象的名字”)。注意:智利的对象的名字一般默认创建的是将类名首字母小写,当类名的前两个字母都是大写的情况,则对象的名字就是类名本身。(例:UController)从源码中得到上面的结论
五大注解的联系:源码里面都是依托于Component
在注解之后加上括号就可以对默认创建的对象的名称进行重命名。
五大注解可以和Bean共存,大部分需要Spring管理的对象都在某一个路径下的,同时有一小部分需要管理的对象需要
依赖:
Controller依赖Service,Service依赖DAO
2.更简单的取(对象的装配)
(1)属性注入:
@Autowired:将属性注入到当前类及对象中,与属性对象的名称无关,是根据类型是获取对象的
@Resouce:jdk提供的注入的方式
*面试题:@Autowired与@Resouce的区别
前者是Spring提供的,后者是jdk提供的
1.第一个是根据类型去查找对应的bean,如果查找有多个,在跟去名称去查找
加上@Qualify就可以指定查找具体名称的bean ,两者结合就相当于bean
2.直接根据名称去查找
最终查找不到就会报错
(2)Setter方法注入
(3)构造函数注入
五.Bean作用域和生命周期
1.作用域:
(1)通过@Autowired注释。单例作用域:两个类都在自己的作用于当中创建同一个类的一个对象,并且名字相同,此时两个变量都指向同一个堆里面的对象。Spring之帮你管理一个相同的对象。适合于无状态的Bean ,所有线程都可以使用同一个Bean。
(2)多例作用域(原例)多例模式,每创建一个对象都会创建一个新的实例。
通过@Scope(ConfigurableBean.SCOPE_PROTOTYPE)进行注释,就是多例
(3)请求作用域request:每一次http请求都会创建一个Bean。(仅限SpringMVC使用)
(4)绘画作用域session:在一个session当中只创建一个实例(仅限于SpringMVC)
(5)application:全局作用域
2.生命周期
1.实例化Bean(为Bean分配内存空间)
2.设置属性(Bean的注入和装配)
3.初始化
执行各种通知; 执行初始化前置方法,执行初始化方法; 执行初始化后置方法
4.使用Bean
5.销毁Bean
先执行注解的方法在执行在配置文件中的方式。(注解是在新的方式,官方推荐的)
六.SPring的执行流程和生命周期
执行流程:
1.启动Spring容器
public static void main(String args){ ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml")//获取配置文件上下文 }
2.根据配置文件,Bean的初始化
根据扫描文件去扫描路径下有哪些类有注解,对Bean进行初始化
3.把对象放到spring中
将上一步中初始化的一些对象放到spring容器当中管理起来
4.装配对象
把依赖的对象注入到相应的地方