什么是Spring框架:
Spring是一款非常优秀的基于Java编写的开源的轻量级的用于简化企业级应用开发的应用开发的应用开发框架,准确来说Spring其实是一个大家族,其中包含非常多非常优秀的框架,如现在比较流行的SpringBoot以及SpringCloud都是Spring家族。而我们所说的Spring其实指的是Spring Framework,是Spring家族中最核心的技术。也是其他技术的基础。其中包含有IOC/DI和AOP。
IoC(Inversion of Control)控制反转
使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。让别人来创建对象
DI(Dependency Injection)依赖注入
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
配置核心容器的目的:充分解耦
使用IoC容器管理bean (IoC)
在IoC容器内将有依赖关系的bean进行关系绑定(DI)
最终效果
使用对象时不仅可以直接从IoC容器中获取
获取到的bean已经绑定了所有的依赖关系
IoC入门案例—控制反转
1.导入Spring坐标,在pom.xml文件中导入
2.定义Spring管理的类(接口)
3.创建Spring配置文件,配置对应类作为Spring管理的Bean
总体步骤如下:
DI入门案例—依赖注入
bean的配置
bean基础配置
bean别名配置
bean作用范围配置
scope属性:Bean范围哦,不配默认也是单例
singleton:单例
prototype:多例,每次获取时都创建新的对象
当配置为scope=”prototype”时,service1==service2为true,创建的是不同的对象
下面还有其他的范围配置,不常用作了解:
bean生命周期
bean销毁时机
销毁只对单例对象有效
关闭容器的两种方法:
1.context.close();
2.context.registerShutdownHook();//在JVM退出的时候关闭容器
创建对象的三种方式
无参构造方法
注:一定要有无参的构造方法,如果创建了有参的构造方法,会导致无参的构造方法失效,出现异常
静态工厂方法
实例工厂方法
依赖注入
分为两种类型:
1.引用类型
2.简单类型=八种基本数据类型+Sring
setter注入————引用类型
构造器注入————引用类型
setter注入————简单类型
构造器注入————简单类型
构造器注入——参数适配
依赖自动装配
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
自动装配方式:
按类型(常用)byType
按名称 byName
不启用自动装配 no
依赖自动装配特征:
1.自动装配用于引用类型依赖注入,不能对简单类型进行操作;
2.使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用;
3.使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
4.自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效。
集合属性的注入
注入数组对象
注入List对象
注入Set对象
注入Map对象
注入Properties对象
第三方资源配置管理—Druid连接池
管理DataSource连接池对象,加载properti属性文件。
首先导入Druid连接池坐标,在resources文件中配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--property-placeholder标签:引入外部的引入外部的properties文件
location属性:指定外部properties文件的位置
system-properties-mode属性:NEVER,不加载系统的属性
location="jdbc.properties,msg.properties": 加载多个配置文件中间用,分割
location="*.properties": 加载所有的properties文件, 单元测试找编译后test-classes里面的配置, main方法运行找classes里面的配置(类路径)
location="classpath:*.properties": 加载所有的properties文件, 单元测试找编译后test-classes里面的配置, main方法运行找classes里面的配置(类路径)
location="classpath*:*.properties": 会去依赖的jar中找properties文件
-->
<context:property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/>
<!--创建DruidDataSource放到IoC容器中-->
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
</beans>
编写测试Spring管理Druid连接池:
public class DataSourceTest {
@Test
public void testDataSource() throws SQLException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-DS.xml");
DataSource dataSource = (DataSource) context.getBean("dataSource");
Connection conn = dataSource.getConnection();
System.out.println("conn = " + conn);
context.close();
}
}