1.Spring概念
spring是一个轻量级的,IOC和AOP的一站式java开发框架,简化企业级开发。
轻量级:框架体积小(核心模块)
IOC:inversion of Control 控制反转 把创建对象的控制权,反转给Spring框架
以前在程序中需要创建对象,需要new+对象名,例如 new StudentDao对象
AOP:Aspect Oriented Programming 直译过来就是面向切面编程。将程序中的公共的非业务的代码,分离提取出来,然后在业务代码执行时,将其横切进来。使用的动态代理机制实现的,在业务代码中,不显示的调用,但执行业务代码,会通过代理对象,调用非业务代码。
一站式:除了核心的IOC,AOP功能之外,还对数据访问层,web层,都有封装,所以是一站式
2.Spring体系结构
官网地址:https://spring.io/
3.搭建Spring Hello World
1.创建一个Maven工程
2.Maven 导入 spring 核心基础 jar
在pom.xml文件中导入spring依赖jar包
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<?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="admin" class="com.ffyc.springpro.model.Admin"></bean>
</beans>
3.测试结果
public class Test1 {
public static void main(String[] args) {
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");
Admin admin1=(Admin)applicationContext.getBean("admin");//获取到对象名,然后强转成Admin对象
Admin admin= applicationContext.getBean("admin",Admin.class);
System.out.println(admin);
System.out.println(admin1);
}
}
4.IOC(控制反转)
管理。(把生成的对象的控制权,反转给spring框架,spring框架负责管理对象的整个生命周程,对外提供获取对象的方法,我们在程序中哪里需要使用,在那里获取即可)
4.spring bean管理
bean对象:由于把对象交给spring管理后,spring会对对象进行功能的增强,所以在是spring框架中生成的对象,统一称为bean对象。
区分这个对象使我们自己new的还是spring框架生成的。
spring中的bean管理有两种方式:
1.基于xml配置方式
xml配置方式依赖注入:
依赖注入:在创建对象时,为对象属性赋值
(1)通过属性注入,属性的set方法
<bean id="admin" class="com.ffyc.springpro.model.Admin" scope="singleton">
<property name="account" value="admin"></property>
<property name="password" value="111"></property>
</bean>
(2)通过构造方法注入
<bean id="admin" class="com.ffyc.springpro.model.Admin" scope="singleton">
<constructor-arg name="account" value="account"></constructor-arg>
<constructor-arg name="password" value="111"></constructor-arg>
</bean>
2.注解方法实现管理
(1)开启注解扫描
在spring.xml配置文件中配置一下代码:
<bean id="admin" class="com.ffyc.springpro.model.Admin" scope="singleton">
<constructor-arg name="account" value="account"></constructor-arg>
<constructor-arg name="password" value="111"></constructor-arg>
</bean>
(2)注解创建对象
model层用@Componen
在com.ffyc.springpro.model包下的Admin.java文件,添加@Component(value=“admin”)
@Component(value = "admin") @Scope(value = "prototype")
//等同于xml中 <bean id="admin" class="com.ffyc.springpro.model.Admin" scope="prototype">
dao层用@Repository
在com.ffyc.springpro.dao包下的AdminDao.java文件,添加@Repository
@Repository(value = "adminDao")等同于xml文件中的
<bean name="adminDao" class="com.ffyc.springpro.dao.AdminDao">
service层用@Service
在com.ffyc.springpro.service包下的AdminService.java文件,添加在com.ffyc.springpro.dao包下的AdminDao.java文件,添加@Repository
@Service(value = "adminService")等同于xml文件中的
<bean id="adminService" class="com.ffyc.springpro.service.AdminService">
可用于这个层的其他注解
1.@Scope
@Scope(value=“prototype”) 原型(多例的) 在每一次获得对象时,创建一个新对象
@Scope(value=“ singleton ”) 单例 在spring框架启动时,就创建对象,始终只创建一个对象
等同于xml文件中的 scope="prototype" scope="singleton "
2.@Autowired
@Autowired spring框架提供的标签/注解, 用于属性和属性的set方法上, 如果写在属性上,set方法都可以不需要, 默认情况下,要注入的值是不能为空的 required=true 如果允许 null 值,可以设置它的 required 属性为 false。
自动注入有两种值的匹配方式
1.通过属性的类型查找
2.通过对象的名字查找
结合@Qualifier注解来找到对象的名字
3.@Resource
是java语言中提供的注解标签 也是添加在属性上,不需要set方法 注入的值也不能为空
自动注入有两种值的匹配方式
1.可通过类型查找注入的对象 @Resource 通过属性类型查找
2.可通过对象名查找注入的对象 @Resource(name = "adminDao")
3.注解与 XML 的对比
5.Spring 数据访问层管理
开发步骤
1.下载 Spring jdbc 数据访问层 jar 包
在pom.xml文件中配置(同时导入mysql依赖和阿里数据源依赖)
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- 阿里数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
2.管理数据源对象
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="initialSize" value="10"></property><!--初始化连接数量-->
<property name="maxActive" value="20"></property><!--最大连接数量-->
</bean>
<!--
配置spring中对jdbc进行封装的操作类,叫JdbcTemplate
-->
<bean class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="druidDataSource"></property>
</bean>
3.测试用例
在AdminDao.java文件中添加方法
在Test中测试方法:
运行结果:
这种就表明数据访问层与数据库连接成功。
6.Spring集成Mybatis
1.导入 mybatis jar 包
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!--mybaits依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<!-- spring-context spring 核心功能-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- 阿里数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--Spring 结合 mybatis 插件包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- lombok 插件jar包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
2.配置mybatis.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--mybatis核心全局配置文件-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 全局二级缓存开关-->
<setting name="cacheEnabled" value="true"/>
</settings>
<!--为类配置别名-->
<typeAliases>
<!--
<typeAlias type="com.ffyc.mybaitspro.model.Admin" alias="Admin"></typeAlias>
-->
<package name="com.ffyc.ssm.model"/>
</typeAliases>
</configuration>
3.配置spring.xml文件
<!--spring 管理生成sqlSessionFactory对象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="druidDataSource"></property><!--注入数据源-->
<property name="configLocation" value="classpath:mybatis.xml"></property><!--配置mybatis配置文件-->
<property name="mapperLocations" value="classpath:mappers/*Mapper.xml"><!--扫描mapper映射文件-->
</property>
</bean>
在 service 中注入 Dao 代理接口,此接口有由Spring 代理实现
指定生成接口代理
<!--生成dao包下所有接口的代理对象-->
<bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ffyc.ssm.dao"></property><!--指定接口接口所在的包-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory">
</property>
</bean>
运行结果测试:
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");
LoginService loginService=applicationContext.getBean("loginService",LoginService.class);
Admin admin=new Admin();
admin.setAccount("admin");
admin.setPassword("111");
Admin admin1= loginService.login(admin);
System.out.println(admin1);
}
}
7.Lombok
1.概念
Lombok是一个Java库,能自动插入编辑器并构建工具,简化Java开发。通过添加注解的方式,不需要为类编写getter或eques方法,同时可以自动化日志变量。
2.lombok使用
1.安装lombok插件
2.在pom.xml中添加lombok 插件jar包依赖
<!-- lombok 插件jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
3.使用
在com.ffyc.model文件下的Admin.java文件中添加@Data注解,来使用插件
运行结果:
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");
LoginService loginService=applicationContext.getBean("loginService",LoginService.class);
Admin admin=new Admin();
admin.setAccount("admin");
admin.setPassword("111");
Admin admin1= loginService.login(admin);
System.out.println(admin1);
}
}