自学内容网 自学内容网

Spring

目录

一.Spring 是什么?

二.Spring 体系结构

三.Spring Hello World 搭建

1.编写 spring 配置文件

2.创建Java项目

四.Spring Bean 管理

1.基于 xml 配置方式

2.注解方式实现

3.注解与XML的对比

五.Spring 数据访问层管理

六.Spring 集成 Mybatis

1.导入 mybatis jar 包

2.指定生成接口代理

3.注入 Dao 代理接口

七.AOP

1.AOP 概述

2.AOP 的基本概念

3.springAOP 实现

八.Spring 事物管理

1.数据库事务管理

2.spring 事务管理


一.Spring 是什么?

        Spring 是一个轻量级的,IOCAOP一站式 Java 开发框架,是为了简化企业级应用开发而生的。
    IOC
        即 Inversion of Control(控制反转),缩写为 IOC,是由 Spring 管理对象,而非传统实现中由程序代码直接操控。不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。
.
    AOP
        Aspect Oriented Programming 直译过来就是面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。

二.Spring 体系结构

       
          官网地址 :https://spring.io/

 三.Spring Hello World 搭建

        创建一个Maven项目,然后在Maven的pom.xml文件里导入 spring 核心基础 jar包
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>

1.编写 spring 配置文件

        在resources文件夹创建一个文件,名为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">
<bean id="user" class="...路径"> </bean>
</beans>

2.创建Java项目

        Admin类就写简单的私有属性,构造方法,getter,setter方法,写完后,在刚刚创建的spring.xml文件里配置Admin类,如下所示:

<?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">


    <!--在spring的配置文件注册需要spring框架管理的类-->
    <bean id="admin" class="com.ffyc.springpro.model.Admin"></bean>

</beans>

        接下来在Test1类中就要写测试代码了:

package com.ffyc.springpro.test;

import com.ffyc.springpro.model.Admin;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test1 {
    public static void main(String[] args) {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
        Admin admin1 = (Admin) applicationContext.getBean("admin"); //返回类型为object,需强制转换为Admin类型
        Admin admin = applicationContext.getBean("admin", Admin.class);//也可在后面加“Admin.class”
        System.out.println(admin);
        System.out.println(admin1);
    }
}

结果如图所示:

 四.Spring Bean 管理

1.基于 xml 配置方式

bean:配置需要spring管理的类,
id:生成的 对象名
class:全类名,
name:对象别名,可以为多个
scope:
        singleton(默认值):在Spring中只存在一个bean实例, 单例模式.
        prototype:原型 getBean()的时候都会 new Bean()
        request: 每次http请求都会创建一个bean, 仅用于WebApplicationContext环境

Xml 配置方式依赖注入【DI:Dependency Injection】

        指Spring创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设置给该对象。
注入的方式:
        (1)set 方法注入
        (2)构造方法注入
        示例如下所示:
    <!--IOC指的是让spring框架创建对象,创建对象的同时还有一个动作称为依赖注入
    依赖注入:在创建对象的时候,为对象中属性赋值
    两种方式:-->


    <!--scope=“singleton”  单例的 (默认) 在spring框架启动时就创建对象,
       而且始终只创建了一个对象,相同的内存地址

    scope=“prototype”  原型的(多例的) 在每次获得对象时,
        创建一个新的对象 ,不同的内存地址-->

    <!--1.通过属性注入,属性的set方法,set方法名必须标准-->
   <bean id="admin" class="com.ffyc.springpro.model.Admin" scope="prototype">
        <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="admin"></constructor-arg>
        <constructor-arg name="password" value="111"></constructor-arg>
    </bean>

2.注解方式实现

在xml文件中,开启注解扫描:
< context :component-scan base-package ="包名" > </ context :component-scan >
注解创建对象:
        @Component(value=“user”)等同于 <bean id=“user” class=“”></bean>
        @Service
        在service包中的类前添加“@Service”,用法与“@Component”相同,在不同的包中名字不同而已
        
        @Repository

        在dao包中的类前添加“@Repository”,用法与“@Component”相同,在不同的包中名字不同而已
        
        以上注解都可以实现创建对象功能,只是为了后续扩展功能,在不同的层使用不同的注解标记
        @Scope(value=“prototype”) 原型
        @Scope(value=“ singleton ”) 单例

 注解方式注入【DI:Dependency Injection】

