一.spring是什么

spring是一个框架,整合了多种技术.
spring的特点是IOC(控制反转),AOP(面向切面编程)

1.IOC和AOP两个思想简要理解

IOC:让程序自己动态创建对象,创建对象权利是程序而不是程序员
AOP:在不改变原有代码的情况下,实现插入代码(添加功能)

2.maven导入spring

  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.9</version>
  </dependency>

二.IOC在spring中的实现

1.创建对象通过描述(xml或注解)获得

spring中可以实现通过xml文件或者注解提供的信息创建对象,并存放在IOC容器中

2.如何通过描述创建对象---依赖注入

问题是spring如何通过信息完成对象创建,涉及两方面取信息和处理信息

  • 处理信息涉及spring的内部实现,暂且不表
  • 取信息:若是xml文件实现信息,就应该让其按照特定的格式放置信息,取名为依赖注入
    依赖注入:依赖实体类的set方法和构造器,进行注入
    依赖注入的方式:创建bean对象,对其进行属性注入或者构造器注入,同时也能修改其
    作用域(单例还是多例)

3.第一个IOC容器中对象的创建

  • 1.编写hello实体类
  public class Hello {
    private String str;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    @Override
    public String toString() {
        return "Hello{" +
                "str='" + str + '\'' +
                '}';
    }
}
  • 2.导入相关jar包,创建bean.xml文件
  • 3.编写bean文件,在beans标签下添加bean标签,同时对此类进行信息注入来创建对象
<?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
       http://www.springframework.org/schema/context/spring-context4.0.xsd">
<!--   使用spring来创建对象,spring中都称对象标签为bean-->
<!--   xml文件中想要给出创建对象的信息,必须按照格式进行信息填入-->
        <bean id="hello" class="com.cs.pojo.Hello">
            <property name="str" value="Spring"/>
        </bean>
<!--
        ref:引用Spring容器中创建好的对象
        value:对对象属性赋的值
-->
</beans>

  • 4.创建测试类来测试对象是否生成
    //spring通过beans.xml文件获得了创建对象的信息,然后创建对象放入context容器中
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    //通过context能够取到对象
    Hello hello = (Hello)context.getBean("hello");

3.bean的自动装配

通过在bean后面添加autowire=byName/byType修饰能够实现bean的自动装配
也可以通过使用注解进行bean的自动装配,在xml文件中打开使用注解(context:annotation-config),在编写实体类时添加相关注解(不仅仅是@autowire,还能是@Componet实现不写bean也能注入创建对象)即可

三.AOP在spring中的实现

1.aop的底层---代理模式

通过一个代理类让真实类执行的业务变单一纯粹,体现分工明确

  • 实现组成:事件,实体,代理类(实体只专注与事件,代理类不仅帮助完成事件还能添加各种功能,能够让实体完成的事件更加完备)
  • 代码实现,Proxy,InvocationHandler,具体应用举例:JDK,cglib

2.Aspect Oriented Prgramming(面向切面编程)

通过aop的原理可以知道,aop可以在不影响原本代码实现的情况下添加代码在程序中

  • 1).使用AOP思路
    导入对应的jar包
    创建你要切入的对象(注解,自定义类,springAPI)
    通过配置文件将切入对象(切面)放到切入点上
    当执行代码时切入点的切面的通知会被执行
  • 2).AOP实现的代码结合程序复习

四.spring与mybatis结合

1.将数据源放入ioc容器中

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

2.将sqlsessionFactory,sqlsession放入ioc容器中

<!--    sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
<!--        绑定mybatis配置文件-->
        <property name="configLocation" value="classpath:mybatisConfig.xml"/>
        <property name="mapperLocations" value="classpath:com/cs/mapper/UserMapper.xml"/>
     </bean>

<!--    sqlSession-->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--        使用构造器注入sqlSessionFactory 因为没有set方法-->
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>

<bean id="userMapper2" class="com.cs.mapper.UserMapperImpl2">
    </bean>

3.建立实体类和对应的dao(mapper)完成CRUD任务

@Data
public class User {
    private int id;
    private String name;
    private String pwd;
}
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{
    @Override
    public List<User> selectUser() {
        SqlSession sqlSession = getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.selectUser();
        return users;
    }
}

额外:spring中事务的处理

通过aop思想实现事务的四大特性ACID

<!--    创建开启事务的对象-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <constructor-arg ref="dataSource"/>
    </bean>
<!--    结合AOP实现事务的植入-->
<!--    配置事务的类-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--        给那些事件添加事务-->
        <tx:attributes>
            <tx:method name="add"/>
            <tx:method name="delete"/>
            <tx:method name="update"/>
        </tx:attributes>
    </tx:advice>
<!--    配置事务的切入点-->
    <aop:config>
        <aop:pointcut id="txPointCut" expression="execution(* com.cs.mapper.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
    </aop:config>