spring

spring

spring是一站式轻量级开源框架,以IoC(Inverse of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程为内核)

在resources文件中创建bean.xml文件

基础的bean.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>bean内容写在这</bean>
</beans>

创建Bean的三种方式

Bean元素:使用该元素描述需要spring容器管理的对象 ​

class属性:被管理对象的完整类名. ​

name属性:给被管理的对象起个名字.获得对象时根据该名称获得对象.

​ id属性: 与name属性作用相同.

方式一:使用默认构造函数创建

方式二:使用 工厂普通方法 创建对象

先创建工厂对象 然后调用普通方法:创建user 对象

方式三: 使用 工厂的静态方法 创建对象     

静态方法:类名.方法名

bean的作用范围和生命周期

bean的作用域

        作用域scope属性
          singleton:单例的(默认值) 在整个容器的生命周期内,容器只创建一个对象
           启动时创建对象
           lazy-init:懒加载:容器启动不创建对象,在第一次使用对象时创建对象
                    懒加载只对单例有效
            prototype:多例的   每次通过容器获取的时候,都会创建一个新的对象
              需要时创建对象

生命周期属性 


     配置一个方法作为生命周期初始化方法. spring会在对象创建之后立即调用. init-method
     配置一个方法作为生命周期的销毁方法. spring容器在关闭并销毁所有容器中的对象之前调用. destory-method

        

spring的依赖注入

构造函数注入

使用的标签:constructor-arg
    标签出现的位置:bean标签的内部
    
    标签中的属性:
        type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
        index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
        name:用于指定给构造函数中指定名称的参数赋值                                     
    
        value:用于提供基本类型和String类型的数据
        ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象

set方法注入

涉及的标签:property
    出现的位置:bean标签的内部
    
    标签的属性:
        name:用于指定注入时所调用的set方法名称
        value:用于提供基本类型和String类型的数据
        ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象

复杂类型的注入/集合类型的注入

  用于给List结构集合注入的标签:
  list array set
  用于个Map结构集合注入的标签:
  map   properies

注解方法注入

需要在bean.xml中添加context约束

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd
              http://www.springframework.org/schema/context
             https://www.springframework.org/schema/context/spring-context.xsd">

<!--  注解方法注入 -->
    <context:component-scan base-package="com.yh"></context:component-scan>

</beans>

用于创建对象的
    他们的作用就和在XML配置文件中编写一个<bean>标签实现的功能是一样的
        Component:用于把当前类对象存入spring容器中
        value属性:用于指定bean的id。当我们不写时,它的默认值是当前类名,且首字母改小写。
        
        Controller:一般用在表现层 
        Service:一般用在业务层
        Repository:一般用在持久层
        以上三个注解的作用和属性与Component相同,是spring框架为我们提供明确的三层使用的注解

用于注入数据的
    他们的作用就和在xml配置文件中的bean标签中写一个<property>标签的作用是一样的
    Autowired:自动按照类型注入
    Qualifier:在按照类中注入的基础之上再按照名称注入,value属性:用于指定注入bean的id
    Resource:直接按照bean的id注入。它可以独立使用,name属性:用于指定bean的id

注意:以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现,另外,集合类型的注入只能通过XML来实现

    Value:用于注入基本类型和String类型的数据

spring的jdbcTemplate

jdbc.properties配置文件

jdbc.username = root
jdbc.password= root
jdbc.url = jdbc:mysql:///数据库名
jdbc.driverClassName = com.mysql.cj.jdbc.Driver  

pom.xml配置依赖

1.mysql-connector-java    mysql依赖

2.lombok   快捷JavaBean依赖

3.druid    连接池依赖

4.spring-context

5.spring-jdbc   spring的jdbcTemplate依赖

6.junit 单元测试依赖

applicationContext.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

        <!-- 引入jdbc.properties配置文件 -->
        <context:property-placeholder location="classpath:jdbc.properties"/>

        <!-- 配置druid数据库连接池 -->
        <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
                <property name="url" value="${jdbc.url}"></property>
                <property name="driverClassName" value="${jdbc.driverClassName}"></property>
        </bean>

        <!-- 配置spring的jdbcTemplate-->
        <bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
                <property name="dataSource" ref="dataSource"></property>
        </bean>

</beans>

Spring中的注解

@Configuration ​

作用:指定当前类是一个配置类 ​

细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。

@ComponentScan

作用:用于通过注解指定spring在创建容器时要扫描的包

属性:value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。 等同于xml中: <context:component-scan base-package="com.it"/>

