Spring是一个开放源代码的JavaEE设计层面框架,解决了业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用,它的核心是IOC控制反转和AOP面向切面编程。
七大模块:core、aop、orm、dao、web、context、web mvc。
IOC
控制反转,面向对象的设计原则,用来降低代码之间的耦合度。它有一种Bean对象容器,帮我们创建、管理、装配对象,即bean管理。
原理:xml解析、工厂模式、反射
提供IOC容器的接口:BeanFactory、ApplicationContext(加载配置文件时创建对象)。
ApplicationContext接口实现类:FileSystemXmlApplicationContext、ClassPathXmlApplicationContext。
实现IOC的方法:依赖注入。
bean管理:创建对象、注入属性(装配)。
bean管理的两种方式:xml配置、注解。
两种Bean:普通bean、工厂bean。
bean的作用域:singleton单例(默认)、prototype原型、request、session、application。
1 2 3
| <bean id="user" class="com.xx.xxx.user" scope="propotype">
</bean>
|
Bean的生命周期:
1 2 3 4 5
| 1.执行无参构造创建bean 2.调用set方法设置属性值 3.执行初始化方法(postProcess) 4.获取bean实例 5.调用销毁方法销毁
|
xml配置创建对象
配置文件中配置bean。
<bean id="user" class="com.xx.xxx.user" name="别名">
id:唯一标识
class:全类名
默认通过无参构造创建对象。
有参构造创建:1)通过对象构造器参数下标 2)通过参数名 3)通过参数类型
1 2 3 4 5 6 7
| <bean id="user" class="com.xx.xxx.user"> <constructor-arg index="0" value="xx"> <constructor-arg name="xx" value="xx"> <constructor-arg type="int" value="xx"> </bean>
|
xml配置注入属性
1)set方法。
2)配置文件中配置属性注入。
属性注入方式:property标签 、collection集合、p命名空间 、c命名空间。
(1)property配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| <bean id="user" class="com.xx.xxx.user" name="别名"> <property name="xxx" value="xxx"/> <property name="xxx"> <null/> </property> <property name="xxx"> <value><![CDATA[<<年龄>>]]></value> </property> <property name="xxx" ref="xxx"/> <property name="xxx"> <bean id="dept" class="com.xx.xx.Dept"> <property name="dname" value="xx"></property> </bean> </property>
<property name="xxx"> <array> <value>1</value> <value>2</value> </array> </property> <property name="xxx"> <map> <entry key="x" value="x"></entry> </map> </property> <property name="xxx"> <list> <value>1</value> <value>2</value> </list> </property> </bean>
|
测试获取bean对象:
1 2
| ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); xxx x = (xxx)context.getBean("xxx");
|
(2)p命名空间注入
1 2 3 4 5 6 7 8 9
| <?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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="com.xx.xx.user" p:name="xx" p:age="12"/> </beans>
|
(3)c命名空间注入
1 2 3 4 5 6 7 8 9 10
| <?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:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="com.xx.xx.user" c:name="xx" c:age="12"/> </beans>
|
(4)公共集合属性提取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?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:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd"> <util:list id="booklist"> <value>xxx</value> </util:util> <bean id="book" class="com.xx.xx.book"> <property name="list" ref="booklist"></property> </beans> </beans>
|
自动装配
spring根据属性名称和属性类型自动将bean的属性值注入。
byName:默认,在容器中寻找set方法中对应的Beand的id,id唯一。
byType:寻找和自己属性类型相同的对象,class唯一。
1 2 3 4
| <bean id="pet" class="com.xx.xx.pet"/> <bean id="people" class="com.xx.xxx.user" autowire="byName"> </bean>
|
引入外部属性文件
引入数据库连接池配置
1、引入依赖
2、配置context命名空间
1 2 3 4 5 6 7 8
| <?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
|
3、引入外部文件jdbc.properties
1
| <context:property-placeholder location="classpath:jdbc.properties"/>
|
4、配置连接池
1 2 3 4 5 6
| <bean id="dbs" class="com.alibaba.druid.pool.DruidDataSource" autowire="byName"> <property name="driverClassName" value="${prop.driverClass}"></property> <property name="url" value="${prop.url}"></property> <property name="username" value="${prop.userName}"></property> <property name="password" value="${prop.password}"></property> </bean>
|
注解创建对象
bean管理中使用注解创建对象,在要放入spring容器的对象上加上@Component
注解,按照mvc架构,它的衍生注解有@Repository
、@Service
、@Controller
,属性值设置使用@Value
(相当于property配置)。
1)引入aop依赖。
2)添加context命名空间,开启注解扫描。
1 2 3 4 5 6 7 8 9 10
| <?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 https://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.xxx"/> </beans>
|
3)在类上添加相关的bean注解,@Component(value="xx")
默认beanid为类名,首字母小写。value值设置beanid。
其他注解:
@Nullable
,在方法上表示返回值可以为空;用在方法的参数上表示参数可空;用在属性上表示属性可为空。
@Scope
: 设置作用域。@Scope(“singleton”):单例模式。
@Configuration
: 代表这是一个配置类,就像我们之前看的beans.xml。配合@Bean使用将实体类注册,本质是一个@Component
。
@Bean
: 注册一个bean,就相当于我们之前写的一个bean标签;这个方法的名字,就相当于bean标签中的id属性;这个方法的返回值,就相当于bean标签中的class属性。
@Import
: @Import(XXX.class)可以引入其他配置类,使其合并为一个总配置类,使用时通过AnnotationConfig上下文来获取总配置类即可。
@Data
: Lombok中的注解,放在实体类上会自己创建set和get方法,toString方法等。
自定义扫描哪些注解:
1 2 3
| <context:component-scan base-package="com.xxx" use-default-filter="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"></context> </context:component-scan>
|
注解注入属性
常用注解:Autowired、Qualifier、Resource、Value(普通类型注入)。
1)添加context命名约束
2)开启注解配置
1 2
| <context:component-scan base-package="com.xxx"/> <context:annotation-config/>
|
3)添加@Autowired
,根据属性类型实现自动装配
通过属性名称完成属性装配,使用@Qualifier(value="xxx")
注解指定bean对象。@Resource
注解也可以完成自动装配,通过beanid和class类型寻找匹配,名称注入通过name。@Value
注解对基本数据类型进行注入。
@Autowired与@Resource的不同
1)来源不同
@Autowired
是Spring定义的注解,而@Resource
是JSR-250定义的注解。
2)参数不同
@Autowired
只包含一个参数:required,表示是否开启自动准入,默认是true。而@Resource
包含七个参数,其中最重要的两个参数是:name 和 type。@Autowired
如果要使用byName,需要使用@Qualifier
一起配合。而@Resource
如果指定了name,则用byName自动装配,如果指定了type,则用byType自动装配。
3)使用不同
@Autowired
能够用在:构造器、方法、参数、成员变量和注解上,而@Resource
能用在:类、成员变量和方法上。
4)装配顺序
@Autowired
默认按byType自动装配,而@Resource
默认byName自动装配。
@Value使用
1)配置文件中配置
1 2
| server.port=8081 date=2023-06-03 21:08:20
|
2)在其他类型上添加注解
1 2 3 4 5 6 7 8 9
| @Value("三国") private String bookName;
@Value("23.00") private Double price;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Value("${date}") private Date date;
|
参考文章:SpringBoot使用@Value注入属性值
完全注解开发
Config配置类代替xml文件实现自动装配,实际使用springboot也能完成类似操作。
1 2 3
| import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.ComponentScan
|
在一个类上加上注解@Configuration
代表这是一个配置类,配置类中加上@ComponentScan
注解,扫描要注入的bean对象包,替代xml配置文件。
1
| ApplicationContext context = new AnnotationConfigApplicationContext(config.class);
|
AOP
面向切面编程,通过预编译方式和动态代理实现程序功能统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
动态代理分为两大类:基于接口的动态代理,基于类的动态代理
- 基于接口 : JDK动态代理
- 基于类 : cglib
- 通过反射实现
专业术语:
横切关注点:跨越应用程序多个模块的方法和功能,如日志、安全、缓存、事务。
切面aspect:增强的过程,被模块化的特殊对象,它是一个类。
通知advice:需要增强的代码逻辑部分。
切入点pointcut:实际增强的方法,必须定义。
连接点jointpoint:可增强的方法。
目标target:被通知的对象。
代理proxy:向目标对象通知后创建的对象。
使用AOP需要导入一个依赖包 :
1 2 3 4 5 6
| <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency>
|
方式一 : 通过JDK接口实现
创建UserService接口和实现类UserServiceImpl,创建实现类的代理对象,并实现aop切入实现,注意导入约束。
通过Proxy的newProxyInstance方法创建代理对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import java.lang.reflect.Proxy; import java.lang.reflect.Method; import java.lang.reflect.InvocationHandler;
public class MyProxy{ public static void main(String[] args){ Class[] interfaces = {UserService.class}; UserSerivce us = (UserService)Proxy.newProxyInstance(MyProxy.class.getClassLoader(),interfaces,new InvocationHandler(){ @Override public Object invoke(Object proxy,Method method, Object[] args) throws Throwable{ return null; } }) } }
|
方式二 : 通过AspectJ实现AOP
AspectJ是一个独立的AOP框架,结合spring实现aop操作。需要引入aop、aspectj、cglib、aopalliance依赖。
切入点表达式:
execution([权限修饰符] [返回类型] [全类名] [方法名] ([参数列表]))
例:expression="execution(* com.xxx.xx.UserServiceImpl.*(..))
(1)xml方式实现:
1)创建类及其增强类(代理对象类)
2)添加aop命名空间
3)xml中配置切入点
定义类:
1 2 3 4 5
| public class book { public void buy(){ System.out.println("---buy-----"); } }
|
定义增强类:
1 2 3 4 5 6 7 8
| public class Proxy { public void before(){ System.out.println("----方法执行前------"); } public void after(){ System.out.println("----方法执行后------"); } }
|
4)在Spring配置中增强(切入)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <bean id="book" class="com.xx.config.book"/> <bean id="Proxy" class="com.xx.config.Proxy"/>
<aop:config> <aop:pointcut id="P" expression="execution(* com.xx.config.book.buy(..))"/>
<aop:aspect ref="Proxy"> <aop:before pointcut-ref="p" method="before"/> <aop:after pointcut-ref="p" method="after"/> </aop:aspect> </aop:config>
|
(2)注解方式实现:
@Aspect
注解表示该类为为增强类或代理对象类。
1)创建类及其增强类(代理对象类)
2)添加aop命名空间
3)开启注解扫描和生成代理对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?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" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <context:component-scan base-package="com.xxx"/> <bean id="annotationProxy" class="com.xxx.config.AnnotationProxy"/>
<aop:aspectj-autoproxy/> </beans>
|
aop:aspectj-autoproxy有一个proxy-target-class属性,默认为false,默认使用jdk动态代理。当为true,表示使用CGLib动态代理。不过即使proxy-target-class设置为false,如果目标类没有声明接口,则spring将自动使用CGLib动态代理。
注:@EnableAspectJAutoProxy
注解可以实现代理对象生成,效果一样。
4)使用注解创建类及增强类的对象
使用注解配置不同类型的advice通知(增强逻辑)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| @Aspect public class AnnotationProxy{ @Before( "execution(* com.x.service.UserServiceImpl.*(..))") public void before(){ System.out.println("------方法执行前------"); } @After( "execution(* com.x.service.UserServiceImpl.*(..))") public void after(){ System.out.println("-----方法执行后-------"); } @Around( "execution(* com.x.service.UserServiceImpl.*(..))") public void around(ProceedingJoinPoint jp) throws Throwable { System.out.println("环绕前"); System.out.println("签名:"+jp.getSignature()); //执行目标方法proceed Object proceed = jp.proceed(); System.out.println("环绕后"); System.out.println(proceed); } }
|
五种advice通知(增强)类型:
@Before
前置通知。
@Around
环绕通知
@After
最终通知
@AfterRetuning
后置通知
@AfterThrowing
异常通知
1 2 3 4 5 6
| 环绕之前... before... 目标方法执行... 环绕之后... after... afterReturning...
|
提取公共切入点:定义一个方法,添加注解@Pointcut(value="切入点表达式")
,在advice注解设置value值为方法名()。当有多个增强类对同一切入点增强,使用@Order()
注解设置增强类优先级。
JdbcTemplate
它是spring对jdbc的封装。
1)导入mysql、druid、jdbc、tx、orm依赖包。
2)配置数据库连接池
在引入外部文件中已经配置过。
3)配置JdbcTemplate对象
1 2 3
| <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean>
|
4)开启注解扫描,在dao层注入jdbcTemplate对象
Spring事务管理
Spring在不同的事务管理API之上定义了一个抽象层,使得开发人员不必了解底层的事务管理器API。Spring的声明事务管理底层原理使用aop。
Spring支持编程式事务管理和声明式的事务管理。声明式的事务管理有两种实现方式:注解和xml配置。
注解方式
1)使用Spring管理事务,导入tx事务依赖,命名空间导入 : tx。
1 2 3 4 5 6 7 8 9 10 11 12 13
| <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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
|
2)创建事务管理器
1 2 3
| <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
|
3)开启事务注解
1 2
| <tx:annotation-driven transaction-manager = "transactionManager"/>
|
4)在service类上添加事务注解
@Transactional
,添加在类上,类中方法开启事务。spring定义了7种事务传播行为。
xml方式
1)配置事务管理器
2)配置事务通知
1 2 3 4 5 6 7 8 9 10 11 12
| <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add" propagation="REQUIRED"/> <tx:method name="delete" propagation="REQUIRED"/> <tx:method name="update" propagation="REQUIRED"/> <tx:method name="search*" propagation="REQUIRED"/> <tx:method name="get" read-only="true"/> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
|
3)配置aop,切入点、切面
1 2 3 4 5 6 7
| <aop:config> <aop:pointcut id="txPointcut" expression="execution(* com.x.dao.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/> </aop:config>
|
完全注解开发
使用@Configuration
、@ComponentScan
、@EnableTransactionManager
、@Bean
注解完成事务。创建数据库连接池,事务管理器,jdbcTemplate。
整合Mybatis
编写实体类
1 2 3 4 5
| public class User { private int id; private String name; private String pwd; }
|
编写mybatis-config核心配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?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="com.x.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <package name="com.x.dao"/> </mappers> </configuration>
|
编写UserDao接口
1 2 3
| public interface UserMapper { public List<User> selectUser(); }
|
编写接口对应的Mapper映射文件
1 2 3 4 5 6
| <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xxx.dao.UserMapper"> <select id="selectUser" resultType="User"> select * from user </select> </mapper>
|
导入spring-webmvc、spring-jdbc、mybatis、mybatis-spring、mysql-connector-java、aspectjweaver包。
配置Maven静态资源过滤问题:
1 2 3 4 5 6 7 8 9 10 11 12
| <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
|
Mybatis-Spring
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
在 MyBatis-Spring 中,可使用SqlSessionFactoryBean来创建 SqlSessionFactory。要配置这个工厂 bean,只需要把下面代码放在 Spring 的 XML 配置文件中:
1 2 3
| <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean>
|
实现一
引入Spring配置文件beans.xml
1 2 3
| <?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"> </beans>
|
配置数据源替换mybatis数据源
1 2 3 4 5 6 7
| <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean>
|
配置SqlSessionFactory,关联Mybatis
1 2 3 4 5 6 7
| <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="mapperLocations" value="classpath:com/kuang/dao/*.xml"/> </bean>
|
注册sqlSessionTemplate,关联sqlSessionFactory
1 2 3 4 5
| <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean>
|
增加Dao接口的实现类;私有化sqlSessionTemplate
1 2 3 4 5 6 7 8 9 10 11
| public class UserDaoImpl implements UserMapper { //sqlSession不用我们自己创建了,Spring来管理 private SqlSessionTemplate sqlSession; public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } public List<User> selectUser() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.selectUser(); } }
|
注册bean实现
1 2 3
| <bean id="userDao" class="com.x.dao.UserDaoImpl"> <property name="sqlSession" ref="sqlSession"/> </bean>
|
当前Mybatis配置文件内容:
1 2 3 4 5 6 7
| <?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="com.x.pojo"/> </typeAliases> </configuration>
|
测试
1 2 3 4 5 6 7
| @Test public void test2(){ ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); UserMapper mapper = (UserMapper) context.getBean("userDao"); List<User> user = mapper.selectUser(); System.out.println(user); }
|
实现二
dao继承Support类 , 直接利用 getSqlSession() 获得 , 然后直接注入SqlSessionFactory . 比起方式一 , 不需要管理SqlSessionTemplate , 而且对事务的支持更加友好。
将UserDaoImpl修改一下
1 2 3 4 5
| public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper { public List<User> selectUser() { UserMapper mapper = getSqlSession().getMapper(UserMapper.class); return mapper.selectUser(); }}
|
修改bean的配置
1 2 3
| <bean id="userDao" class="com.xx.dao.UserDaoImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
|
WebFlux函数式编程
spring5的新功能,类似springMVC,用于web开发,流行的异步非阻塞的响应式编程框架,基于Reactor的api实现。