一.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&useSSL=false&useUnicode=true&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>