后端框架(3):Spring(1)
Spring是什么?
spring是一个轻量级的,IOC和AOP的一站式Java 开发框架。
目的是为了简化企业级应用开发而生的。
轻量级:框架体积小(核心模块)
IOC:Inversion of Control 控制反转 把创建对象的控制权,反转给spring框架
以前我们在程序中需要对象,都是自己new,例如:new StudentDao对象
AOP:Aspect Oriented Programming 面向切面编程
将程序中的一些公共的非业务代码分离提取出来,然后在业务代码执行时,给他们横切进来。
使用的动态代理的机制实现,在我们的业务代码,不显示的调用,但是执行业务代码,会通过代理对象,调用非业务代码。
一站式:除了核心的IOC和AOP功能之外,还对数据访问层,web层都有封装,所以是一站式的
Spring 体系结构
Spring Hello World 搭建
1、Maven导入spring核心基础jar
<!-- spring-context--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.2.RELEASE</version></dependency>
2、编写spring配置文件
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="admin" class="com.ffyc.springpro.model.Admin"> </bean>
</beans>
3、编写一个测试类(Admin)
public class Admin {private String account;private String password;public Admin() {System.out.println("Admin 无参构造");}public Admin(String account, String password) {this.account = account;this.password = password;}public String getAccount() {return account;}public void setAccount(String account) {System.out.println("setAccount");this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {System.out.println("getPassword");this.password = password;}@Overridepublic String toString() {return "Admin{" +"account='" + account + '\'' +", password='" + password + '\'' +'}';}
}
4、测试spring
/*ClassPathXmlApplicationContext 是spring框架中的一个具体的实现类,负责生成,管理程序中的对象可以看作是一个容器,所以一般把spring框架也称为spring容器,或者IOC容器new ClassPathXmlApplicationContext("spring.xml");getBean("admin"); 从spring框架(容器)中获取到需要的对象*/ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");Admin admin = (Admin) applicationContext.getBean("admin");Admin admin1 = applicationContext.getBean("admin", Admin.class);System.out.println(admin);System.out.println(admin1);
IOC(控制反转)
控制反转 这是一种编程思想
把生成对象的控制权,反转给spring框架管理,spring框架负责管理对象的整个生命周期过程。 对外提供获取对象的方法。我们在程序中哪里需要使用,在哪里获取即可
spring bean管理
bean对象,由于把对象交给spring管理后,spring会对对象进行功能的增强,所以在spring框架中生成的对象,统一称为bean对象
区分这个对象是我们自己new的还是spring框架生成的
spring中bean管理有两种方式:
1、基于xml配置方式
<bean id="admin" class="com.ffyc.springpro.model.Admin" scope="prototype">
<constructor-arg name="account" value="admin"></constructor-arg>
<constructor-arg name="password" value="111"></constructor-arg>
</bean><bean id="adminDao" class="com.ffyc.springpro.dao.AdminDao"></bean><bean id="adminService" class="com.ffyc.springpro.service.AdminService">
<property name="adminDao" ref="adminDao"></property>
</bean>
bean 配置需要spring管理的类
id 生成的对象名
class 全类名
name 对象别名,可以为多个
scope: singleton(默认值):在 Spring 中只存在一个bean实例, 单例模式. prototype:原型 getBean()的时候都会new Bean()
2、基于注解方式
<!--开启spring注解扫描功能 指定扫描的包--><context:component-scan base-package="com.ffyc.springpro"> </context:component-scan>
注解创建对象
@Component(value = "admin")
@Scope(value = "prototype")
//等同于xml中<bean id="admin" class="com.ffyc.springpro.model.Admin" scope="prototype">
@Repository(value = "adminDao")//基于dao层
@Service(value = "adminService")//基于service层
spring注解方式bean管理
自动注入
@Autowired 是spring框架提供的注解
用于在属性和属性的set方法上,如果用在属性上,set方法都不需要再写了
默认情况下,要注入的值不能为空,required=true
自动注入(@Autowired)有两种值的匹配方式:
1.通过属性的类型查找 (默认)
2.通过对象的名字查找 与@Qualifier(value = "adminDao")一起使用
@Resource 是java语言中提供的注解标签
也是添加在属性上,不需要写set方法,注入的值也是不能为空的,也可以通过类型查找要注入的对象,也可以通过对象名字查找要注入的对象 @Resource(name = "adminDao")
注解与 XML 的对比
注解优点: 方便、直观、高效(代码少,没有配置文件的书写那么复杂)。
注解缺点:以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。
xml 优点是: 配置和代码是分离的,在 xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载。
xml 的缺点是:编写麻烦,效率低,大型项目过于复杂。
Spring 数据访问层管理
步骤:
1、在pom.xml中导入Spring-jdbc数据访问层jar包
<!-- 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>
2、在spring.xml中管理数据源对象
spring管理数据库链接对象
本次采用阿里巴巴数据库连接管理对象
<!--阿里巴巴数据库连接管理对象,负责生成数据库连接对象,以及提供数据库连接池功能让spring管理阿里巴巴数据库连接对象--><bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name = "driverClassName" value = ""></property><property name = "url" value=""></property><property name= "username" value=""></property><property name="password" value=""></property><property name="initialSize" value="10"></property><!--初始化连接数量--><property name="maxActive" value="20"></property><!--最大连接数量--></bean>
Spring集成Mybatis
Spring集成Mybatis其核心是将SqlSessionFactory交由Spring管理,并由Spring管理对dao接口的代理实现。
1、在pom.xml中导入mybatis jar包
<!--spring集成mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency>
2、在spring.xml中配置sqlSessionFactory
<!--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"><!--扫描mappers映射文件--></property></bean>
3、在spring.xml中指定生成接口代理
<!--生成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>