@Autowired
         @Autowired 是 Spring 提供的注解,可以写在字段和 setter 方法上。如果写在字段上,那么就不需要再写 setter 方法。默认情况下它要求依赖对象必须存在,如果允许 null 值,可以设置它的 required 属性为 false。         required() default== true

        byType 自动注入:该注解默认使用按类型自动装配 Bean 的方式。

        例如:        

                   AdminDao adminDao;

        @Autowired通过AdminDao类型可以找到adminDao

        byName 自动注入:如果我们想使用 按照名称(byName) 来装配,可以结合 @Qualifier 注解一起使用。
                  @Autowired

        例如:@Qualifier(value = "adminDao")

        需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的 value 属性用于指定要匹配的 Bean 的 id 值。


        JDK 注解:

        

        @Resource是java语言提供的注解标签,也是添加在属性上,不需要写set方法
注入的值也是不能为空的。

        @Resource 自动注入:
        Spring 提供了对 jdk 中@Resource 注解的支持。@Resource 注解既可以按名称匹配 Bean,也可以按类型匹配 Bean。默认按照 ByName 自动注入
        例如: @Resource (按类型自动装配)
        byName 注入引用类型属性
        @Resource 注解指定其 name 属性,则 name 的值即为按照名称进行匹配的 Bean 的 id。
        例如: @Resource(name = "adminDao")  (按名称自动装配)

3.注解与XML的对比

优点缺点
注解方便,直观,高效(代码少,没有配置文件的书写那么复杂)以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。
xml
配置和代码是分离的,在 xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载。
编写麻烦,效率低,大型项目过于复杂。

五.Spring 数据访问层管理

        Spring 是个一站式框架:Spring 自身也提供了 web 层的 SpringWeb和持久层的 Spring JdbcTemplate。

开发步骤:

下载 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 >
在xml文件中导入属性文件
<context:property-placeholder location="config.properties"/>
管理数据源对象:spring 管理数据库链接对象,本次采用阿里巴巴数据库连接管理对象
< bean id ="dataSource"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.导入 mybatis jar 包

Spring 结合 mybatis 插件包
< dependency >
< groupId >org.mybatis</ groupId >
< artifactId >mybatis-spring</ artifactId >
< version >1.3.1</ version >
</ dependency >
配置 sqlSessionFactory
< bean id ="sqlSessionFactory" class ="org.mybatis.spring.SqlSessionFactoryBean" >
< property name ="dataSource" ref ="dataSource" ></ property >
< property name ="configLocation"
value ="classpath:mybatis-config.xml" ></ property >
< property name ="mapperLocations" value ="classpath:mappers/*Mapper.xml" >
</ property >
</ bean >

2.指定生成接口代理

< 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 >

3.注入 Dao 代理接口

在 service 中注入 Dao 代理接口,此接口有 Spring 代理实现

七.AOP

1.AOP 概述

        AOP 为 Aspect Oriented Programming 的缩写,意为: 面向切面编程 ,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
        AOP 是 OOP (面向对象过程)的延续,是软件开发中的一个热点,是 java 开发中的一个重要内容。利用 AOP 可以对 业务逻辑 非业务逻辑 进行隔离,从而使得各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
面向切面编程的好处就是: 减少重复,专注业务
核心原理:使用动态代理的方式在执行方法前后或者出现异常的时候做加入相关的逻辑.
使用案例: (1)事务处理:开启事务,关闭事务,出现异常后回滚事务
                 (2)权限判断:在执行方法前,判断是否具有权限
日志:在执行前进行日志处理

2.AOP 的基本概念

连接点(Joinpoint)
类中可以被增强的方法,这个方法就被称为连接点
切入点(pointcut)
类中有很多方法可以被增强,但实际中只有 add 和 update
被增了,那么 add 和 update 方法就被称为切入点(实际实现的连接点)
通知(Advice)
通知是指一个切面在特定的连接点要做的事情(增强的功能)。通
知分为方法执行前通知,方法执行后通知,环绕通知等.
目标(Target)代理的目标对象(连接点,切入点所在类)
代理(Proxy)向目标对象应用通知时创建的代理对象

3.springAOP 实现

        对于 AOP 这种编程思想,很多框架都进行了实现。Spring 就是其中之一,可以完成面向切面编程。
        AspectJ 是一个基于 Java 语言的 AOP 框架,它提供了强大的 AOP 功能,且其实现方式更为简捷,使用更为方便, 而且还支持注解式开发。所以,Spring 又将 AspectJ 的对于AOP 的实现也引入到了自己的框架中。
下载 AOP 相关 jar:
< dependency >
< groupId >org.springframework</ groupId >
< artifactId >spring-aspects</ artifactId >
< version >5.2.2.RELEASE</ version >
</ dependency >
        AspectJ 中常用的通知有五种类型: 前置通知,后置通知,环绕通知,异常通知,返回通知.
