Spring
Spring是分层的full-stack(全栈)轻量级开源框架,以IoC(反转控制)和AOP(面向切面编程)为内核。
版本:
- 2017年,发布spring5.0通用版(学习这个)
Spring优势:
- 通过Spring提供的IoC容器,可以将对象间的依赖关系交给spring控制,避免过耦合。
- AOP面向切面编程,可以实现比传统OOP更复杂的功能。
- 声明式事务的支持,简化事务管理,提高开发效率。
- spring可以集成junit,方便测试。
- 方便集成各种优秀框架。
- 对JavaEE API进行了简单封装,降低了使用难度。如,JDBC等
Spring程序开发步骤:
-
导入spring的jar包(基本包坐标
spring-context
和测试坐标junit
) -
编写dao接口和实现类(UserDao, UserDaoImpl)
-
创建spring核心配置文件applicationContext.xml,将dao类填写到配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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.xsd"> <bean id="userDao" class="com.dao.impl.UserDaoImpl"/> </beans>
-
测试,获取dao对象(通过配置文件)
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) app.getBean("userDao"); userDao.save();
配置文件详解
放在resources文件加下,名字随意,一般命名为applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd" >
</beans>
bean标签
作用:通过bean标签,让Spring返回类对象
<bean id="userDao" class="dao.impl.UserDaoImpl"></bean>
属性:
- id:Bean实例的唯一标识
- class:Bean的权限定名称
- scope:对象的作用范围
- singleton 单例:默认值,加载Spring核心文件时,实例化一个对象
- prototype 多例:调用getBean()方法时,实例化对象(可以实例化多个对象)
bean实例化
在配置文件中添加了bean,bean是如何实例化的呢?spring框架实例化bean有三种方式:
-
无参构造方式(默认方式)
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao1 = (UserDao) app.getBean("userDao");
-
工厂静态方法(先了解即可,不学也行):
-
创建一个工厂类,里面定义一个静态方法
getUserDao()
,该方法返回bean实例化对象return new UserDaoImpl();
-
将工厂类添加到配置文件
<bean id="userDao" class="com.factory.StaticFactory" factory-method="getUserDao"/>
-
-
工厂实例方法(先了解即可,不学也行):
-
创建一个工厂类,里面定义一个成员方法
getUserDao()
,该方法返回bean实例化对象。 -
将工厂类添加到配置文件
<bean id="factory" class="com.factory.DynamicFactory"/> <bean id="userDao" factory-bean="factory" factory-method="getUserDao"/>
-
bean的依赖注入
service层可以通过配置文件getBean获取dao层实例对象,也可以直接将dao实例直接注入到service中,不用new或者获取。
这样就由框架来维护业务层和持久层之间的依赖关系。
依赖注入是Spring核心IoC的具体体现。
怎么将UserDao注入到UserService内部?两种方法:
- 构造方法
- set方法(通用方法,因为JavaBean中都有set方法)
第一种方式:set方法
-
创建UserService接口和类,创建其中的set方法:
private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; }
-
设置配置文件
<bean id="userDao" class="dao.impl.UserDaoImpl"></bean> <bean id="userService" class="service.impl.UserServiceImpl"> <property name="userDao" ref="userDao"></property> </bean>
第二种方式:构造方法
-
UserServiceImpl中定义一个有参构造方法
public UserServiceImpl(UserDao userDao) { this.userDao = userDao; }
-
配置文件:
<bean id="userDao" class="dao.impl.UserDaoImpl"></bean> <bean id="userService" class="service.impl.UserServiceImpl"> <constructor-arg name="userDao" ref="userDao"></constructor-arg> </bean>
依赖注入类型
依赖注入:就是一个类,通过配置文件中的bean标签可以获取实例对象,也可以通过property标签定义其成员变量值。
上面bean的依赖注入是对象,是引用数据类型,依赖注入一共三种数据类型:
- 普通数据类型
- 引用数据类型
- 集合数据类型
普通数据类型
-
在UserSeviceImpl中定义一个属性
private String username;
,还有它的set方法; -
在applicationContext.xml配置文件:
<bean id="userService" class="service.impl.UserServiceImpl"> <property name="username" value="zhangsan"></property> </bean>
集合数据注入
-
在UserServiceImpl中定义一个集合属性,还有其set方法
private List<String> strList;
-
配置文件:
<bean id="userService" class="service.impl.UserServiceImpl"> <property name="strList"> <list> <value>aaa<value> <value>bbb<value> <value>ccc<value> </list> </property> </bean>
引入配置文件
配置文件中引入其他配置文件(任意位置)
<import resource="applicationContext-xxx.xml">
配置文件总结
主要讲了配置文件(学扎实点,以后常用)
<import>引入其他配置文件
<bean>通过bean标签获取类对象
id:自定义唯一标识符
class:全限定类名
<property>属性注入,通过set方法
name:属性名称
value:属性值
ref:引用其他bean值
<list>列表值
<map>集合值
加载配置文件
ApplicationContext(加载配置文件)的方法:
-
ClassPathXmlApplicationContext:从类的根路径
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao1 = (UserDao) app.getBean("userDao");
-
FileSystemXmlApplicationContext:从磁盘路径(了解即可)
-
AnnotationConfigApplication:当时用注解时使用(以后再学)
getBean()方法,有两种:
UserDao userDao1 = (UserDao) app.getBean("userDao");
UserDao userDao1 = app.getBean(UserDao.class); // 配置文件中只有这一个
配置数据源
数据源就是连接池,数据源的作用:
- 提高程序性能
- 初始化连接资源
- 从数据源中获取连接资源,使用完毕后归还
druid连接池步骤:
-
pom.xml中 导入坐标
<!--spring框架--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <!--连接mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!--druid连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.9</version> </dependency>
-
将druid.properties放入resources文件夹
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/db1 jdbc.username=root jdbc.password=root
-
在applicationContext配置文件中 引入context命名空间和约束路径
<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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd" >
-
在applicationContext配置文件中 加载配置文件
<context:property-placeholder location="classpath:druid.properties"/> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean>
-
写一个测试函数,使用getBean获取连接
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); DruidDataSource dataSource = app.getBean(DruidDataSource.class); Connection conn = dataSource.getConnection(); System.out.println(conn); conn.close();