1.Spring的两个核心:
- IOC:控制反转,把创建对象交给Spring进行管理;
- AOP:面向切面,不修改源代码进行功能增强;
2.IOC:
- IOC思想基于IOC容器完成,IOC容器底层就是对象工厂;
- IOC的两种实现方式(接口):
- BeanFactory(接口):IOC容器的基本实现;其在加载过程中不会创建对象,在获取对象的时候才会把配置文件对象进行创建,类似于单例模式中的懒汉模式;
- ApplicationContext(接口):IOC的实现;其在加载过程中就会创建对象,类似于单例模式中的饿汉模式---减少了使用时的加载时间;
- ApplicationContext有它的实现类:ClassPathXmlApplicationContext(给一个类路径)、FileSystemXmlApplicationContext(要给一个绝对路径);
3.IOC的bean管理:
- IOC的bean管理范围:
- 创建对象;
- 注入属性--依赖于创建对象;
- IOC创建对象:
- 在xml文件中配置--<bean>,id、class
- bean标签的属性:id(唯一)、class、name(和id作用相同,但是name中不可以加特殊符号)
-
Bean管理(工厂bean---FactoryBean):
- 普通bean--返回类型和配置文件中创建的bean类型相同;
- 工厂bean--返回类型和配置文件中创建的bean类型不一定相同(类似于多态);
- 工厂bean如何实现: 创建类实现FactoryBean接口---实现接口中的方法,在实现的方法中定义返回的bean类型
-
bean的作用域
- 创建bean实例时可以是多实例,也可以是单实例,默认是单实例;
- 多实例:修改配置文件中bean的scope属性的值(singleton--单实例;prototype--多实例);
- scope的值是singleton时是在加载配置文件的时候就创建好对象(饿汉式),scope的值是prototype时是在调用getbean时才创建对象(懒汉式);
- bean的生命周期:
- 生命周期:对象创建到销毁的过程;
- bean的生命周期:(1).通过构造器创建bean实例(无参构造)---(2).注入属性和引用其他bean(调用set方法)---(3).调用bean的初始化方法(需要进行配置,自动调用)---(4).bean可用---(5).容器关闭时调用bean的销毁方法(需要进行配置,并且手动调用close方法);
- 使用bean的后置处理器(需配置)时:比正常的bean生命周期多两步---(1).通过构造器创建bean实例---(2).注入属性和引用其他bean---(3).将bean实例传递bean后置处理器---(4).调用bean的初始化方法---(5).将bean的实例传递bean后置处理器的方法--(6).bean可用---(7).容器关闭时调用bean的销毁方法
- 后置处理器:创建类--实现BeanPostProcessor接口;
配置文件中配置初始化和销毁方法
手动调用close方法
bean的后置处理器
在配置文件中配置后置处理器
IOC注入属性:
- 基于xml文件
- 基于注解
- 基于xml注入属性:
- DI:依赖注入---set方法<property>、有参构造方法<constructor-arg>;
- set方法的简化:p名称空间注入,添加xmlns:p=;
- 字面量---变量的固定内容(包括null和特殊符号·);
- 注入空值<null>或者特殊符号(转义符号:> 、<或者<![CDATA[内容]]>);
- 注入外部bean;
- 注入内部bean和级联赋值(类似外部bean,加上注入属性的过程,两种写法);
- 注入集合类型属性(对象的集合、将集合变成公共可用的,注入到多个类的属性中---配置文件中引入util名称空间);
(p空间注入)
、
(注入空值)
(注入外部bean)
(注入内部bean)
(注入集合属性)
(注入的属性是外部bean的集合)
(将注入的属性集合变成公共的)
-
bean管理xml方式---(自动装配):
- 注入属性的时候不需要自己手动配置,而是spring根据指定的装配规则(属性类型或者属性名称)自动进行配置;
- autowire--byType、byName;
- byName:下面创建的bean实例对象的id要和需要注入的属性的变量名相同;
手动装配
byName自动装配
byType自动装配
- bean管理xml方式(外部属性文件)---xml文件:
- 配置Druid连接池:
- 引入外部属性文件配置数据库连接池:
(相当于将properties文件指向xml文件中,便于后期管理)
- 创建properties属性文件(名字和xml里面相对应)
- 将外部properties属性文件引入spring配置文件中
- 基于注解注入属性:
- 注解:
- 注解是代码特殊标记,格式:@注解名称(这里可以给属性赋值,相当于带参构造方法);
- 可以用在类、属性、方法上面;
- 简化xml配置;
- spring针对bean管理中创建对象提供四个注解;
- 四个注解:@Component(通用)、@Service(推荐用在service层)、@Controller(推荐用在web层)、@Repository(推荐用在DAO层)
- 四个注解功能相同,都可以用来创建bean实例;
- 基于注解实现对象的创建:
- 现在配置文件中扫描需要创建对象的类所在的包;
- 在类名上面加上注解,如@Component(value="")---这里的value相当于是xml里面的id,也可以不写,默认是类名,首字母小写;
- 开启组件扫描中的细节配置:扫描哪些,哪些不扫描?--->use-default-filters="false":不使用默认的filter(扫描全部类),按自己配制的规则扫描--->context:include-filters:设置扫描哪些内容,context:exclude-filters:设置不扫描哪些内容;举例如下:
- 以下是基于注解实现对象的创建的基本过程:
- 基于注解方式实现属性注入:
- 常用的四个注解:@AutoWired(根据属性类型进行自动装配)、@Qualifier(根据属性的名称进行自动装配,要和@AutoWired一起使用---同一个接口有多个实现类的时候使用)、@Resource(可以根据属性的类型,也可以根据属性的名称进行自动装配)、@Value(注入普通型属性)
- 先创建对象并添加创建对象注解---把其中一个类注入到另一个类中(在该属性上加上注入属性注解,那么就不需要set方法了)
- 使用根据属性名字进行赋值一般是该属性的数据类型存在多个实现类,以此区分;
以下是使用@Qualifier进行属性注入:
下面是使用Resource进行属性注入:
根据属性名字⬆
根据属性类型 ⬆
下面是使用value注入属性:
- 基于注解实现完全注解开发---一般是使用springboot:
- 也就是不需要使用配置文件去进行扫描;
- 全部过程都用注解;
- 使用配置类(configuration)去代替配置文件;
以下是配置类创建的过程:
(使用的类就不是ClassPathXmlApplicationContext了,要改变为AnnotationConfigApplicationContext)