Spring

Spring

Spring是一款轻量级的非侵入式的IOC和AOP的一站式的java开发框架,为简化企业级应用开发而生

轻量级:Spring框架使用的jar包很小,运行时占用的资源少,效率高

非侵入式的:业务代码不需要实现或继承Spring框架中的类或接口

IOC: Inversion of Control,控制反转

AOP:面向切面

一站式框架:提供核心功能,主要是IOC,创建管理对象,

提供面向切面编程,增强程序扩展

对数据访问层进行了封装(重点在于事务管理)

对web层进行封装,使得请求更加便捷

Spring可以用来管理对象,可以把Spring认为是一个容器。

Spring Bean管理

1.基于xml的配置方式:

scope默认值是singleton(单例的),在整个应用程序中只创建一个对象,在Spring框架启动时就创建成功

prototype(原型的),每次获取时创建一个对象,可以创建多个

<bean id="admin"  name="admin2" class="com.ffyc.spring.model.Admin"  scope="prototype">
        <property name="id" value="10"></property>
        <constructor-arg name="account" value="100"></constructor-arg>
    </bean>
2.Xml 配置方式依赖注入

Spring在创建对象(控制反转)时,还需要为我们的对象属性进行初始化赋值,这个过程被称为依赖注入

赋值的方式有两种:

1.属性赋值 get set方法

2.构造方法赋值

依赖注入的实现:

1.开启注解扫描

<context:component-scan base-package="包名"> </context:component-scan>

2.创建注解对象

在需要创建对象的类上加注解,可以实现创建对象的功能

创建对象的注解有 @Component 、@Service、@Repository

@Compoent注解在model包中的类上使用

@Service注解在service包中的类上使用

@Repository注解在数据访问层中的类上使用

@Scope(value=“prototype”)

3.注入属性

注入属性使用@Autowired注解,它可以实现自动注入,是Spring提供的

@Autowired注解有两种方式来查找对象:

1.byType 去Spring容器中根据类型查找,@Autowired注解默认使用byType

2.byName 通过名称查找 需要结合@Qualifier(value=“adminDao”)来使用

@Autowired
AdminDao adminDao;

JDK 注解@Resource 自动注入

JDK 中的@Resource 注解,也可以实现自动注入

1.byType 去Spring容器中根据类型查找,@Resource

2.byName 通过名称查找 @Resource(name=“adminDao”)

Spring JDBC

Spring自身也提供了控制层的SpringMVC和持久层的Spring jdbcTemplate

Spring框架中JDBC的功能:jdbc的封装、ioc的实际应用

搭建流程

1.导入依赖

导入jdbc、mysql、阿里巴巴提供的数据源组件

        <!-- 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>
      <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>

数据源组件:封装了连接数据库,数据连接池功能。

常用的数据库连接池组件:dbcp、c3p0

2.导入属性文件

 <!-- 加载config.properties文件 -->
<context:property-placeholder location="config.properties"/>

spring统一管理数据库连接对象

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${classDrvierName}"></property>
        <property name="url" value="${url}"></property>
        <property name="username" value="${uname}"></property>
        <property name="password" value="${pwd}"></property>
        <property name="initialSize" value="10"></property>
        <property name="minIdle" value="5"></property>
        <property name="maxActive" value="20"></property>
    </bean>

3.在配置文件中创建 JdbcTemplate

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

AOP

AOP的全称是Aspect Oriented Programming,意思为面向切面编程,AOP是一种编程技巧,不是用来代替OOP的,AOP是OOP的延续,AOP可以把业务代码和非业务代码隔离起来,降低了各个部分的耦合度,提高了程序的复用性,提高了开发效率

原理:AOP将程序中的非业务代码(日志功能、提交事务、统一异常处理)提取出来,通过创建代理对象来对非业务代码进行调用。在不修改原来代码的情况下,为程序添加额外功能。

核心原理:动态代理