@Before 前置通知方法执行之前
@After 后置通知方法执行之后,无论是否出现异常
@AfterReturnning 返回通知方法成功执行之后通知,出现异常不执行
@AfterThrowing 异常通知抛出异常之后通知
@Around 环绕通知

方法执行前后都有通知

可以在业务方法执行之前,之后,出现异常时添加功能

基于注解方式的实现:启动 AspectJ 支持: <aop:aspectj-autoproxy />

定义通知:
package com.ffyc.springpro.common;

import com.alibaba.druid.support.json.JSONUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component  /*spring扫描*/

//用来定义一个 切面(Aspect)
@Aspect
public class CommonUtil {
    /*通知,向连接点添加的功能*/

    /*@Before  前置通知 在业务方法执行之前调用执行  */
    /*@After   后置通知 在业务方法执行之后调用执行  即使业务代码出现异常,也会执行  但后面的方法不会执行*/
    /*@AfterReturning  返回通知 在业务方法执行之后调用执行  当业务代码有异常  不会执行 */
    /*@AfterThrowing  异常通知 在业务方法出现异常时执行 */



    //@Before("execution(* com.ffyc.springpro.dao.AdminDao.*(..))")
    //@After("execution(* com.ffyc.springpro.dao.AdminDao.*(..))")

/*    @AfterReturning("execution(* com.ffyc.springpro.dao.AdminDao.*(..))")
    public  void commit(){
        System.out.println("提交事务");
    }*/

    //@AfterThrowing(value = "execution(* com.ffyc.springpro.dao.AdminDao.*(..))",throwing = "throwable")
    public void exception(Throwable throwable){
        System.out.println("系挺忙"+throwable.getMessage());
        throwable.getStackTrace();
    }

    public  void printLog(){
        System.out.println("打印日志");
    }

    /*
    @Around  环绕通知  可以在业务方法执行之前,之后,出现异常时添加功能

    ProceedingJoinPoint joinPoint表示的是目标方法
    */

    @Around(value = "execution(* com.ffyc.springpro.dao.AdminDao.*(..))")
    public void aroud(ProceedingJoinPoint joinPoint){
        System.out.println("前置通知");
        try {
            Object[] objects = joinPoint.getArgs(); //获取到我们目标方法的参数
            System.out.println(Arrays.toString(objects));
            Object object = joinPoint.proceed();  //调用目标业务方法
            System.out.println("返回通知");
        } catch (Throwable e) {
            e.printStackTrace();
            System.out.println("异常通知");
        }
        System.out.println("后置通知");
    }
}

八.Spring 事物管理

1.数据库事务管理

        数据库事务管理就是对一次数据库操作过程中执行的多条语句进行管理,保证一次对数据库操作过程中多条 sql 要么都执行成功,要么都不执行,从而确保数据一致性。
        我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操作数据的并不可靠,需要在这种情况下进行回退
        事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态,这些操作要么都完成,要么都取消,从而保证数据满足一致性的要求

2.spring 事务管理

        Spring 事务管理就是 spring 框架针对程序中提交事务这部分非业务代码进行分离管理,减轻程序员负担.在程序执行没有问题时,提交事务,出现问题时,回滚事务.
Spring 中的事务管理分为两种形式:  一种是 编程式事务 ,一种是 声明式事务 .
        编程式事务在项目中很少使用,这种方式需要在我们代码中需要提交事务或回滚事务时自己写代码实现.
        声明式事务管理建立在 AOP 基础上,本质是对方法前后进行拦截,所以声明式事务是 方法 级别的。

基于注解实现的 spring 事务管理

Spring 框架,提供事物管理实现类是 DataSourceTransactionManager .
步骤:
(1)配置事物管理器
<!-- 配置 spring 事务管理器-->
< bean id ="transactionManager"
class ="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
< property name ="dataSource" ref ="dataSource" ></ property >
</ bean >
(2)注解方式
<!-- 开启注解事务管理 -->
< tx :annotation-driven transaction-manager ="transactionManager" />
在类或方法上使用 @Transactional 标签即可实现事务管理,通常不在dao包下使用,而在Service包下使用,在Service包下处理事务。
**明式事务不生效的场景
(1)@Transactional 应用在非 public 修饰的方法上         

(2)异常被 catch 捕获导致失效

(3)出现编译期异常

出现异常时,可以使用@Transactional(rollbackFor = Exception.class),表示的是回滚事务,要么全部执行成功,要么全部不执行。

(4)数据库引擎不支持事务

        mysql目前只有InnoDB引擎支持事务

今天的分享就到这里,如有错误,还望私信指出,制作不易,看完记得一键三连哦!!!


原文地址:https://blog.csdn.net/2303_77640525/article/details/142145554

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!