简介:Spring是一款轻量级,非入侵式框架,它的前身是interface21,Spring支持事务的处理,支持几乎市面上所有的框架整合,最核心的两个点是控制反转(IOC)和面向切面编程(AOP)!
什么是控制反转?
简单来说,控制反转是一种设计思想,没有使用它之前,对象的创建与对象之间的依赖完全编码在程序之中,对象的创建是由程序来控制的,而使用控制反转之后,则将这个过程交给了第三方(用户等...),很大程度上解耦,在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入(DI)。
spring所需的jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.6</version>
</dependency>
使用注解需要在bean中导入context约束
<context:annotation-config />
扫描指定包,这个包下的注解就会生效
<context:component-scan base-package="xxx" />
注解说明
@Autowired 标注在类中的成员变量或方法上,完成的是bean的注入,方式默认ByType,如果类型找不到再通过ByName
如果不能唯一自动装配上属性,需要配合@Qualifier(value = "xxx")
@Nullable 打上这个注解,则该字段可以为null
@Resource 自动装配通过名字,类型,可以说是@Autowired和@Qualifier的集合体
@Component 组件,将被标注的类注册到Spring容器中,将类的实例化交给Spring管理,完成的是bean的注册,实例化对象名默认为类名的小写
衍生出来的有 @Repository @Service @Controller,作用等同于@Component,只是为了符合SpringMVC的架构,分别用于Dao,Service,Controller层
@Configuration 代表这是一个配置类,就和之前看到的beans.xml一样,表示会生成bean并注册到Spring容器中,交给Spring托管
两种使用方法:1.在配置类中定义一个方法,并使用@Bean注解声明
2.在实体类上使用@Component注解,并在配置类上使用@ComponentScan("实体类的包或路径名"),这样会自动扫描@Component并生成Bean
最后在使用时,使用AnnotationConfigApplicationContext来获取上下文对象
注意:第一种方法bean的名字是方法名,第二种方法bean名字为小写的实体类名
@Bean 注册一个bean,相当于写的bean标签,id=方法名,class=返回值
@Value("xxx") 注入属性,等价于 <-property name="xxx" value="xxx"-/>
动态代理模板
反射
调用指定的方法:首先ClassForName实例化对象,然后找到指定的方法,以及传入参数的属性,最后使用invoke调用方法
若要更改私有属性的值,可以设置setAccessible(true)
调用Class对象的newInstance()方法时,类必须要有一个无参构造器
AOP
概述:通过预编译的方式和动态代理实现程序运行期间的统一维护,是OOP(面向对象)的一种延续,即在不影响原程序的情况下,对业务进行增强
环境:需要在spring中导入对应的jar包,使用时导入aop的相关配置
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"
实现方式1:Spring的API接口
实现方式2:自定义实现
实现方式3:注解实现
Spring中整合Mybatis
所需的jar包
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
</dependencies>
mybatis原始使用方式
mybatis核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<package name="pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC"/>
<property name="username" value="xxx"/>
<property name="password" value="xxx"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="Mapper/UserMapper.xml" />
</mappers>
</configuration>
实体类和接口
1.编写数据库对应的实体类;
2.编写实现所需功能的接口以及它对应的mapper.xml配置文件
3.自己写好的mapper.xml配置文件在核心配置文件中注册
过滤设置
若注册绑定xml之后IDEA依旧提示有绑定异常,可以在pom.xml中加入过滤设置
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
整合到spring中
1.编写数据源配置
可以在资源文件中建立一个总的applicationContext.xml文件,spring-dao.xml中专注数据库的处理以及sqlSession的创建,总的xml文件中专注bean的处理,最后import导入即可
<?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">
<!--datasource:使用spring的数据源替换mybatis的配置-->
<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?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC" />
<property name="username" value="root"/>
<property name="password" value="Gyh!1027"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource" />
<!--绑定Mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="mapperLocations" value="classpath:Mapper/*.xml" />
</bean>
<!--SqlSessionTemplate:就是我们使用的sqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
</beans>
2.sqlSessionFactory
3.sqlSessionTemplate
4.需要给接口加一个实现类
一定要使用set方法来手动注入
public class UserMapperImpl implements UserMapper {
//原来的所有操作都使用sqlSession来完成,现在使用SqlSessionTemplate
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public List<User> selectUser() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.selectUser();
}
}
5.将自己写的实现类注入到spring的配置文件中
<?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">
<import resource="spring-dao.xml"/>
<bean id="usermapper" class="Mapper.UserMapperImpl">
<property name="sqlSession" ref="sqlSession" />
</bean>
</beans>
6.测试使用
public class MyTest {
@Test
public void test() throws IOException {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper mapper = context.getBean("usermapper", UserMapper.class);
List<User> userList = mapper.selectUser();
for (User user:userList){
System.out.println(user);
}
}
}
声明式事务(在Spring中配合AOP使用)
<bean id="transactionManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource"/>
</bean>
<!--结合AOP实现事务的置入-->
<tx:advice id="txadvice" transaction-manager="transactionManger">
<tx:attributes>
<!--给哪些方法配置事务-->
<!--propagation:事务的传播特性,默认为REQUIRED,支持当前事务,若没有则新建一个-->
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--配置AOP-->
<aop:config>
<aop:pointcut id="txPointCut" expression="execution(* Mapper.*.*(..))"/>
<aop:advisor advice-ref="txadvice" pointcut-ref="txPointCut"/>
</aop:config>