@PropertySource 作用:用于指定properties文件的位置 属性:value:指定文件的名称和路径。 关键字:classpath,表示类路径下

等同于xml中: <context:property-placeholder location="classpath:jdbc.properties"/>

@Bean ​ 作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中 ​ 属性:name:用于指定bean的id。当不写时,默认值是当前方法的名称 ​ 细节:当我们使用注解配置方法时,如果方法有参数,在参数前加:@Qualifier("@Bean注解中name的值"),spring框架会去容器中查找有没有可用的bean对象查找的方式和Autowired注解的作用是一样的。

@Import ​ 作用:用于导入其他的配置类 ​ 属性:value:用于指定其他配置类的字节码。 ​ 当我们使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类

等同于xml中: <import resource="xxx.xml"></import>

Spring中的AOP

AOP Aspect Oriented Programing 面向切面编程

aop的底层是动态代理,代理的底层是反射

AOP底层原理:就是代理机制 动态代理: ​ 特点:字节码随用随创建,随用随加载 ​ 作用:不修改源码的基础上对方法增强 分类: ​ 基于接口的动态代理 ​ 基于子类的动态代理

Spring的AOP代理: ​ JDK动态代理:被代理对象必须要实现接口,才能产生代理对象.如果没有接口将不能使用动态代理技术。 ​ CGLib动态代理:第三方代理技术,cglib代理.可以对任何类生成代理.代理的原理是对目标对象进行继承代理. 如果目标对象被final修饰.那么该类无法被cglib代理.

结论:Spring框架,如果类实现了接口,就使用JDK的动态代理生成代理对象,如果这个类没有实现任何接口,使用CGLIB生成代理对象

AOP的术语: ​

Joinpoint(连接点):所谓连接点是指那些被拦截到的点

Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义. ​

Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.

五大通知

前置通知(before):目标方法运行之前调用

后置通知(after-returning):在目标方法运行之后调用 (如果出现异常不会调用)

环绕通知(around):在目标方法之前和之后都调用(ProceedingJoinPoint对象 -->> 调用proceed方法)

异常拦截通知(after-throwing):如果出现异常,就会调用

最终通知(after):在目标方法运行之后调用 (无论是否出现 异常都会调用)

Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field. ​ Target(目标对象):代理的目标对象 ​

Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程,spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入 ​

Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类

​ Aspect(切面): 是切入点和通知(引介)的结合

AOP注解方式下配置applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.springframework.org/schema/beans" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:aop="http://www.springframework.org/schema/aop" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.2.xsd 
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd ">

<!-- 准备工作: 导入aop(约束)命名空间 -->
    <!-- 1.配置目标对象 -->
    <bean name="userService" class="com.it.service.UserServiceImpl" ></bean>
    <!-- 2.配置通知对象 -->
    <bean name="myAdvice" class="com.it.annotation_aop.MyAdvice" ></bean>
    <!-- 3.开启使用注解完成织入 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>

Spring中的事务

事务:是逻辑上一组操作,要么全都成功,要么全都失败.

事务特性:ACID

原子性:事务不可分割

一致性:事务执行的前后,数据完整性保持一致.

隔离性:一个事务执行的时候,不应该受到其他事务的打扰

持久性:一旦结束,数据就永久的保存到数据库.

脏读:一个事务读到另一个事务未提交数据

不可重复读:一个事务读到另一个事务已经提交数据(update)导致一个事务多次查询结果不一致 虚读:一个事务读到另一个事务已经提交数据(insert)导致一个事务多次查询结果不一致

事务的隔离级别:

未提交读:以上情况都有可能发生。

已提交读:避免脏读,但不可重复读,虚读是有可能发生。

可重复读:避免脏读,不可重复读,但是虚读有可能发生。

串行的:避免以上所有情况.

Sping中事务的传播行为

PROPAGATION_REQUIRED: 支持当前事务,如果不存在 就新建一个

PROPAGATION_SUPPORTS: 支持当前事务,如果不存在,就不使用事务

PROPAGATION_MANDATORY:支持当前事务,如果不存在,抛出异常

PROPAGATION_REQUIRES_NEW:如果有事务存在,挂起当前事务,创建一个新的事务

PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务

PROPAGATION_NEVER:以非事务方式运行,如果有事务存在,抛出异常

PROPAGATION_NESTED:如果当前事务存在,则嵌套事务执行

Spring的事务管理分成两类

编程式事务管理: ​ 手动编写代码完成事务管理.

声明式事务管理: 不需要手动编写代码,配置.

开启spring对注解事务的支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值