AOP思想不是spring框架独有的,只是spring框架引入了这一思想

基本概念:

连接点:类中可以被增强的方法,被称为连接点

切入点:类中实际被增强的方法,横切面切入的方法

通知:提取非业务的功能被称为通知,指一个切面在特定连接点要做的事

通知分为5种:前置通知 、后置通知、异常通知、最终通知、环绕通知

切面:把通知添加到切入点的整个过程被称为切面

目标:代理的目标对象(连接点,切入点所在的类)

代理对象:向目标对象时创建的代理对象

Spring AOP的实现

Spring中引入了AspectJ来实现AOP

AspectJ是一个基于AOP的java语言框架,它提供了强大的AOP功能,且实现方式更为便捷,而且还支持注解式开发

实现流程:

1.导入依赖

<!--AspectJ  -->
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

2.实现AspectJ

基于xml配置方式实现

<bean id="myuntil" class="com.ffyc.spring.until.MyUntil"></bean>
    <aop:config>
        <!--创建切入点-->
        <aop:pointcut id="saveAdmin" expression="execution(* com.ffyc.spring.dao.AdminDao.save(..))"/>
        <!--将通知和切入点进行配置,生成的代理对象就会调用-->
        <aop:aspect ref="myuntil">
            <aop:before method="commit" pointcut-ref="saveAdmin" ></aop:before>
            <aop:after method="commit" pointcut-ref="saveAdmin"></aop:after>
            <aop:after-returning method="commit" pointcut-ref="saveAdmin"></aop:after-returning>
            <aop:after-throwing method="exception" pointcut-ref="saveAdmin" throwing="e"></aop:after-throwing>
            <aop:around method="aroundAdvice" pointcut-ref="saveAdmin"></aop:around>
        </aop:aspect>
    </aop:config>

基于注解方式的实现

1)在xml中开启AspectJ

<aop:aspectj-autoproxy />

2)定义通知

@Component//让Srping生成对象
@Aspect//表明装有通知的类-切面
public class MyUntil {
    //最终通知
    @After("execution(* com.ffyc.spring.dao.AdminDao.save(..))")
    public void commit(){
        System.out.println("提交事务");
    }
    //异常通知
    @AfterThrowing( value = "execution(* com.ffyc.spring.dao.AdminDao.save(..))",throwing = "e")
    public void exception(Throwable e){
        System.out.println("异常"+e.getMessage());
    }
    //环绕通知
    @Around("execution(* com.ffyc.spring.dao.AdminDao.save(..))")
    public  void aroundAdvice(ProceedingJoinPoint point){
        try {
            System.out.println("前置通知");
            point.proceed();
            System.out.println("后置通知");
        }catch (Throwable e){
            e.printStackTrace();
            System.out.println("异常通知"+e.getMessage());
        }
        System.out.println("最终通知");
    }
}

Spring 事物管理

数据库事务:事务可以看做是由对数据库若干操作组成的一个单元,一个事务就是一个执行单元,一个单元中可以包含多个sql

事务管理是数据库为了保证数据在运行过程中的准确性

关系型数据库事务的基本特征:

1.原子性:一次操作中的多条sql,要么都执行,要么都不执行

2.隔离性

3.持久性

4.一致性

Spring框架里面提供事务管理功能:Spring框架帮我们把提交事务的功能管理起来,封装好了

Srping中的事务管理有两种:编程式事务管理、声明式事务管理

编程式事务管理

在代码中自己写的 实际中开发中使用的少

声明式事务管理

声明式事务管理使用注解标签实现,底层实现原理是AOP的思想,是方法级别的,在执行某个方法时,为方法添加额外的事务管理功能

Spring 声明式事物管理方式有两种: 基于 xml 配置 、基于注解实现

基于注解实现

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

3.在service中添加注解标签,添加注解

@Transactional
public void save(Admin admin){
          //逻辑处理
          adminDao.saveAdmin(admin);
     }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序J

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值