Spring是什么
是javaSE/EE应用full-stack轻量级开源框架
Spring有什么优势
- 方便解耦
- 方便集成其他框架
- 方便程序的测试
- AOP编程的支持
- 声明式事务的支持
- 降低javeEE api的使用难度
IOC控制反转
spring反向控制应用所需要的外部资源
spring控制的资源放置的spring容器中,称为ioc容器
ioc应用案例
案例环境说明
表现层:UserServlet
业务层:UserService
制作步骤
1.导入spring坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
2.编写业务层与表现层接口与实现类
业务层接口
public interface UserService {
void save();
}
user实现类
public class UserServiceImpl implements UserService {
public void save() {
System.out.println("userService...");
}
}
3.建立spring配置文件
在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>
4.配置所需资源(Service)为spring控制的资源
在applicationContext.xml 的beans标签中添加userService资源
<bean id="userService" class="org.clover.service.impl.UserServiceImpl"/>
5.表现层通过spring获取资源(Service实例)
表现层这里用main方法模拟
public static void main(String[] args) {
//加载配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取资源
UserService userService = (UserService) ctx.getBean("userService");
//调用方法
userService.save();
}
至此,spring简单的案例完成
接下来讲解一下bean标签的其他属性
ioc配置中bean标签的属性
- id & name
bean的名称,可以通过id或者name获取bean。
注意:id要满足xml的命名规范,name可以写多个值,用逗号隔开
-
class
bean的类型 -
scope
定义bean的作用域
-
singleton:这是Spring默认的scope,表示Spring容器只创建一个bean的实例,Spring在创建第一次后会缓存起来,之后不再创建,全容器共享一个实例
-
prototype:代表线程每次调用这个bean都新创建一个实例
-
request:表示每个request作用域内的请求只创建一个实例
-
session:表示每个session作用域内的请求只创建一个实例
-
application:表示每个application作用域内的请求只创建一个实例
-
websocket:表示每个websocket作用域内的请求只创建一个实例
- init-method & destory-method
定义bean对象初始化或者销毁时完成的工作
DI依赖注入
与ioc相对而言,程序运行所需的资源进入应用程序的方式称为注入
依赖注入的方式
- set注入
基本格式:
<property name="propertyName" value="propertyValue" ref="beanId"/>
示范:
<bean id="userDao" class="org.clover.dao.impl.UserDaoImpl"/>
<bean id="userService" class="org.clover.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao" />
</bean>
name:对应bean中的属性名,要求该属性必须提供可访问的set方法
value:设定非引用类型属性对应的值,不能与ref同时使用
ref:设定引用类型属性对应bean的id ,不能与value同时使用
- 构造器注入
基本格式:
<bean>
<constructor-arg name="argsName" value="argsValue" />
</bean>
示范:
<bean id="userDao" class="org.clover.dao.impl.UserDaoImpl"/>
<bean id="userService" class="org.clover.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao" />
<constructor-arg name="name" value="clover" />
</bean>
- 集合类型注入
list props array set map
<property name="list">
<list>
<value>clover</value>
<value>123123</value>
</list>
</property>
<property name="properties">
<props>
<prop key="name">clover</prop>
<prop key="value">123123</prop>
</props>
</property>
<property name="array">
<array>
<value>123123</value>
<value>321321</value>
</array>
</property>
<property name="hashset">
<set>
<value>clover</value>
<value>123321</value>
</set>
</property>
<property name="hashmap">
<map>
<entry key="name" value="clover"/>
<entry key="value" value="123321"/>
</map>
</property>
Spring如何读取properties文件
1、开启context命名空间支持
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd"
>
</beans>
头部加上三行内容
xmlns:context="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
2、加载properties文件
<context:property-placeholder location="classpath:jdbc.properties">
3、使用properties中的数据
<property name="driverClassName" value="${jdbc.driver}"/>
spring配置文件中加载第三方资源
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mysql"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
spring整合mybatis基本配置
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--加载perperties配置文件-->
<context:property-placeholder location="classpath:*.properties"/>
<!--加载druid资源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<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>
<!--配置service,注入dao-->
<bean id="accountService" class="org.clover.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
<!--创建连接用的对象-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="org.clover.domain"/>
</bean>
<!--加载mybatis映射配置的扫描-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.clover.dao"/>
</bean>
</beans>