Spring
1.Spring是什么?
spring是一个开源的Java应用框架,它提供了一套全面的基础设施支持
2.Spring框架的主要特点
1)依赖注入(Dependency Injection,DI)
2)面向切面编程(AOP)
3)事务管理
4)Web支持
5)数据访问
6)测试支持
7)扩展性
3.为什么使用Spring?
1)方便解耦,简化开发
2)Spring就是一个大工厂,可以将所有对象创建和依赖关系维护的工作交给Spring来完成
3)Spring提供面向切面编程,可以方便地实现对程序进行权限拦截、运行监控等功能
4)声明式事务的支持只需要通过配置就可以完成对事务的管理
5)方便集成各种优秀的框架
6)降低JavaEE中API的使用难度
4.Spring的IOC
IOC是控制反转,即获取依赖对象的过程被反转了。
控制反转之后,获取依赖对象的过程由自身管理变成了由IOC容器自动注入。
简单来讲,控制反转之后,获取依赖对象的过程从原来的自己new一个对象变成了从IOC容器中拿出来直接用即可。
5.Spring的环境搭建
5.1创建项目
5.2引入核心依赖
首先,在最外层的pom.xml文件中引入Spring的核心基础依赖
<!--Spring核心基础依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<!--日志相关-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--测试相关-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
然后,在properties标签下引入spring的版本
<spring.version>4.2.5.RELEASE</spring.version>
还需要设置打包方式,其中pom为不参与打包,jar为打为jar包,war为打为war包
<packaging>pom</packaging>
5.3添加配置文件
在每个子模块下的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
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
5.4将bean的实例化工作交给Spring来完成
5.4.1通过set方法注入
service层中UserServiceImpl类中的代码
public class UserServiceImpl implements IUserService {
@Setter
private IUserMapper userMapper;
@Override
public User getUserById(int id) {
User userById = userMapper.getUserById(id);
return userById;
}
}
在IOC容器中进行设置
<bean name="userMapper" class="com.tledu.lsz.mapper.UserMapperImpl"/>
<!--name为属性名字 / ref为引用的bean的名字-->
<bean name="userService" class="com.tledu.lsz.service.UserServiceImpl">
<property name="userMapper" ref="userMapper"/>
</bean>
测试
public class UserTest {
@Test
public void getUserById() {
int id = 1001;
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
// userService是bean的id或name
UserServiceImpl userService = (UserServiceImpl) applicationContext
.getBean("userServiceImpl");
User userById = userService.getUserById(id);
System.out.println(userById);
}
}
5.4.2通过构造方法注入
service层中UserServiceImpl类中的代码
public class UserServiceImpl implements IUserService {
private IUserMapper userMapper;
public UserServiceImpl() {
}
public UserServiceImpl(IUserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public User getUserById(int id) {
User userById = userMapper.getUserById(id);
return userById;
}
}
在IOC容器中进行设置
<bean name="userMapper" class="com.tledu.lsz.mapper.UserMapperImpl"/>
<!--name 属性名字 / ref 引用的bean的名字-->
<bean name="userService" class="com.tledu.lsz.service.UserServiceImpl">
<constructor-arg ref="userMapper"/>
</bean>
6.scope
6.1singleton
如果scope取值为singleton,表明容器中创建时只存在一个实例,也就是单例模式
如果不进行设置scope,默认就是singleton
6.2prototype
每次获取都创建一个新的对象,并且这个对象的生命周期不归Spring管理
7.自动装配(自动注入)
通过Autowire,有两种取值:①byName ②byType
7.1byName
byName是通过set方法的名字进行匹配的,如果找不到,就是不赋值
例如setUserMapper方法,通过byName,就会找到userMapper,如果bean的name或id也为userMapper,就可以找到(区分大小写)
<bean name="userMapper" class="com.tledu.lsz.mapper.UserMapperImpl"/>
<!--name 属性名字 / ref 引用的bean的名字-->
<bean name="userService" class="com.tledu.lsz.service.UserServiceImpl" autowire="byName">
</bean>
public class UserServiceImpl implements IUserService {
private IUserMapper userMapper;
//set方法 找的时候 把set去掉 U改为小写 找的是userMapper
public void setUserMapper(IUserMapper userMapper) {
this.userMapper = userMapper;
}
public UserServiceImpl() {
}
public UserServiceImpl(IUserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public User getUserById(int id) {
User userById = userMapper.getUserById(id);
return userById;
}
}
7.2byType
byType是通过set方法的参数列表中的数据类型进行匹配的,如果beans.xml中出现了多个相同类型的对象,就会报错
如setUserMapper(IUserMapper userMapper)方法,通过byType,就会找到IusMapper,如果是接口,就去找对应的实现类
<bean name="userMapper" class="com.tledu.lsz.mapper.UserMapperImpl"/>
<!--name 属性名字 / ref 引用的bean的名字-->
<bean name="userService" class="com.tledu.lsz.service.UserServiceImpl" autowire="byType">
</bean>
public class UserServiceImpl implements IUserService {
private IUserMapper userMapper;
public void setUserMapper(IUserMapper userMapper) {
this.userMapper = userMapper;
}
public UserServiceImpl() {
}
public UserServiceImpl(IUserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public User getUserById(int id) {
User userById = userMapper.getUserById(id);
return userById;
}
}
8.生命周期
在bean标签中设置属性init-method=“方法名”,在初始化时会执行该方法
在bean标签中设置属性destroy-method=“方法名”,在销毁时会执行该方法
9.迟加载
在bean标签中设置属性lazy-init=“true"或"false”