Spring 简介
1. 概念
分层的轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)
2. 优势
* 方便解耦,简化开发
* 支持AOP编程
* 支持声明式事物
* 方便程序测试
* 方便继承各种优秀框架
* 降低JavaEE API的使用
* 源码是编码规范的范例
3. 体系结构
Spring快速入门
开发步骤
1. 导入Spring开发的基本包坐标
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
</dependencies>
2. 编写Dao接口和实现类
3. 创建Spring核心配置文件
在resources创建applicationContext.xml
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
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
4. 在Spring配置文件中配置实现类
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
5. 在Spring的API获得Bean实例
ApplicationContext app = new ClassApplicationContext("applicationContext.xml");
//UserDao userDao = (UserDao) app.getBean("userDao"); 通过Id从容器中获取
UserDao userDao = app.getBean(UserDao.class); //通过Java类型从容器中获取,容器中有多个不可用
Spring核心配置文件
1. Bean标签
概念:用于配置对象交由Spring来创建,默认情况下调用无参构造方法,如果对象没有无参构造方法则不能创建成功
基本属性:
id:Bean实例再Spring容器中的唯一标识
class:Bean的全限定名称
可选属性:
scope:
singleten,单例的(默认);在应用加载时创建对象,应用卸载时随容器的销毁而销毁
prototype,多例的;使用对象时创建新的对象实例,长时间未使用被Java垃圾回收机制回收
实例化方式:
无参构造方法实例化(默认)
<bean id = "userDao" class = "cn.spring.dao.impl.UserDaoImpl" />
工厂静态方法实例化
<bean id = "userDao" class = "cn.spring.factory.StaticFactoryBean" factory-method = "createUserDao" />
工厂实例方法实例化
<bean id = "factoryBean" class = "cn.spring.factory.DynamicFactoryBean" />
<bean id = "userDao" factory = "factoryBean" factory-method = "createUserDao" />
2. 依赖注入(Dependency Injection)
-
set方法注入
1. 创建UserService实例,为UserService添加UserDao属性,UserService内部调用UserDao的save()方法 2. 在Spring容器中配置UserService实现类,利用property标签配置UserDao属性 <bean id="userService" class=“cn.spring.service.impl.UserServiceImpl”> <property name="userDao" ref="userDao" /> </bean>
-
p命名空间注入
1. 引入p命名空间 xmlns:p="http://www.springframework.org/schema/p" 2. 注入 <bean id="userService" class="cn.spring.service.impl.UserServiceImpl" p:userDao-ref="userDao" />
-
构造方法注入
1. 创建有参构造方法 2. 调用有参构造方法注入 <bean id="userService" class="cn.spring.service.impl.UserServiceImpl" > <constructor-arg name="userDao" ref="userDao" /> <bean>
2. 依赖注入的数据类型
-
普通数据类型的依赖注入
<property name="name" value="value" />
-
集合数据类型的注入
(1)List<普通数据类型> <property name="listName"> <list> <value>value1</value> <value>value2</value> <value>value3</value> </list> </property> (2)List<引用数据类型> <bean id="u1" class="com.itheima.domain.User"/> <bean id="u2" class="com.itheima.domain.User"/> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"> <property name="userList"> <list> <bean class="com.itheima.domain.User"/> <bean class="com.itheima.domain.User"/> <ref bean="u1"/> <ref bean="u2"/> </list> </property> </bean>
-
集合数据类型
(1)Map<String, User> <bean id="u1" class="com.itheima.domain.User"/> <bean id="u2" class="com.itheima.domain.User"/> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"> <property name="userMap"> <map> <entry key="user1" value-ref="u1"/> <entry key="user2" value-ref="u2"/> </map> </property> </bean>
-
Properties
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"> <property name="properties"> <props> <prop key="p1">aaa</prop> <prop key="p2">bbb</prop> <prop key="p3">ccc</prop> </props> </property> </bean>
3. 引入其他配置文件(分模块开发)
<import resource="applicationContext-xxx.xml" />
4. 核心配置文件重点配置总结
<bean>标签
id属性:Spring容器中的唯一标识,不允许重复
class属性:实例化Bean的全限定名
scope:Bean的作用范围,常用singleton和prototype
<properye>标签
name属性:属性名
value属性:普通属性值
ref属性:注入的对象引用值
<list>标签
<map>标签
<properties>标签
<constructor-arg>标签
<import>标签:导入其他的Spring的分文件
Spring相关API
ApplicationContext
1. 定义:接口类型,代表应用上下文,可以通过实例获得Spring容器中的对象
2. 实现类:
1) ClassPathXmlApplicationContext
从类的根路径下加载配置文件
2) FileSystemXmlApplicationContext
从磁盘路径上加载配置文件
3) AnnotationConfigApplicationContext
使用注解配置容器对象时,使用此类来创建spring容器
3. getBean()方法
当参数为字符串时从容器中根据id查找,返回值是Object;当参数类型是Class类型时,根据类型从容器中匹配Bean实例,当对应的Bean有多个时报错
Spring配置数据源
1. 数据源开发步骤
1. 导入数据源的坐标和数据库驱动坐标
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
2. 创建数据源对象
3. 设置数据源的基本连接数据
4. 使用数据源获取连接资源和归还连接资源
2. Spring配置数据源
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
3. 抽取JDBC配置文件
1. 引入context命名空间和约束路径
命名空间:xmlns:context="http://www.springframework.org/schema/context"
约束路径:http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
2. Spring容器加载properties文件
<context:property-placeholder location="classpath:jdbc.properties"/>
3. 使用SpringEL表达式获取对应的值
<property name="driverClass" value="${jdbc.driver}"/>
注解开发
0. 回顾
使用ApplicationContext的实现类AnnotationConfigApplicationContext加载注解配置类
1. 原始注解
@Component 使用在类上实例化Bean
@Controller 使用web层类上用于实例化Bean
@Service 使用在service层类上实例化Bean
@Repository 使用在dao层类上实例化Bean
@Autowired 使用在字段上用于根据类型依赖注入
@Qualifier 使用在字段上用于根据名称进行依赖注入,需配合@Autowired使用
@Resource 相当于@Autowired+@Qualifier
@Value 注入普通属性
@Scope 标注Bean的作用范围
@PostConstruct 使用在方法上标注该方法是Bean的初始化方法
@PreDestroy 使用在方法上标注该方法是Bean的销毁方法
2. 新注解
@Configuration 用于指定当前类是一个Spring配置类,创建容器时会加载注解
@ComponentScan 用于指定Spring初始化容器时要扫描的包
@Bean 使用在方法上,会将方法的返回值存储到Spring容器当中
@PropertySource 用于加载properties文件中的配置
@Import 用于导入其他配置类
Spring整合Junit
(1) 导入Spring集成Junit的坐标
(2) 使用@Runwith注解替换原来的运行期:@Runwith(SpringJUnit4ClassRunner.class)
(3) 使用@ContextConfiguration指定配置文件配置类
(4) 使用@Autowired注入需要测试的对象
(5) 创建测试方法进行测试