目录
[二.Spring Hello World 搭建](#二.Spring Hello World 搭建)
[1.导入mybatis--spring 插件包](#1.导入mybatis--spring 插件包)
[2.在spring.xml中配置 sqlSessionFactory](#2.在spring.xml中配置 sqlSessionFactory)
一.Spring是什么?
Spring 是一个轻量级的,IOC 和 AOP 的一站式 Java 开发框架,是为了简化企业级应用开发而生的。
轻量级:框架体积小(核心模块)
IOC :Inversion of Control 控制反转,把创建对象的控制权交给Spring框架,而非传统实现中由程序代码直接操控.
AOP:Aspect Oriented Programming 面向切面编程,将程序中的一些公共的非业务代码分离提取出来,然后在业务代码执行时,给他们横切进来,使用的是动态代理的机制实现,在我们的业务代码中不显示地调用,但是业务代码的执行会通过代理对象调用。
Spring的官方网址:https://spring.io/
二.Spring Hello World 搭建
1.创建一个普通的maven项目
通过maven导入 spring 核心基础的 jar 包:
<!-- spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.2.RELEASE</version> </dependency>
2.编写spring的配置文件
以spring.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>
在 resources 包下创建一个spring的配置文件,将上述代码复制到此中。
3.编写一个实体类
在 java 包下创建一个实体类(包含get set方法,无参,有参构造方法)。
eg:这里用Person来举例。
4.在spring.xml文件中配置实体类信息
这里用到<bean>标签,里面的两个参数:id="标签名" class="这里写的是集成进来的类的全类名" <bean id="person" class="com.zyk.springpro.model.Person"></bean>
5.定义一个测试类
在测试类中,需要将在配置文件中配置的实体类信息给集成进来,就要用到:
ClassPathXmlApplicationContext()是spring框架中的一个具体的实现类 ,负责生成,管理对象中的类可以看作是一个容器,所以一般把spring框架称为spring容器或者IOC容器。
java
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");
想要得到实体类对象就需要 getBean() 方法:
getBean()方法:让spring框架去生成类(集成进spring中的)的对象。
java
Person person =(Person) applicationContext.getBean("person");
Person person1 = applicationContext.getBean("person",Person.class);
参数中写的就是刚才在 spring.xml 配置文件中的配置的 id 。getBean()中参数若只有一个配置信息的id,那么返回值就是Object类的对象,想要得到Person类就需要强制转型;参数中还有一个Class类的对象,返回值的类型就会很明确了。
三.XML配置bean管理
1.bean标签
在bean标签中的基本属性:
id="对象名称,可以在getBean中获得spring对象" class="让spring管理的类的地址" scope="配置bean的作用域" scope="singleton" 单例的 会在启动spring框架的时候调用 并且后续使用getBean()生成的对象地址都是一样的,是同一个对象 scope="prototype" 原型的(多例的) 后续getBean()生成的对象地址都是不一样的 都不是一个对象
2.依赖注入
依赖注入:在创建对象时,给对象中的属性赋初值。
(1)通过属性注入 set方法
使用到**<bean>** 标签下的**<property>** 标签,通过标签中的 name 和 value 属性进行针对性的对类中的成员变量进行赋值操作。
<bean id="person" class="com.zyk.springpro.model.Person" scope="prototype"> <property name="id" value="20041026"></property> <property name="name" value="芋泥"></property> </bean>
(2)通过构造方法进行注入
使用到**<bean>** 标签下的**<constructor-arg>** 标签,同样通过标签中的 name 和 value 属性进行针对性的对类中的成员变量进行赋值操作。
<bean id="person" class="com.zyk.springpro.model.Person" scope="prototype"> <constructor-arg name="id" value="20041026"></constructor-arg> <constructor-arg name="name" value="mark"></constructor-arg> </bean>
3.依赖注入的补充
在一个类(A)中有其他类(B)作为属性,调用类B中的方法,这个时候就需要将两个类都配置在spring.xml文件中。
<!-- PersonService类中有PersonDao类型的属性,其中必需要存在对应的get和set方法,所以new的对象应该是PersonService的对象通过PersonService然后再调用其中的PersonDao类中的savePerson()方法,这个时候就需要用到<property>中的ref属性,属性中找的是在spring.xml中配置的对应类的id --> <bean id="personDao" class="com.zyk.springpro.dao.PersonDao" scope="prototype"></bean> <bean id="personService" class="com.zyk.springpro.service.PersonService" scope="prototype"> <property name="personDao" ref="personDao"></property> </bean>
在<property>标签中,对于属性是某一个类的时候,就需要使用到 ref 属性 ,属性中找的是在spring.xml中配置的对应类的 id 。
调用:
java
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring.xml");
//PersonService中有PersonDao属性
PersonService personService = classPathXmlApplicationContext.getBean("personService", PersonService.class);
//savePerson()是PersonService中的方法,此方法中调用了属性(PersonDao中的方法savePerson())
personService.savePerson();
四.注解配置bean管理
1.开启注解扫描
首先,要想使用注解的方式对bean进行管理,就需要先在spring.xml文件中去开启注解扫描。
<!--开启注解扫描,配置文件中没有这个标签,还需要定义进来,开启后就可以使用注解降低代码量了--> <!--包名就写到springpro--> <context:component-scan base-package="com.zyk.springpro"> </context:component-scan>
2.使用注解对类进行配置
**对于Model层(模型类):**一般使用 @Component注释,其中有一个变量 value 相当于在xml配置bean管理中的 id 。
对于模型类还有一个注解:@Scope 用来配置bean的作用域 其中的变量 value 可以是 singleton (单例的)和 prototype(原型的)。
@Component(value = "person") //相当于 <bean id="person" class="com.zyk.springpro.model.Person"> @Scope(value = "prototype") //相当于 scope="prototype" 原型的 singleton 单例的
对于Dao层(直接与数据库打交道的类):一般使用**@Repository** 注解,其中也有一个 value 变量。
对于Service层:一般使用 @Service 注解,其中也有一个 value 变量。
在Service层当中,如果存在属性是其它类的对象时,在此对象前也需要加上 @Autowired 注解,就可以不用对对象属性进行初始化赋值和重写 set 和 get 方法了,而且对象不能为空。
注意:@Component ,@Repository,@Service 注解都可以实现创建对象的功能,只是为了后续扩展功能,在不同的层使用不同的注解标记。
3.自动注入
@Autowired是spring框架提供的注解,用于属性和属性的 set 方法上,如果写在属性上就可以不写set方法,默认情况下注入的值不能为空,默认注解中的属性 required=true。
@Qualifier 也是自动注入使用的注解,其中有一个 value 属性,通过对象名字来查找注入。
自动注入有两种匹配的方式:
(1)使用属性的类型查找
(2)通过对象的名字查找
@Resource 是 java 语言中提供的注解标签,也是添加在属性上,不需要写 set 方法,注入的值也是不能为空的,可以通过类型来自动注入(@Resource),也可以通过对象名字来查找要注入的对象(@Resource(name="personDao"))
五.面向切面编程AOP
1.概述
面向切面编程是对面向对象编程的补充延续,面向切面编程思想是将程序中的非业务代码(提交事务,打印日志,权限验证,统一异常处理)在调用业务代码时,通过一个代理对象帮助我们调用这些提取出来的非业务代码,这样在业务代码当中就不用显示的调用非业务代码,这样最终就做到了业务代码和非业务代码的分离,降低了耦合度。
面向切面编程的好处:降低了模块之间的耦合度。
面向切面编程的原理:采用动态代理模式,给业务代码生成代理对象。
2.通知
在使用通知之前,需要在spring.xml中开启自动代理。
<!--开启自动代理--> <aop:aspectj-autoproxy />
AspectJ 中常用的通知有五种类型:
使用通知的类前需要加上:@Component @Aspect 注解才可以使用通知
前置通知,后置通知,环绕通知,异常通知,返回通知.
@Before 前置通知:方法执行之前
@After 后置通知:方法执行之后,无论是否出现异常
@AfterReturnning 返回通知:方法成功执行之后通知,出现异常不执行
通知后面的参数可以用来设置哪些类中的哪些方法经过此非业务代码,具体实例如下:
@AfterThrowing 异常通知:抛出异常之后通知
异常通知中还有 throwing 参数,主要是出现异常后用来打印异常信息使用的。
@Around 环绕通知:方法执行前后都有通知
环绕通知中,包含了以上四种通知类型,而且在 try 代码块中还可以获取目标方法的参数以及调用目标业务方法。
@Around(value = "execution(* com.zyk.springpro.dao.PersonDao.*(..))") public void aroud(ProceedingJoinPoint joinPoint){ try { System.out.println("前置通知"); Object[] args = joinPoint.getArgs(); //获取到目标方法的参数 System.out.println(Arrays.toString(args)); Object proceed = joinPoint.proceed(); //调用目标业务方法 System.out.println("返回通知"); } catch (Throwable throwable) { throwable.printStackTrace(); System.out.println("异常通知"); } System.out.println("后置通知"); }
六.spring事务管理
1.数据库事务管理
数据库事务管理就是对一次数据库操作过程中执行的多条语句进行管理,保 证一次对数据库操作过程中多条 sql 要么都执行成功,要么都不执行,从而确保数 据一致性. 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操作数据的并不可靠,需要在这种情况下进行回退。事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态,这些操作要么都完成,要么都取消,从而保证数据满足一致性的要求。
2.spring事务管理
事务管理本质上是数据库提供的一种管理机制,spring事务管理只是对于事务提交这一功能进行了封装。Spring 事务管理就是 spring 框架针对程序中提交事务这部分非业务代码进行分离管理,减轻程序员负担.在程序执行没有问题时,提交事务,出现问题时,回滚事务。(是对一次数据库操作过程中执行的多条sql语句进行管理,确保一次操作过程中的多条sql语句都执行成功,要么就都不执行)
spring事务管理分为两种形式:
(1)编程式事务管理:需要在代码中自己控制事物的提交和回滚。
(2)声明式事务管理:建立在AOP的基础上,本质上是对方法前后进行拦截,所以声明式事务管理是方法级别的。
3.基于注解实现的spring事务管理
Spring 框架,提供事物管理实现类是 DataSourceTransactionManager.
想要使用spring事务管理,首先需要在spring.xml中配置spring事务管理器:
<!-- 配置 spring 事务管理器-->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
与此同时,还需要开启注释事务管理:
<!-- 开启注解事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
4.spring事务管理的使用
由于我们已经做好了spring事务管理的配置信息,下面可以在需要进行spring事务管理的类/方法前加上 @Transactional 注解标签,就可以对此类/方法进行事务管理了。
5.声明式事务不生效的场景
在下面几种情况下,即使我们加上了 @Transactional 注解,仍然没有进行事务管理。
(1)标签用在 非public 方法上。
(2)异常被catch捕获。
(3)出现编译期异常。eg:
在**@Transactional**上还有一个 rollbackFor 变量,可以使变量的值等于 Exception.class ,使事务可以接受所有的异常种类。
(4)数据库引擎不支持事务
在 Mysql 中,目前只有 InnoDB 支持事务管理,其他引擎都是不支持的。
七.spring集成mybatis
Spring 集成 Mybatis 其核心是将 SqlSessionFactory 交由 Spring 管理,并由Spring 管理对 dao 接口的代理实现。
1.导入mybatis--spring 插件包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
2.在spring.xml中配置 sqlSessionFactory
<!--配置 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>
3.指定生成接口代理
<!--指定生成接口代理--> <bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.zyk.ssm.dao"></property> <!--指定接口所在的包--> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"> </property> </bean>
4.在service中注入Dao代理接口
总结
本篇博客总结出Java后端框架--Spring的体系结构,指出 IOC(控制反转) 和 AOP(面向切面编程) 的思想和具体的实现,同时还指出spring中的事务管理以及在spring中集成mybatis的详细步骤。
喜欢博主这篇博客的同学可以三连支持起来!!!